C++入门篇---(2)函数重载

1.函数重载的概念

函数重载:                                                                                                                                                 是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题

图例:
C++入门篇---(2)函数重载_第1张图片


2.c++函数重载背后的原理        

        上面我们对函数重载有了一个基本的概念,这就引出了另一个问题,我们以前在学习C语言的时候,函数是不能重名的,编译器过不了,会报错,但是c++为什么就可以呢?这就要去探讨编译链接的过程了.

在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接.
C++入门篇---(2)函数重载_第2张图片

C++入门篇---(2)函数重载_第3张图片

  1. 在实际的项目中通常是由多个头文件和多个源文件构成,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?
  2. 所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。
  3. 那么链接时,面对Add函数,链接接器会使用哪个名字去找呢?这里要涉及到函数名修饰规则。每个编译器都会有自己的函数名修饰规则.
  4. Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂,所以下面我们使用g++演示这个经过修饰后的名字。
  5. 通过下面我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度
    +函数名+类型首字母】。
  • 采用C语言编译器编译后结果
    C++入门篇---(2)函数重载_第4张图片

总结: 在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。

  • 采用C++编译器编译后结果C++入门篇---(2)函数重载_第5张图片

结论:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参
数类型信息添加到修改后的名字中。

  • Windows下名字修饰规则
    C++入门篇---(2)函数重载_第6张图片

        对比Linux会发现,windows下vs编译器对函数名字修饰规则相对复杂难懂,但都是相似的.

扩展:C/C++的调用约定有对vs下函数名修饰规则讲解\


        通过以上就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修
饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

        
如果两个函数函数名和参数是一样的,返回值不同能否构成重载呢?

     返回值不同是不构成重载的,因为调用时编译器没办法区分。
 

以上就是本篇的所有内容啦!关于c++中的函数重载聪明的你一定已经看会了吧,我们下篇文章再见!

你可能感兴趣的:(C++,c++,开发语言)