函数重载的概念:
是函数的一种特殊情况,C++允许在同一作用域声明几个功能类似的同名函数,这些同名函数的形参(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不同的问题.
int Add(int left, int right){
return left+right;
}
double Add(double left, double right){
return left+rght;
}
long Add(long left, long right){
return left+right;
}
int main(){
Add(10,20);
Add(10.0,20.0);
Add(10L,20L);
return 0;
}
编译器根据我们传递实参的类型和个数推断出想要调用的哪个Add函数.
注意:main不能被重载,因为程序的入口只有一个.
名字修饰
一个程序运行起来需要经过一下几个阶段:预处理,编译,汇编,链接 .
Name Mangling是一种在编译过程中,将函数,变量的名称重新改变的机制,(简单的说就是编译器为了区分各个函数,将函数的名称通过某种算法,重新修饰为一个全局唯一的名称.)
C语言的名字修饰非常简单,只需要在名字前面加上下划线.
1,C语言为什么不支持函数重载?
因为C语言只是在函数名前加了下划线,不能区分功能类似的同名函数.
2,C++中函数重载底层是怎么处理的?
函数名被修饰为一个比较复杂的名字,包括:函数的名字以及参数类型,修饰的名字由"?“开头,接着是函数名,由@结尾的函数名;后面跟着由@结尾的类名"C"和名称空间"N”,再一个"@“表示函数的名称空间结束;第一个"A"表示函数调用类型为”_cdecl",接着是函数的参数类型及返回值,由"@"结束,最后"Z"结尾.这样编译器和链接器就可以区分同名但不同参数类型或名字空间的函数,而不会导致link的时候函数多重定义.
3,C++中能否将一个函数按照C风格来编译?
两个函数名相同,参数类型 不同的可以在C++中编译,但是放在C语言中不能实现.