【C++入门】函数重载

news2024/10/10 8:20:28

目  录

  • 1 函数重载概念
  • 2 C++支持函数重载的原理 -- 名字修饰(name Mangling)


1 函数重载概念

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

示例:

  • 参数类型不同
//int型参数
int Add(int num1, int num2)
{
	cout << "int Add(int num1, int num2)" << endl;
	return num1 + num2;
}

//double型参数
double Add(double num1, double num2)
{
	cout << "double Add(double num1, double num2)" << endl;
	return num1 + num2;
}
  • 参数个数不同
//无参数
void Func() {
	cout << "Func()" << endl;
}

//有一个参数a
void Func(int a) {
	cout << "Func(int a)" << endl;
}
  • 参数类型顺序不同
//正确方式
void F(int a, char b)
{
	cout << "F(int a,char b)" << endl;
}
void F(char b, int a)
{
	cout << "F(char b, int a)" << endl;
}

//错误方式
void F(int a, int b)
{
	cout << "F(int a,int b)" << endl;
}
void F(int b, int a)
{
	cout << "F(int b, int a)" << endl;
}

2 C++支持函数重载的原理 – 名字修饰(name Mangling)

在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++演示修饰后的名字(示例):

    ① 采用C语言编译器编译后的结果: 可以看出在Linux下采用C语言编译器编译后,函数名修饰后的名字不变(也因此可以理解C语言无法支持函数重载)
    函数名修饰示例

    ② 采用C++编译器编译后的结果: 在Linux下采用C++编译器编译后,函数名经过修饰后发生了改变,编译器将函数参数类型信息添加到修改后的名字中。修饰规则为:_Z + 原函数名长度 + 原函数名 + 类型首字母(指针则为P + 指向数据类型首字母)。
    C++函数名修饰示例


    ③ Windows下函数名修饰规则

    示例:如下,当我们只进行函数声明而没有进行函数定义,此时调用函数会发生报错,可以看到图中报错信息中的 ?func@@YAHH@Z 即为函数 int func(int a) 修饰后的名称。
    Windows下函数名修饰示例
    Windows下的一些函数名修饰举例:
函数声明修饰后的函数名
int func(int)?func@@YAHH@Z
float func(float)?func@@YAMM@Z
int C::func(int)?func@C@@AAEHH@Z
int C::C2::func(int)?func@C2@C@@AAEHH@Z
int N::func(int)?func@N@@YAHH@Z
int N::C::func(int)?func@C@N@@AAEHH@Z

我们以 int N::C::func(int) 这个函数声明来猜测Visual C++的函数名修饰规则。修饰后名字由 ? 开头,接着是函数名,由 @ 符号结尾;后面跟着由 @ 结尾的类名 C 和空间名称 N ,再一个 @ 表示函数的名称空间结束;第一个 A 表示函数调用类型为 __cdecl ,接着是函数的参数类型及返回值,由 @ 结束,最后由 Z 结尾。可以看到函数名、参数类型和名称空间都被加入了修饰后名称,这样编译器和链接器就可以区别同名但不同参数类型或命名空间的函数,而不会导致链接的时候函数多重定义。

④ 如果两个函数的函数名和参数列表是一样的,只是返回值类型不同是不构成重载的,因为调用时编译器没办法区分(即使在修饰后的名称中加入返回值类型,但我们在调用函数时并不会加上返回值类型)。


以上是我对C++中函数重载的一些学习记录总结,如有错误,希望大家帮忙指正,也欢迎大家给予建议和讨论,谢谢!

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

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

相关文章

企企通入选「AI中国」机器之心“最具商业价值解决方案 TOP 30” 榜单

近日&#xff0c;由专业的人工智能信息服务平台机器之心&#xff0c;发起并评选的「AI 中国」机器之心2022 年度评选榜单正式公布&#xff0c;企企通凭借过去一年在采购供应链领域取得的成就&#xff0c;以及在技术、产品、服务能力方面具备的独特优势&#xff0c;从众多企业中…

Python连接Liunx中mysql数据库-三表查询【10个经典案例】

关于Python连接liunx中mysql数据库的方式在这一篇文章 Python连接Liunx中mysql数据库-保姆级教程 关于Python针对liunx中的mysql数据库进行增删改查操作的文章在这一篇可以看一下 Python连接Liunx中mysql数据库-增删改查 对于单表查询的学习可以看这一篇文章 Python对liunx中my…

使用.ibd文件恢复Mysql数据库数据

使用.ibd文件恢复Mysql数据库数据问题发现问题解决第一步&#xff1a;查找mysql数据目录第二步&#xff1a;创建表第三步&#xff1a;解除表空间第四步&#xff1a;复制原数据库.ibd文件第五步&#xff1a;导入表空间ERROR 1030 (HY000): Got error 194 “Tablespace is missin…

使用Navicat生成MySQL测试数据

使用Navicat生成MySQL测试数据 Navicat版本&#xff1a;16.1.3 场景&#xff1a;因为某些原因&#xff0c;本人负责项目的数据库需要从MySQL迁移到PostgreSQL&#xff0c;所以就想测试一下PostgreSQL数据库的分区表性能。测性能的话大概需要两千万的测试数据&#xff0c;从生…

蓝队--Linux基线安全检查

文章目录认证账号和口令安全创建用户用户安全基线授权文件系统安全审计日志安全日志存放的位置设备等级观察一条日志产生的过程网络安全网络协议与服务安全SSH的配置防火墙安全操作系统SELinux登陆安全kali忘记密码怎么办怎么物理加密进入BOIS界面选择Security选择set User Pas…

【前端】css样式视口、布局

一、 视口概念 视口&#xff08;viewport&#xff09;是用来约束网页中最顶级块元素的&#xff0c;即它决定了网页的大小&#xff0c;网页是先在视口上渲染&#xff0c;然后再通过视口放回到浏览器窗口上的&#xff0c;网页的渲染过程如下&#xff1a; pc端视口的大小和浏览器…

Python---类与对象

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些python的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 类与对象前言定义类创建对象前言 面向对象跟函…

河北如何推进农村生活污水处理?

自“十四五”以来&#xff0c;我国各地都针对地方农村人居环境的改善颁布相关方案&#xff0c;力图改善农村生活污水处理这一自本世纪初就始终困扰我国广大农村居民的难题。今天&#xff0c;小编就为大家介绍一下&#xff0c;湖北省针对农村污水处理所采取的最新措施。 河北地…

统计图表有哪几个种类及其特点

关于数据分析中常用统计图表的分类和各种图表的特点&#xff0c;这一张图就能概括&#xff01; 下面来展开说下&#xff0c;为了直观展示&#xff0c;给大家找了一份可视化统计图表的模板&#xff0c;可直接在线使用&#xff0c;需要的小伙伴自取哈。 点此领取模板>>htt…

端口映射和端口转发

文章目录端口转发定义端口映射的定义端口转发简介常见转发工具LCX1、目标机有公网lP2、端口映射3、目标机无公网IP端口转发和端口映射都是为了解决内网主机的端口无法在外部直接访问而衍生出来的技术&#xff0c;通过中间服务器进行中转&#xff0c;将内部的端口映射到公网IP上…

【AI-NLP】Transformer理论及源码理解

文章目录提出背景总体结构EncoderDecoder细节再探源码阅读主函数部分主模型定义编码器编码层多头自注意力层前馈神经网络层Masked解码器解码层参考资料提出背景 改进了RNN的训练慢的缺点&#xff0c;利用self-attention机制实现并行计算。并且Transformer可以增加到非常深的深…

用css实现简易报警灯

主题 用css来实现一个简易的报警灯效果 实现效果 实现思路 实现的核心是一个灯罩和一个灯芯。灯罩主要是使用了border-radius圆角边框&#xff0c;灯芯主要是radial-gradient径向渐变。再使用动画效果来实现一闪一闪的效果。让我们来一步一步实现效果。 灯罩实现 因为大…

剑指Offer 第18天 I. 二叉树的深度 II. 平衡二叉树

目录 剑指 Offer 55 - I. 二叉树的深度 剑指 Offer 55 - II. 平衡二叉树 剑指 Offer 55 - I. 二叉树的深度 输入一棵二叉树的根节点&#xff0c;求该树的深度。从根节点到叶节点依次经过的节点&#xff08;含根、叶节点&#xff09;形成树的一条路径&#xff0c;最长路径的长度…

2025年突破百万套/年,又一个前装赛道成为行业新风口

汽车智能化&#xff0c;不仅仅是增量&#xff0c;还有存量升级。 作为驾驶员观察道路状况的关键车载部件&#xff0c;汽车后视镜&#xff08;基于凸面镜&#xff09;最早出现在1906年&#xff0c;随后逐步成为所有车辆的基本标配。不过&#xff0c;由于镜面设计的缺陷&#xf…

【ROS学习】节点运行管理launch文件的基本操作

launch文件的概念和作用 launch 文件是一个 XML 格式的文件&#xff0c;可以启动本地和远程的多个节点&#xff0c;还可以在参数服务器中设置参数。 launch文件的作用是&#xff1a;简化节点的配置与启动&#xff0c;提高ROS程序的启动效率。 使用场景 launch文件在ros中使用还…

mybatis中获取插入数组的主键值(自增主键,非增主键),mp

1.自增主键的第一种写法 <insert id"addKey" ><!--通过mybatis框架提供的selectKey标签获得自增产生的ID值--><selectKey resultType"java.lang.Integer" order"AFTER" keyProperty"id">select LAST_INSERT_ID()<…

【Azure 架构师学习笔记】-Azure Logic Apps(5)- 标准和使用量类型的区别

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Logic Apps】系列。 接上文【Azure 架构师学习笔记】-Azure Logic Apps&#xff08;4&#xff09;-演示2 前言 在做实验的过程中&#xff0c;发现使用“使用量”&#xff08;Consumption)类型会出现很多问题&#xff…

碰到个阿里p8,终于知道了别人为什么这么强,算是见识到了基础的天花板

基础不行一切都是浮云&#xff0c;想要建成高楼大厦&#xff0c;必需基础牢固 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c;他山之石&#xf…

Pointet++ Tutorial

目录 .0 前言 .1 Contributions .2 Solutions 2.1 Set Abstraction&#xff08;SA&#xff09; .3 Structure of Network 3.1 Sample layer 3.2 group 3.3 PointNet layer 3.4 分类任务在提取特征后是怎么操作的&#xff0c;loss是什么 3.5 分割任务中如何进行上采…

electron+vite+vue3.0+frorge最新打包流程

这里写自定义目录标题简介安装打包更多配置配置vue项目多平台打包mac osforge配置项简介 文章更新与2023年2月1日。 electron官网&#xff1a;https://www.electronjs.org electronforge官网&#xff1a;https://www.electronforge.io 环境要求&#xff1a;git、node14版本以…