C++初阶之函数重载

news2024/12/27 2:04:58

目录

前言

函数重载

1.函数重载的概念

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


前言

今天小编给大家带来的是C++中关于函数重载的内容,和C语言不一样,函数重载是C语言特有的,那么该功能实现的底层原理是什么呢?请大家和我细细往后看。


函数重载

1.函数重载的概念

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

这里我给大家举一个例子说明一下:

//参数类型不同
int Add(int left, int right)
{
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}
// 2、参数个数不同
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
	cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
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;
}
int main()
{
	Add(10, 20);
	Add(10.1, 20.2);
	f();
	f(10);
	f(10, 'a');
	f('a', 10);
	return 0;
}

如果在C语言中,以上的写法一定会出现定义冲突的情况,那么在C++中该是否能运行呢?这里我们直接看结果:

 这里我们发现,当我们函数名重名时我们这里由于,参数类型不同,参数个数不同,参数类型顺序不同,我们是可以运行的。那么这里我们底层原理是什么呢?大家接下来请继续看小编对其的有关介绍。

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

在介绍名字修饰时我们就要想到一个程序执行时的:预处理、编译、汇编、链接。这几个过程。至于对这个过程,小编以后会给大家进行详细介绍,大家这里先简单的配合理解一下。

这里我们只需要知道这几个过程执行中的内容是:

这里我们还需要注意一下每个阶段结束后就会参数对应文件后缀的名字,预编译结束后产生的是.i的后缀,编译后产生的是.s的后缀,汇编结束后会产生.o的的文件。那么这里我们看具体过程:

这里我们以C语言程序的例子为例:

1. 实际项目通常是由多个头文件和多个源文件构成,当前main.c中调用了sum.c 中定义的sum 函数时,编译后链接前,main .o 的目标 文件中没有sum 的函数地址,因为sum 是在sum .c 中定义的,所以sum 的地址在sum .o 中。那么 怎么办呢?
2.所以链接阶段就是专门处理这种问题, 链接器看到main .o 调用sum ,但是没有sum 的地址,就
会到sum .o 的符号表中找sum 的地址,然后链接到一起。
说到这里我想大家应该都明白了,实际上我们到链接的阶段时我们识别对应函数时通过编译后的会对产生对应的函数名,以及记录其地址,对于C语言我们并不会因为函数参数进行修饰,但是C++却有其修饰规则(由编译器决定)。
这里由于Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂,下面我们使
用了g++演示了这个修饰后的名字:
通过下面我们可以看出gcc的函数(C语言)修饰后名字不变。而g++的函数(C++)修饰后变成【_Z+函数长度
+函数名+类型首字母】
C语言:

 这里大家先不用怎么看到此类界面,小编之后会在讲解编译,链接的过程中给大家仔细详解,这里大家看到在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。着也就是C语言没有函数重载的原因。

C++语言:

这里我们可以发现 在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参 数类型信息添加到修改后的名字中。

通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修 饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。  如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。
这里给大家讲解一下windows下的命名修饰规则:

 这里大家做简单了解就行,不需要着重掌握。

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

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

相关文章

Idea配置maven,指定settings.xml文件不生效

一.简介 最近单位要求把项目的仓库配置从阿里云改为nexus私服&#xff0c;配置了一个settings-nexus.xml的配置文件&#xff0c;idea的maven配置指定了该settings-nexus.xml文件&#xff0c;发现走的还是阿里云的&#xff0c;新的settings-nexus.xml竟然不生效&#xff0c;依赖…

分支和循环语句(1)

文章目录 目录1. 什么是语句2. 分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.2 if书写形式的对比2.1.3 练习 2.2 switch语句2.2.1 在switch语句中的 break2.2.2 default子句2.2.3 练习 3. 循环语句3.1 while循环3.1.1 while语句中的break和continue 附…

记一次fastjson反序列化到内网靶标

声明&#xff1a;文中涉及到的技术和工具&#xff0c;仅供学习使用&#xff0c;禁止从事任何非法活动&#xff0c;如因此造成的直接或间接损失&#xff0c;均由使用者自行承担责任。 点点关注不迷路&#xff0c;每周不定时持续分享各种干货。 众亦信安&#xff0c;中意你啊&a…

多种方法解决This is usually caused by another repository pushing to the same ref的错误

文章目录 1. 复现错误2. 分析错误3. 解决错误4. 解决该错误的其他方法 1. 复现错误 今天使用git status查看文件状态&#xff0c;发现有一个文件未提交&#xff0c;如下代码所示&#xff1a; D:\project\test>git status On branch master Your branch is up to date with …

sftp常用命令介绍

sftp常用命令&#xff1a; 1. sftp 登录sftp服务器 sftp userip ​​​​​​ 如需要看全部命令&#xff1a;则使用help即可 2. pwd和lpwd 、 ls和lls 、cd和lcd 等 sftp登录之后默认操作是远程服务器&#xff0c;当需要操作本地时&#xff0c;就需要在前边加“l”&#…

【wpf踩坑日记】搞错了,眼睛问题(:))

背景 今天遇到一个草鸡奇葩的问题&#xff1a; ComboBox 选择时 没有触发绑定的属性的set。 其实看错了&#xff0c;Mode写出OneWay&#xff0c;应该是TowWay。 不然是会触发set的。兄弟们不用往下看了。。。。。 哎&#xff0c;有的时候就会碰到这种情况&#xff0c;我还…

Ubuntu上跑通PaddleOCR

书接上文。刚才说到我已经在NUC8里灌上了Windows Server 2019。接下来也顺利的启用了Hyper-V角色并装好了一台Ubuntu 22.04 LTS 的虚机。由于自从上回在树莓派上跑通了Paddle-Lite-Demo之后想再研究一下PaddleOCR但进展不顺&#xff0c;因此决定先不折腾了&#xff0c;还是从x6…

python常见问题总结

对于长期深耕在python爬虫的程序员来说&#xff0c;如何快速解决代码中的问题它是作为合格的程序员应该具备的基本素质。下面将我总结整理出有关python的一些常见问题记录下来方便后期查证。 Python python 没有多态&#xff0c;而是鸭子类型 多继承&#xff0c;没有接口&…

【操作系统】CPU 缓存一致性

【操作系统】CPU 缓存一致性、MESI 协议 参考资料&#xff1a; CPU缓存一致性协议(MESI) 【JUC】Java并发机制的底层实现原理 CPU 缓存一致性 文章目录 【操作系统】CPU 缓存一致性、MESI 协议CPU Cache 的数据写入写直达写回 缓存一致性问题总线嗅探MESI 协议总结 CPU Cache …

springboot:缓存不止redis,学会使用本地缓存ehcache

0. 引言 随着redis的普及&#xff0c;更多的同学对redis分布式缓存更加熟悉&#xff0c;但在一些实际场景中&#xff0c;其实并不需要用到redis&#xff0c;使用更加简单的本地缓存即可实现我们的缓存需求。 今天&#xff0c;我们一起来看看本地缓存组件ehcache 1. ehcache简…

python+vue 市政工程资源互助平台的设计与实现

该系统将由用户系统&#xff0c;管理员系统两部分组成。用户有个人和vip两种类型。 用户模块包括登录注册功能&#xff0c;登录字段包括用户名&#xff0c;密码&#xff0c;用户身份以及验证码。注册包括用户名&#xff0c;密码&#xff0c;邮箱&#xff0c;电话号码&#xff0…

vite+vue+element-plus完成一个admin管理后台

整体项目的 访问链接&#xff1a;https://bigmiss.top/demo/index.html 用到的技术整理 名称版本安装命令说明vite4.0.0npm init vitelatest构建Vue项目vue3.2.45npm install vuenext渐进式框架&#xff08;在vite已安装&#xff09;element-plus3.7.5npm install element-plu…

C#调用C++封装的SDK库(dll动态库)——下

C#调用C封装的SDK库(dll动态库)——下 一、说明 上一篇我们相当于封装的是C语言风格的动态dll库&#xff0c;供C#来调用的。 C#调用C封装的SDK库(dll动态库)——上 如果我们要封装的是下面的类呢&#xff1f;我们该怎么办&#xff1f;大家先思考下。 class Calculation { p…

Tomcat常用操作

Tomcat时间长不用&#xff0c;居然不会用了&#xff0c;这里用的Tomcat9.0.74&#xff0c;对应的jdk版本是jdk8与jdk11。 先看他的把Tomcat安装上去&#xff1a;Tomcat9的安装 运行与关闭Tomcat winr输入cmd。在运行窗口输入startup.bat&#xff0c;回车&#xff0c;启动Tom…

Java基础:对象的克隆(复制)

假如想复制一个简单变量。很简单&#xff1a; int apples 5; int pears apples; 不仅int类型&#xff0c;其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但是如果你复制的是一个对象&#xff0c;情况就复杂了。 假设说我是一个b…

webpack----开发服务器

文章目录 devServer抽取csscss的兼容性压缩cssjs语法检查js的兼容性 devServer 每次编辑源码后&#xff0c;都要webpack重新打包&#xff0c;才能看到效果&#xff0c;麻烦&#xff01;使用webpack-dev-server 自动打包编译源码配置 // webpack.config.js ... mode: "de…

shell中的for循环和if判断

一.编写脚本for1.sh,使用for循环创建20账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用户输入&#xff0c;例如: test1、test2、test3、.....、 test10 1.创建脚本for1.sh [rootserver ~]# vim for1.sh 2.编写脚本for1.sh 3.执行脚本for1.sh [roo…

linux命令----- mkdir与rmdir

创建与删除目录 一 mkdir1.mkdir 目录名2.mkdir -p 目录一/目录二 二 rmdir1.rmdir 目录名2.删除非空目录时失败3. rmkdir -p 目录1/目录2 一 mkdir mkdir是make directories的缩写&#xff0c;主要用于linux中创建目录 创建的目录不能和同级目录中已经存在的目录重名可以mkd…

【产品经理】系统上线自查清单

产品上线之前的准备工作&#xff0c;看起来简单&#xff0c;实际做起来是非常繁杂的&#xff0c;如果没有尽早考虑和准备&#xff0c;可能会手忙脚乱甚至导致产品延迟上线。 产品上线前的准备工作听起来简单&#xff0c;但实际做起来非常繁杂。除了要考虑用户需求、商业需求外&…

计算广告(十八)

营销组合模型 MMM 分析背景 随着媒体类型和销售渠道的不断变化&#xff0c;客户旅程日益复杂化。单一活动层面的优化已无法满足客户需求。为了应对这一挑战&#xff0c;品牌方需在战略和活动层面构建完整的营销视图&#xff0c;优化各营销渠道间的效率并实现最高投资回报率。…