【C++语法】C++重载

认识重载

C++的出现就是为了给C语言填坑的,C++大佬们把C语言做的不够好的地方和认为不合理的地方都进行了改进或增加了一些新的东西。在C语言中,函数是不允许重名的。开发C++的大佬呢就觉得很不合理,例如一个交换函数swap,要交换不同类型的值,swap就只能叫做swap1或者swap2。为了不这么麻烦,大佬就在C++里新增了叫函数重载的概念。

重载最简单的理解就是函数可以同名使用,编译器根据传参类型,判断应该调用哪个函数。就用swap举例,当传参时是两个int类型的实参,编译器就会去找有没有两个形参为int类型的swap函数,同理其他类型也是一样。

在这里插入图片描述

重载规则

◆函数形参部分至少有一个类型不相同的参数才能构成重载
◆函数形参个数和顺序不能相同(不是参数名,而是参数类型顺序不能相同
◆函数重载与函数名和返回类型无关
在这里插入图片描述在这里插入图片描述在这里插入图片描述

重载原理

那么C++是如何支持重载的?为什么C语言不支持重载?

如果了解编译,会知道编译其实就是将代码翻译成机器指令的一个过程。这个过程大概分为4个过程:
1.预处理:头文件展开、宏替换、去掉注释、条件编译
2.编译:检查语法、转换成汇编代码
3.汇编:将汇编代码转换为机器指令
4.链接:链接库、找调用函数定义的地址,链接合并到一起

编译器在进行编译和汇编时会生成一个东西叫符号表,符号表记录了函数的定义和函数地址的映射,也就是会去记录函数的函数名和函数的地址。当进行到链接时编译器会通过符号表去找函数名来链接函数的对应地址
这也是为什么C语言不支持重载而C++可以重载的重要原因,为了更好演示,我将使用Linux来进行观察C语言和C++对相同代码的函数,在汇编指令下的命名处理:
在这里插入图片描述
首先我已经准备好了两份.c和.cpp的文件,因为C++是兼用c语言的,所以两份代码是完全相同的,但是因为C语言重载报错,先将重载屏蔽掉。我们主要是观察两份代码的汇编指令对函数名的处理。
在这里插入图片描述在这里插入图片描述

先将C语言文件编译成汇编指令:
在这里插入图片描述
可以看到,c语言调用func函数使用的函数名还是原来的名称。
在这里插入图片描述
为了不冲突,先将C语言的汇编指令文件删除,重新对cpp生成一份汇编指令文件。
在这里插入图片描述
观察Cpp的汇编指令,发现func不叫func了它改名字了,当然我也不知道g++的命名规则,func被改成了_Z4funcid这个名字,不管前面的Z4是什么,起码我知道id是什么,i就代表了int,d代表的是double,也就是我们func函数的两个参数类型的首字母缩写。
在这里插入图片描述
ok,现在我们将重载放出来,单独对cpp进行编译。观察两个重载的命名规则:
在这里插入图片描述

总结

为什么c语言不支持函数重载,就是因为c语言在将代码转换成汇编代码时,用的是原来的名字,而两个同名的函数却分配了不同的地址。当函数调用时编译器会通过找函数名链接函数的对应地址,因为有两份同名的函数,C语言的编译器分不清到底是要调用哪一个函数,也就分不清需要调用哪一个地址。
而C++是如何解决这个问题的?C语言因为使用了原来的函数名作为符号表链接的名称,导致没有办法重载。C++就干脆直接不用原来的名称了,重新对汇编的函数进行特殊的处理,这样在找符号名称时就不会产生冲突。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值