在C语言中,函数的生成规则和函数名称相关,即只要函数名称相同,就算函数的返回值类型不同,函数的形参不同,最终生成的函数的符号都相同,例如:
int Sum(int a,int b)
{
return a+b;
}
double Sum(double a,double b)
{
return a+b;
}
上述这两个函数最终生成的函数符号都是_Sum,所以最终程序运行时会报错。
而在C++中,函数的生成规则和函数的整体相关,即最终生成的函数符号和函数的返回值+函数名+函数的形参列表有关。
例如:
int Sum(int a,int b)
{
return a+b;
}
生成的函数符号为 ?Sum@@YAHHH@Z,其中YA代表函数的调用约定,这里是指__cdecl:调用约定(函数调用约定,是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数。函数的调用约定就是描述参数是怎么传递和由谁平衡堆栈的,当然还有返回值)。第一个H代表函数的返回值类型为int,后两个H代表函数的两个形参的类型为int,@Z代表有形参,Z代表无形参。
调用约定中:
- int -> H
- void -> X
- char -> D
- float -> M
- double -> N
- short -> F
- bool ->_N
- 普通类型指针 -> PA
- 常指针类型 -> PB
double Sum(double a,double b)
{
return a+b;
}
生成的函数符号为 ?Sum@@YANNN@Z,其中YA代表函数的调用约定,这里是指__cdecl:调用约定。第一个N代表函数的返回值类型为double,后两个N代表函数的两个形参的类型为double,接着以@Z结尾。
但有一点需要注意,当出现下面这种情况时,并不能出现函数重载
int Sum(int a,int b)
{
return a+b;
}
double Sum(int a,int b)
{
return a+b;
}
此时如果我们在主函数中调用Sum函数,则会报错,因为此时系统不知道该调用哪一个Sum函数,产生了二义性。因此我们可以得到函数重载的三要素:
- 同名
- 不同参数
- 同一作用域