文档章节

c++中的函数重载

青灯夜
 青灯夜
发布于 2015/09/01 22:10
字数 758
阅读 31
收藏 0

c++中的函数重载

  • 什么是函数重载
    重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,这组函数被称为重载函数。

  • 函数重载的作用
    重载函数常用来实现功能类似而所处理的数据类型不同的问题,能减少函数名的数量,提高程序的可读性。

  • 重载函数的构成说明
    定义一个类,添加一系列函数名相同的函数,但参数形式各有不同,测试一下能否构成重载。

#include <iostream>
using namespace std;

class Base
{
    public:
        void func(int a){cout << "this is "<< a <<endl;}
        void func(string a){cout << "this is " << a <<endl;}    
        void func(int a,int b){cout << "this is "<< a <<endl;}
        void func(int a,string b){cout << "this is "<< a <<endl;}


        //错误的重载1
        int  func(int a,int b){cout << "this is "<< a <<endl;}  
        //错误的重载2
        void  func(const int a,int b){cout << "this is "<< a <<endl;}
        //错误的重载3
        void func(int b,int a){cout << "this is "<< a <<endl;}          
};

int main()
{
    Base b;
    b.func(22);
    b.func("test");

    return 0;
}                                                        

  以上程序执行编译会报错:

‘void Base::func(int)’ cannot be overloaded ...

  即函数不能构成重载,原因分别为:

  • 返回值不同,不能构成函数重载。
    对应错误1:想想也是,执行函数调用时,只知道传入的参数,是无法预知要返回什么类型的值的,所以自然不知道该调用哪一个函数。

  • 形参是const修饰的常值不能构成函数重载。
    对应错误2:说明编译时二者对应的符号是一致的。
    参数是int a和 int & a 不能构成重载;

注意,如果形参是引用或指针是可以构成重载的。即下面的情况:

class Base
{
    public:
        void func(int &a){cout << "this is "<< a <<endl;}
        void func(const int &a){cout << "this is "<< a <<endl;}
}
  • 参数类型相同,只是命名不同,不能构成重载。
class Base
{
    public:
        void func(int a){cout << "this is "<< a <<endl;}
        void func(int b){cout << "this is "<< b <<endl;}
}
  • 备注

  重载是允许有多个同名的函数,这些函数的参数列表不同,即参数个数不同,或者类型不同,或者两者都不同。编译器会根据这些函数的不同列表,将同名的函数的名称做修饰,从而生成一些不同名称的预处理函数,来实现同名函数调用时的重载。

  函数重载是c++比较重要的概念,涉及比较偏门的使用场景,比如参数有const修饰,就会引来比较蛋疼的疑惑,这里整理的还不够充分,后期将逐步进行整理和完善。

版权声明:本文为csdn博主[applebite](http://blog.csdn.net/applebite) 原创文章,转载请注明出处,侵权必究。 微信添加公众号:qi_chuang 或 猎奇创新平台

© 著作权归作者所有

青灯夜
粉丝 2
博文 35
码字总数 21708
作品 0
朝阳
程序员
私信 提问
C++中的NULL和nullptr的区别

C的NULL 在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码: 实际上在C语言中,NULL通常被定义为如下: 也就是说NULL实际上是一个void 的指针,然后吧void 指针赋值给int 和foo...

dukeke
2018/01/08
0
0
SWIG入门5: C/C++初级特性3

1 函数重载 函数重载这个特性是C++对于C的一个最重要的扩充属性了。对于C语言来说,不可能有两个SYMBOL的名字是相同的,但C++语言为了实现函数重载的这个特性,讲函数的SYMBOL名改成了 ‘函数...

costaxu
2012/08/26
625
0
extern "C" _declspec (dllexport)和_declspec (dllexport)的分别

extern "C "只是表示这个可以被C语言调用,除了这个之外,没有什么更多含义。 因为C语言的编译器和C++的不同,C++的会有个叫做函数名打散的机制,比如函数:int add(int a,int b)在C++里面...

付品军
2010/01/19
3.6K
0
C++基础教程之C/C++区别

C/C++基础教程之C/C++区别 这是C++教程得第一步,后续会持续更新哦!欢迎新手(具有C基础),老鸟可绕道,可指导。 C++标准输入和输出 C++标准输入和输出分别是cin和cout,用法非常简单 cin>>n...

这个人很懒什么都没留下
2018/09/01
0
0
C++基础教程之string详情

string 初始化 首先,为了在程序中使用string类型,必须包含头文件 。如: #include 注意:这里不是string.h,string.h是C字符串头文件。 string类是一个模板类,位于名字空间std中,还需要加:...

这个人很懒什么都没留下
2018/09/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
4
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
9
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
8
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
7
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
8
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部