函数重载
函数重载
在 C 语言中,编译时会对函数名添加前缀,如func会变为_func,这也是为什么 C 语言不支持重载的原因,所以 C 语言通过函数名直接来对函数进行区分
1 | void func_i(int a) {} |
C++提供函数重载的概念:在 C++中可以为两个或两个以上的函数提供相同的函数名称,只要参数类型不同或参数类型相同但参数个数不同,称为函数重载
1 | void func(int a) { |
1 | func with int: 10 |
- 如果两个函数的参数的顺序不同,也认为属于函数的重载
1 | void print(int a, double b) { |
当仅有返回类型不同因为具有二义性,因从被认为是重定义,不作为函数重载
参数表的比较过程与参数名无关
若两个函数仅为缺省实参不同,则第二个声明被认为是第一个的重复声明
1 | void func(int a,int b = 10){} |
typedf 名为现有的数据类型提供了一个替换名,并没有创建一个新类型,因此如果两个函数参数表的区别只在一个用了 typedef,另一个为 typedef 相应的类型,则被视为相同的参数列表
当形参类型有 const 或 volatile 修饰,若形参按值传递方式定义,则在识别函数声明是否相同时不考虑 const 或 volatile 修饰符,若以指针或引用定义时则需要考虑
1 | //按值传递方式定义 |
print(12);中 12 为字面量,const int& a 为”万能引用”,既可以引用左值,又能引用右值,可以引用常量,变量,字面量
函数重载解析步骤如下:
- 确定函数调用考虑的函数重载的集合,确定函数调用实参表的属性
- 从重载函数集合中选择函数,该函数可以在(给出实参个数和类型)的情况下可以调用函数
- 选择与调用最匹配的函数
为什么 C++可以进行函数重载,详见下一篇文章:名字粉碎(名字修饰)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 山川不念旧!
评论





