函数重载是什么?
配合视频看效果更好哟 点击此看视频
在相同作用域中的多个函数,具有相同的名字而形参表不同。。
编译器会根据调用参数的不一样来选择函数。
这个也叫做编译时的多态。
重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。
先看一个demo
#include<iostream>
using namespace std;
void func(int a){
cout << "func1" << endl;
}
void func(int a, int b){
cout << "func2" << endl;
}
int main(){
func(1);
func(1,2);
system("pause");
return 0;
}
我们发现可以调用到不同的函数。
那么是怎么做到的呢? 编译器帮我们做了什么事情呢?
我们先来看一个函数的情况下,函数名在目标文件发生了什么变化
func.cpp
#include<iostream>
using namespace std;
void func(int a){
cout << "func1" << endl;
}
int main(){
func(1);
system("pause");
return 0;
}
命令行输入 cmd
D:\StudyProject\test>g++ -c func.cpp -o func.o
//objdump是反汇编的命令
D:\StudyProject\test>objdump -t func.o
我们修改下函数名字长度,看看发生了什么变化?
#include<iostream>
using namespace std;
void function(int a){
cout << "func1" << endl;
}
int main(){
function(1);
system("pause");
return 0;
}
发现目标文件中的函数符号变了。
接下来我们看函数重载的情况下,是什么样子?
func1.cpp
#include<iostream>
using namespace std;
void func(int a){
cout << "func1" << endl;
}
void func(int a, int b){
cout << "func3" << endl;
}
int main(){
func(1);
func(1,2);
system("pause");
return 0;
}
D:\StudyProject\test>gcc -c func1.cpp -o func1.o
D:\StudyProject\test>objdump -t func1.o
C++函数重载底层实现原理是C++利用name mangling(倾轧)技术,来改名函数名,区分参数不同的同名函数。
编译器通过函数名和其参数类型识别重载函数。为了保证类型安全的连接(type-safe linkage),编译器用参数个数和参数类型对每一个函数标识符进行专门编码,这个过程有时称为“名字改编”(name mangling)或“名字修饰”(name decoration)。类型安全的连接使得程序能够调用合适的重载函数并保证了参数传递的一致性。编译器能够检测到并报告连接错误。
补充
c++filt
可以查看原来的函数名称