【C++】4. 重载函数

news2024/11/15 5:07:50

文章目录

  • 前言
  • 一、函数重载
    • 1.1 重载的条件
    • 1.2 函数名修饰


前言

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”


一、函数重载

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

int Add(int x, int y) {
	return x + y;
}
float Add(double x, double y) {
	return x + y;
}
int main(void) {
	cout << Add(3, 4) << endl;
	cout << Add(1.5, 1.6) << endl;

	return 0;
}

编译器可以通过Add的实参类型来调用对应的Add函数。


1.1 重载的条件

同名函数的参数个数/顺序/类型

  1. 类型
int Add(int x, int y) {
	return x + y;
}

int Add(double x, double y) {
	return x + y;
}
  1. 顺序
int Add(int x, char y) {
	return x + y;
}

int Add(char x, int y) {
	return x + y;
}
  1. 个数
int Add(int x, int y) {
	return x + y;
}

int Add(int x, int y, int z) {
	return x + y + z;
}

易错点:

  1. 顺序不同指的是类型顺序,而不是标识符的顺序,如下
    在这里插入图片描述

  2. 结合缺省参数,下面的内容能构成重载,但调用时可能出错。系统不知道fun()该调用那个函数
    在这里插入图片描述
    那如果这样写呢?则连函数重载都不构成。
    在这里插入图片描述

  3. 函数重载与返回值无关,返回值的类型不会影响函数重载。
    在这里插入图片描述


下面我们来解释为什么c++能支持函数重载。

1.2 函数名修饰

c语言不支持函数重载,是因为它区分函数仅仅通过你取的函数名。C++支持函数重载,是因为它会将你取的函数名进行修饰,比如你取的函数名Add,它处理时会将Add变为Addii。那它是按照什么规则来对函数名进行修饰呢?下面我们来进行讲解。

在此之前我们需要用到一些编译链接的知识。
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接
在这里插入图片描述
举例如下,链接过程,链接器看到test.o调用Add,但是没有Add的地址,就会到function.o的符
号表中找Add的地址,然后链接到一起。. 那么链接时,面对Add函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则
在这里插入图片描述


我们看看VS2022下的函数名修饰:将上面的function.cpp文件删除,则Add的定义没有了,此时test.cpp声明了Add,那么之后链接时将找不到Add定义。如下:
在这里插入图片描述
不知道是出于什么理由,VS2022的函数名修饰规则很麻烦,没有Linux下的gcc/g++编译器的函数修饰名规则简单。所以下面我们看看Linux下gcc/g++编译器的函数名修饰规则。

gcc/g++的函数名修饰规则如下:

  1. gcc 编译器编译的c语言代码:可以看出在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。
    在这里插入图片描述
  2. g++编译器编译的c++代码:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。
    修饰后的名字:_Z + 函数名的长度+函数名 + 参数(int 为 i, double 为 d)
    所以:int Add(int a, int b) 对应 _Z + 3 + Add + i + i 与函数返回值的类型无关
    在这里插入图片描述

Windows下名字修饰规则
在这里插入图片描述


为什么函数名修饰不加上函数返回值?
答:即使函数名修饰规则加上函数返回值,结果依然错误。
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双目三维测距(python)

文章目录 1. 双目检测1.1 调用相机1.2 分割画面 2. 双目标定2.1 相机标定2.2 获取参数 3. 双目测距3.1 立体校正3.1.1 校正目的3.1.2 校正方法3.1.2 相关代码 3.2 立体匹配和视差计算3.3 深度计算3.4 注意事项 4. 完整代码 代码打包下载&#xff1a; 链接1&#xff1a;https://…

Spring MVC 的调用(12)

目录 SpringMVC流程 源码分析 第一步:用户发起请求到前端控制器&#xff08;DispatcherServlet&#xff09; 第二步&#xff1a;前端控制器请求处理器映射器&#xff08;HandlerMappering&#xff09;去查找处理器&#xff08;Handle&#xff09;&#xff1a;通过xml配置或者…

LeetCode:28. 找出字符串中第一个匹配项的下标 ——【1、理解 KMP 算法】

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 目录一、&#x1f331;[28. 找出字符串中第一个匹配项的下标](https://leetcode.cn/proble…

synchronized 的 monitor 机制

synchronized 的 monitor 机制 前言 本文基于 jdk 8 编写。author JellyfishMIX - github / blog.jellyfishmix.comLICENSE GPL-2.0 monitor monitor 是 synchronized 中用以实现线程之间的互斥与协作的主要手段&#xff0c;它可以看成是对象或者 class 持有的锁。每一个对象…

十六、市场活动:查看市场活动明细(一)

功能需求 点击市场活动名称链接,跳转到明细页面,查看市场活动明细 -市场活动的基本信息 -市场活动下所有的备注信息 功能分析 流程图 代码实现 一、ActivityMapper 1.ActivityMapper接口 /*** 点击名称&#xff0c;查看市场详细*/Activity selectActivityForDetailById(Stri…

相量的加减乘除计算

相量的加减乘除计算 矢量是物理学中的术语&#xff0c;是指具有大小&#xff08;magnitude&#xff09;和方向的量。如速度、加速度、力等等就是这样的量。向量是数学中的术语&#xff0c;也称为欧几里得向量、几何向量、矢量。与向量对应的量叫做数量&#xff0c;在物理学中称…

二叉树基础概念

1.二叉树种类 1.1 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为 0 0 0 的结点和度为 2 2 2 的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 如图所示&#xff1a; 这棵二叉树为满二叉树&#xff0c;也可以说深度为 k k k&…

自动驾驶企业面临哪些数据安全挑战?

近期&#xff0c;“特斯拉员工被曝私下分享用户隐私”不可避免地成了新闻热点&#xff0c;据说连马斯克也不能幸免。 据相关媒体报道&#xff0c;9名前特斯拉员工爆料在2019年至2022年期间&#xff0c;特斯拉员工通过内部消息系统私下分享了一些车主车载摄像头记录的隐私视频和…

JVM|为对象分配内存空间的流程

1. Eden是否能装下新对象&#xff1f; 1.1 如果可以&#xff0c;则装入新对象&#xff1b; 1.2 如果不可以&#xff0c;则发动minor gc&#xff1b; 2. minor gc后Eden空间是否能装下新对象&#xff1f; 2.1 如果可以&#xff0c;装入新对象&#xff1b; 2.2 如果不可以&#…

长安链引入全新身份认证体系IBC:突破公钥不可理解的限制

近日&#xff0c;未来区块链与隐私计算高精尖创新中心研究团队为长安链带来了一套基于国密SM9算法的全新标识身份认证体系IBC&#xff08;Identity-Based Cryptography&#xff09;。该项成果融合标识密码和现代身份管理体系&#xff0c;打破区块链数字身份监管难、管理难、联通…

优维低代码:第三方接口接入

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 连载…

淌入客户市场的“深水区”,锐捷云桌面体验再升级

作者 | 曾响铃 文 | 响铃说 现阶段&#xff0c;云桌面的普惠价值随着行业应用的深化正在不断突显。 以教育为例&#xff0c;教育信息化建设已经跨过了从无到有的阶段&#xff0c;目前正面临着如何降本增效的问题。云桌面的应用&#xff0c;正在有效地解决这个问题。 在响铃…

Java基础:数据类型会考什么?

本文列举一些关于Java基础的数据类型相关考点,方便以后复习查看 Java 中的哪几种基本数据类型了解么&#xff1f;它们的默认值和占用空间大小知道不? 说说这八种数据类型对应的包装类型 基本类型和包装类型的区别&#xff1f; int 和 Integer 的区别 为什么要有包装类型 ? …

Parallels Desktop for Mac 适用于苹果 macOS 的 PD 虚拟机(安装使用详细教程)

简介 Parallels Desktop for Mac 是一款适用于苹果 macOS 操作系统的虚拟机软件&#xff0c;可以让用户在 Mac 上运行 Windows、Linux 等其他操作系统&#xff0c;同时也可以在虚拟机中安装其他软件和应用程序。Parallels Desktop for Mac 还提供了许多实用的功能&#xff0c;…

窗口看门狗(WWDG)实验

窗口看门狗 窗口看门狗&#xff08;WWDG &#xff09;通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。 除非递减计数器的值在 T6 位&#xff08; WWDG -->CR 的第六位&#xff09;变成 0 前被刷新&#xff0c;看门狗电路…

ROS小乌龟话题改写--话题发布--话题订阅

创建小乌龟 roscore rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key2&#xff1a;图显示&#xff1a; rqt_graphtest02_sub_pose 3&#xff1a;通过命令显示话题名消息信息 方法一获得&#xff1a; rostopic info /turtle1/cmd_vel方法二获得&#…

Linux 提权学习

提权的目的是获取 root 权限 root 权限可获取 shadow 文件中的密码 Hash&#xff0c;若内网环境中存在「账户/密码复用」的情况&#xff0c;可用于横向扩展 暴力破解 suid 提权 内核漏洞提权 定时任务提权 sudo 提权 第三方服务提权&#xff08;docker、mysql、redis、NFS提权…

量子退火Python实战(4):PyQUBO使用攻略 MathorCup2023加油!

文章目录 前言一、约束部分的QUBO怎么求&#xff1f;二、PyQUBO的输出结果怎么不是QUBO矩阵&#xff1f;三、我的建模太复杂了&#xff0c;可以不用PyQUBO吗&#xff1f;四、怎么构建sum&#xff08;x_1...x_i&#xff09; K的约束&#xff1f;总结 前言 提示&#xff1a;本教…

3DEXPERIENCE MODSIM产品前期概念结构快速开发方案(上) | 达索系统百世慧®

基于3DEXPERIENCE单一数据源、实时多专业协同平台&#xff1b;传统CATIA建模附加全新CATIA柔性快速建模技术&#xff1b;CATIA原生概念建模仿真一体化模型&#xff1b;一模两用&#xff0c;快速建模与变更、多学科快速验证与自动优化、支持快速概念方案决策&#xff1b;仿真效率…

快手社招Java后端开发岗面试,被问麻了

社招面试是基于你的工作项目来展开问的&#xff0c;比如你项目用了 xxx 技术&#xff0c;那么面试就会追问你项目是怎么用 xxx 技术的&#xff0c;遇到什么难点和挑战&#xff0c;然后再考察一下这个 xxx 技术的原理。 今天就分享一位快手社招面经&#xff0c;岗位是后端开发&…