【C++】为什么C++会支持函数重载

news2024/10/7 12:17:45

文章目录

函数重载

1.概念

2.支持函数重载的原理 

2.1准备知识

2.2原理


函数重载

1.概念

        在C语言中,是不允许同名函数存在的。但是在一个作用域种,比如加法函数,想要实现各种类型的数据相加,要定义多个函数,但是这些函数实现的功能类似,却不可以同名,就非常麻烦。所以C++里面引入了函数重载这一概念,允许同名函数的存在。

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

        也可以是参数个数不同,如下

        或者是参数的类型顺序不同,注意,是参数类型的顺序,如下:

         但是,一定不可以是参数类型相同,但是变量名顺序不同,如下就是错误的。参数的名字变了,并没有本质上的改变,该是什么类型的还是什么类型,一定要是类型顺序不同。

2.支持函数重载的原理 

2.1准备知识

        首先我们要了解,一个.c 文件生成 .exe 文件的过程中,发生了什么。具体可以见这篇文章:【C语言】你知道.c文件是如何变成.exe文件的吗_Austerlitzl的博客-CSDN博客_

         下图是编译链接过程的一个概括图。 

 

        下图是编译环境四个阶段。

1. 实际项目通常是由多个头文件和多个源文件构成,而通过对编译链接的了解,我们可以知道,【当前 main.c 中调用了 sum.c 中定义的 sum 函数时】,编译后链接前,main.o 的目标文件中没有 sum 的函数地址,因为 sum函数 是在 sum.c 中定义的,所以 sum 的地址在 sum.o 中。那么怎么办呢?
2. 所以链接阶段就是专门处理这种问题,链接器看到 main.o 调用 sum ,但是没有 sum 的地址,就会到 sum.o 的符号表中找 sum 的地址,然后链接到一起。
3. 那么链接时,面对 sum 函数,链接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则
4. Windows下vs的修饰规则过于复杂,Linux下g++的修饰规则简单易懂,所以下面使用g++演示了这个修饰后的名字。

2.2原理

        C++支持函数重载的原理就是——名字修饰。简单地说,一个C语言程序,如果对他进行编译,那么链接器在寻找一个函数的时候,是原原本本去寻找它的名字,如果写了相同名字的函数,编译器寻找的时候无法区分。但是,对于C++程序而言,会根据参数个数参数类型对它的函数名进行一定程度上的修饰,这样即使是同名函数,由于参数个数或者参数类型或者参数类型顺序不同,修饰之后的函数名也是不同的,链接器就可以区分

        由于在不同环境下,修饰规则有所不同。而Linux环境下,函数名修饰规则比较简单,所以用Linux做演示,如下是C语言的函数调用,明显发现没有任何修饰。

        但是如下是C++ 的程序,可以明显看出其函数名是被修饰的。其修饰规则也不难 _Z 是固定的,然后加上的数字是函数名长度,接着加上函数名,最后加上参数类型的首字母

        如果规定 C++ 的返回值也参与名字修饰呢?那么遇到同名函数的参数完全一致,但是返回值不同,是否也可以区分?
        首先要清楚,如果其返回值也参与名字修饰,那么修饰之后的名字肯定也是不一样的,链接器肯定可以区分不同名字的函数。
        但是,我们调用函数的时候,不一定每次都需要它的返回值,如下图,main() 函数里面调用两个Add 函数,但是谁知道它是调用返回值是 double 的,还是返回值是 int 的?所以不可取。

         也可以看一下 VS 环境之下,只声明一个函数,却不定义,自然是找不到的,查看报错情况。如下是一个 C语言程序红色箭头),其报错信息(最下面红色方框)可以看出,C语言确实没有名字修饰。 

         但是C++ 程序就不一样了,如下图通过红色方框的内容,确实可以看出有名字修饰,但是其规则比较复杂。

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

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

相关文章

设计模式-七大原则

设计模式 聚合 设计模式追求的是 1.代码重用性(相同功能的代码不用重复编写) 2.可读性(规范性,便于其他程序员阅读和理解) 3.可扩展性(增加新的功能非常方便) 4.可靠性(增加新的…

【国产可编程逻辑控制器plc调研】

国产可编程逻辑控制器plc调研1 高性能PLC(ACxxx系列)2 中型PLC(AMx00系列)3 小型PLC(HxU、HxS)4 小型紧凑型PLC(Easy)[新品]总结由于有国产化的需求,所以调研了一家国内的…

Internet Download Manager2023下载器Win系统经典下载工具

IDM下载器是一款非常经典的多线程下载工具,广受国内外用户喜爱。该软件专注于文件下载,没有任何多余功能,也没有烦人的弹窗广告打扰,简单易操作。特别是站点抓取功能,对于网站整站下载非常的好用。 整站下载器有很多&…

shell-将密码输入错误超过4次的IP地址通过firewalld防火墙阻止访问

应用场景:防止恶意IP尝试ssh登录 脚本说明:将密码输入错误超过四次得ip地址通过iptable防火墙访问。 分析: 首先,需要知道ssh远程访问记录在哪一个文件中 /var/log/secure其次,模拟远程访问输错密码,查…

数字化+智能化,低代码平台助力能源行业创新赋能

编者按:能源行业数字化转型需求发杂,定制化要求高,低代码平台对于能源行业来说可谓是“专业对口”。本文分析了能源行业数字化转型的痛点和需求,并进一步指出低代码平台的在能源行业中的应用价值,最后介绍了老牌低代码…

破解版IDM导致电脑反复闪屏的解决方案

破解版IDM导致电脑反复闪屏的解决方案 概括: 进入安全模式,卸载IDM,结束 文章目录破解版IDM导致电脑反复闪屏的解决方案问题原因解决方式:问题原因 在使用IDM(Internet Download Manager)的破解版下载文件时突然电脑闪屏&#…

分享5款开年必备的工具软件

最近陆陆续续收到好多小伙伴的咨询,这边也是抓紧时间整理出几个好用的软件,希望可以帮到大家。 1. 影像处理——GIMP GIMP 提供了各种的影像处理工具,滤镜,还有许多的组件模块,对于要制作一个又酷又炫的网页按钮或网…

华为机试题:HJ15 求int型正整数在内存中存储时1的个数(python)

文章目录知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。2、print() :打印输出。3、int() :将一个字符串或数字转换为十进制整数(强转)。输入可以指定进制,…

JUC面试(二)——JUCJMMvolatile 2.0

JUC&JMM JMM 不保证原子性 各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后在写回到主内存中的。 这就可能存在一个线程AAA修改了共享变量X的值,但是还未写入主内存时,另外一个线程BBB又对主内存中同一共享变量…

【项目实战】基于XStream实现漏洞信息数据(XML格式)的手动导入功能

一、背景 项目中需要实现漏洞信息数据的手动导入功能 以下是导入的XML文件所在地址:https://www.cnnvd.org.cn/home/loophole 二、实现思路 (1)前端实现(ElementUIAvue) (2)后端实现 三、…

一文读懂eslint和prettier

为什么会有eslint和prettier,他们有什么作用 首先,工具的出现都是为了解决一定的问题。 团队写代码风格不一样,书写方式不一致,导致整个项目同一类型代码出现多种写法,或者不严谨、或者不美观。或者是提交git时&#…

秒杀功能、高并发系统关注的问题、秒杀系统设计-59

一:秒杀 1.1 特点 秒杀具有瞬间高并发的特点,针对这一特点,必须要做限流 异步 缓存 ( 页面静态化)。 1.2 限流方式 前端限流,一些高并发的网站直接在前端页面开始限流,例如:小…

Python 生成 svg 图片,一篇博客带你掌握 Python 与 svg 之间的操作

python svgwritePython 操作 SVG 图片的库清单svgwrite 库svgwrite 库其他图形绘制储备反爬技术 svgwrite 生成一个手机号Python 操作 SVG 图片的库清单 在 Python 中,可以使用以下几种库来生成 SVG 图片: svgwrite:这是一个简单易用的 Pyt…

民生银行联手火山引擎,一场“1+1>2”的金融数字化征程

数字化时代下,信息成为企业生长的升维秘钥。管理学者德鲁克在《21世纪的管理挑战》一书中指出,我们正经历着一场信息革命。其中特别提出,不是某种软硬件的革命,而是“信息”被使用和利用的方式转变了。近年来,金融行业…

【终极UI/UX工具包】上海道宁与Infragistics助力您简化程序开发,​创建精美应用程序

​​​​​​​​​​​​​​ Infragistics Ultimate是 开发者的UI/UX工具包 可以简化程序开发 加速从设计到代码的应用程序创建 为Web、移动和桌面 创建精美应用程序所需的一切帮助 Infragistics Ultimate附带 完整的企业级.NET和JavaScript图表 网格和UI组件以及可用…

SQL--DML

目录 1、添加数据(insert) 1. 给指定字段添加数据 2. 给全部字段添加数据 3. 批量添加数据 2、修改数据(update) 3、删除数据(delete) DML英文全称是Data Manipulation Language(数据操作语言)&…

AIParsing(TIP2022)-人体解析论文阅读

文章目录解决问题算法人体解析AIParsingFPN检测头边缘引导解析头实验结论论文: 《AIParsing: Anchor-Free Instance-Level Human Parsing》github: https://github.com/31sy/AIParsing解决问题 目前SOTA实例级人体解析模型使用二阶段基于anchor的检测器…

使用 curl multi interface 编写的高性能封装类和示例

CurlMultiDemo 使用 libCurl 的 Multi Interface 的一个简单封装类,支持功能: 单线程 纯异步 的 Get/Post 支持极高的性能(使用 POST 上传 600 文件,仅耗时4~6秒) 使用方式: 1.编译或下载 libcurl 库, 我采用的是 vcpkg2.搭建或找一个支持 MultiPart 上传文件的服务器, 如没…

linux下安装python环境 + Faster-Rcnn环境配置

目录 在Windows上配置环境 在Ubuntu上配置环境 装虚拟机 全屏问题 中文输入 --- 搜狗输入法 将Windows上文件传输给ubuntu --- winscp 分配内存给根目录 深夜惊魂,ubuntu根目录空间不足 - 知乎 给conda或者pip换源 安装anacondapythonpycharm 下载安装…

Spirng bean

spring bean 作用域(scope) 作用域描述singleton单例模式,每一个spring context中只有一个实例prototype每次调用一个getBen方法都会产生一个新的对象request每个request请求产生一个实例session每个htttp session中产生一个实例application…