1.函数重载的概念
函数重载: 是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题
图例:
2.c++函数重载背后的原理
上面我们对函数重载有了一个基本的概念,这就引出了另一个问题,我们以前在学习C语言的时候,函数是不能重名的,编译器过不了,会报错,但是c++为什么就可以呢?这就要去探讨编译链接的过程了.
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接.
- 在实际的项目中通常是由多个头文件和多个源文件构成,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?
- 所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。
- 那么链接时,面对Add函数,链接接器会使用哪个名字去找呢?这里要涉及到函数名修饰规则。每个编译器都会有自己的函数名修饰规则.
- Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂,所以下面我们使用g++演示这个经过修饰后的名字。
- 通过下面我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度
+函数名+类型首字母】。
- 采用C语言编译器编译后结果
总结: 在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。
- 采用C++编译器编译后结果
结论:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参
数类型信息添加到修改后的名字中。
- Windows下名字修饰规则
对比Linux会发现,windows下vs编译器对函数名字修饰规则相对复杂难懂,但都是相似的.
扩展:C/C++的调用约定有对vs下函数名修饰规则讲解\
通过以上就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修
饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
如果两个函数函数名和参数是一样的,返回值不同能否构成重载呢?
返回值不同是不构成重载的,因为调用时编译器没办法区分。
以上就是本篇的所有内容啦!关于c++中的函数重载聪明的你一定已经看会了吧,我们下篇文章再见!