码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++函数重载详解


    文章目录

    • 函数重载的引入原因
    • 函数重载的用法
      • 参数类型不同
      • 参数个数不同
      • 参数顺序(类型)不同
    • 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

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

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

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

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

  • 相关阅读:
    Linux系统下祼机安装mysql8.0和docker mysql 8.0 性能差异对比~
    C++加持让python程序插上翅膀——利用pybind11进行c++和python联合编程示例
    【RPC】动态代理及源码分析
    Spring Filter 学习
    腾讯云88,阿里云99,现在都这么卷了吗?!
    MySQL数据库开发设计规范总结
    【JVM技术专题】针对于Java类加载器系统研究指南 「入门篇」
    10快速入门Query函数使用的Pandas的查询示例
    食用油5G智能工厂数字孪生可视化平台,推进食品制造业数字化转型
    vCenter7 Lifecycle Manager 批量升级vCenter下所有的或单独一台esxi 7
  • 原文地址:https://blog.csdn.net/qq_67569905/article/details/127427950
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号