• C++函数重载详解


    函数重载的引入原因

    在C语言中,函数名是唯一的,这样就导致具有类似功能的函数用了不同的名字,并且相同功能的函数因为数据类型的不同需要写好几种,比如下面的例子:

    image-20221020140729878

    所以为了解决这种问题,C++中引入了函数重载的概念。

    函数重载的用法

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

    参数类型不同

    image-20221020141116111

    参数个数不同

    image-20221020141318449

    参数顺序(类型)不同

    image-20221020141526509

    并且以上这三种情况可以叠加。

    c++支持函数重载的原理——名字修饰

    为什么C无法支持函数重载而C++就支持呢?

    在C/C++中,程序的运行需要经历:预处理、编译、汇编、链接。

    对于每个源文件都需要进行以上操作,而在经历完汇编之后每个源文件内部都会生成一个符号表,符号表中的符号和源文件中的变量名、函数名是一一对应的(并不是说一模一样,而是一种映射关系)。在这里我们要知道一点,函数声明在符号表中是只记录符号而不记录地址的,只有函数定义才记录符号以及地址,所以我们想要调用函数的定义,就必须将每个文件链接起来,揉合符号表(将多个符号表合成一个),这样才能从声明找到定义。

    但是在C语言中符号表中的符号和函数名是一模一样的,如果我们在C语言中写多个同名函数,这就导致了符号表中会存在多个同名符号,但这样就无法保证一一对应的映射关系了。所以C语言不支持函数重载。

    截屏2022-10-20 14.52.34

    而在C++中,符号表中的符号和源文件中的名字是不一样的,符号表中的符号添加了一些修饰规则(根据参数),所以就导致相同的函数名因为不同的参数列表,从而在符号表中的符号也不同,这样就解决了C语言不能一一对应的问题,这就是函数重载的原理。

    截屏2022-10-20 15.00.37

    返回类型为什么不能作为函数重载的依据?

    函数的作用:将有效的输入值变换为唯一的输出值,同一输入总是对应同一输出。

    如果返回类型支持函数重载的话,那么我们输入相同的数据,编译器将采用哪个重载函数呢?这会导致输入相同的数据,但是输出不同的答案,这很显然违背世界对函数的定义。

    所以返回类型不能作为函数重载的依据。

  • 相关阅读:
    数据采集实战:如何自动化运营微博?
    【CSS】背景样式(颜色、图片、平铺、附着和位置)
    SonarLint(代码质量检测工具+案例+好习惯养成器)
    CentOS 7.9 安装 epel-release
    Spring Security基于jwt实现权限校验
    MediaSoup简介
    Delphi : 在 SDK 管理器中添加其他 iOS 框架
    天地图WMTS地图瓦片下载
    使用Latex输入藏文字符
    QT工程编译过程学习
  • 原文地址:https://blog.csdn.net/qq_67569905/article/details/127427950