<一>函数重载
先来介绍一下函数重载是什么。函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。
int Add(int x1, int x2){
return x1 + x2;
}
//参数数量不同
int Add(int x1, int x2, int x3){
return x1 + x2 + x3;
}
//参数类型不同
double Add(double x1, double x2){
return x1 + x2;
}
//参数顺序不同
void fun(int x, char y){
printf("fun(int x, char y)");
}
void fun(char x, char y){
printf("fun(char x, char y)");
}
int main(){
printf("%d", Add(2, 3));
printf("%d", Add(2, 3, 4));
printf("%lf", Add(2.0, 3.0));
fun(1, 'a');
fun('a', 1);
return 0;
}
注意:
- 函数重载可以给缺省值。但是要注意 fun(全缺省) 和 fun(无参) 这种虽然也叫函数重载但是无参调用的时候会造成二义性的问题。建议不要这样写。
- 在c++中的输入(cin)输出(cout)能够自动识别类型 ,其实底层运用的函数重载的问题。
<二>函数重载的原理
我们有时候会想为什么c++支持函数重载,而c语言却不支持函数重载(在C语言中函数名不可以是相同的)。
这里先给大家拓展一下一个程序要运行起来需要经理的阶段。一般需要四个阶段:预处理,编译,汇编,链接。
没个阶段主要做什么我就不详细讲解了 ,建议自己去查一下,网上有很多的文章。
这里不一样c和c++不一样的一点就是函数名的修饰规则(name mangling)不一样。
在c语言中函数的修饰规则就是函数名,用函数名来唯一决定确定一个函数
在c++中会把参数也修饰进函数的修饰规则,
这里我们一g++和gcc为例,vs下函数的修饰规则太复杂了 。
在g++中
?在gcc中
?可以看到c++,在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参 数类型信息添加到修改后的名字中。通过函数修 饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
而c语言不会只有函数名没有参数的相关信息。自然不能支持函数重载。
- 注意:
- 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办 法区分。
- 返回值不同是函数重载的原因是:调用的地方可以指定函数的参数,但是却无法指定函数的返回值。不支持重载的原因是调用的时候存在二义性,无法区分。
|