函数重载的原理

函数重载是什么?

配合视频看效果更好哟 点击此看视频

在相同作用域中的多个函数,具有相同的名字而形参表不同。

编译器会根据调用参数的不一样来选择函数。

这个也叫做编译时的多态

重载函数是函数的一种特殊情况,为方便使用,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 可以查看原来的函数名称

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值