概述
认识重载
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++就干脆直接不用原来的名称了,重新对汇编的函数进行特殊的处理,这样在找符号名称时就不会产生冲突。
最后
以上就是舒心机器猫为你收集整理的【C++语法】C++重载的全部内容,希望文章能够帮你解决【C++语法】C++重载所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复