函数重载:
1.函数名相同
2.函数参数个数不同,参数顺序不同,参数类型不同
注意:
1.函数重载与返回值类型无关。
2.调用函数时,实参的隐式类型转换可能产生二义性
//编译器可能重命名为 display_void
void display(long a){
cout<<a<<endl;
}
//编译器可能重命名为 display_double
void display(double a){
}
//报错,隐式类型转换不知转换成long还是double类型
display(10);
为什么c++能重载函数:
- c++实用了一种 name mangling的技术
- c++编译器会对函数名进行修改、修饰
-
重载时会生成多个不同的函数名,不同编译器有不同生成规则
汇编
用vscode汇编查看,可以看到每个display的函数地址是不同的,说明每个display都被重新命名并是独立不同的函数,而vscode把每个函译为display只是为了方便程序员查看调用了哪个函数。
tips:
c++编译的debug模式和release模式,后者会对代码进行优化。
debug模式中:
release模式:
release
该模式不会在调用display函数,而是直接用cout函数替换display函数。执行更高效。
用IDA(反汇编软件)打开release禁止优化后的程序。可以证实name mangling的存在。
image.png
网友评论