【C++】为什么能实现函数重载

news2024/12/24 2:37:40

从C语言一路学到C++的途中,C++语言C语言相比,多了个函数重载,那么函数重载是如何实现的呢,为什么C语言无法支持,在本篇博客中,将会讲解C++为何能实现函数重载。

 一.编译过程

C++能实现函数重载,而C语言不能,那是因为它们的函数名修饰规则不一样。

在这里先讲一下,一个或多个源程序是如何变成可执行文件的。

源程序变成可执行文件要经历四个阶段:预处理,编译,汇编,链接

预处理

进行头文件的包含、宏替换、条件编译、去注释等等

编译

检查语法错误,并将代码编译成汇报代码 

汇编

 将汇编代码编译成机器码

链接

将多个源文件和动态库或者静态库进行链接 

二.重载原理 

那么C语言不能实现函数重载是在哪个阶段出问题呢,答案是在第二个阶段,接下来演示一下(本代码都是在Linux环境下完成)

函数名修饰规则 

 首先我们用test.c  test.cpp两个源文件写出下面两份相同的代码,然后进行编译操作形成汇编代码

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

int main()
{

    return 0;
}

C汇编

可以看到C语言编译生成的汇编代码下,Add函数被修饰成了Add 。

 

C++汇编

而C++的代码编译成汇编后,发现了函数Add被修饰成了_Z3Addii 。

而这个函数的修饰名规则是按参数来完成的,即函数名+参数类型的缩写。

这就是为什么C++能实现函数重载

 

C++重载函数的汇编 

接下来我们将下面的代码编译一下,再来看看。

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

    return 0;
}

可以看到两个Add函数形成汇编后,它们的函数名分别是_Z3Addii_Z3Adddd 函数名不同,自然就能实现函数重载(因为再调用的时候就可以根据函数参数来进行选择调用那个函数)

 

总结,C++能实现函数重载是因为C语言和C++的函数名修饰规则不一样,C语言会默认修饰成函数的原名,而C++会修饰成函数名+参数的缩写。 

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

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

相关文章

CloudFlare WARP+ 无限流量

Cloudflare WARP 是一种由 Cloudflare 提供的虚拟专用网络(VPN)服务,旨在提供更安全、更快速的互联网连接。WARP 的目标是通过使用 Cloudflare 的全球网络基础设施来加密和保护用户的互联网流量,并且通过优化路由和连接&#xff0…

012_control_flow_in_Matlab中的控制流

Matlab中的控制流 虽然,我们说Matlab中的计算是向量化的,但是在某些情况下,作为一个“程序设计语言”,Matlab也提供了一些控制流结构,来帮助我们实现一些复杂的逻辑。 我会在介绍控制流的时候,提醒如何用…

Spark源码(二)-Netty简介

一、Netty简介 Netty 是一个异步事件驱动的网络通信应用框架,用于快速开发可维护的高性能服务器和客户端。简单地说Netty封装了JDK的NIO,不用再写一大堆复杂的代码,从NIO各种繁复的细节中脱离出来,让开发者重点关心业务逻辑。 二…

新书速递——《可解释AI实战(PyTorch版)》

本书旨在帮助你实施最新的可解释AI技术,以构建公平且可解释的AI系统。可解释AI是当今AI研究中的热门话题,但只有少数资源和指南涵盖了所有重要技术,这些技术对实践者来说非常有价值。本书旨在填补这一空白。 本书读者对象 本书既适合那些有兴…

阿里云2核4G云服务器支持多少人同时在线?并发数计算?

阿里云2核4G服务器多少钱一年?2核4G配置1个月多少钱?2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

04 | Swoole 源码分析之 epoll 多路复用模块

首发原文链接:Swoole 源码分析之 epoll 多路复用模块 大家好,我是码农先森。 引言 在传统的IO模型中,每个IO操作都需要创建一个单独的线程或进程来处理,这样的操作会导致系统资源的大量消耗和管理开销。 而IO多路复用技术通过…

第十四届蓝桥杯JavaA组省赛真题 - 棋盘

解题思路: 暴力 棋盘类题目取反操作: f[a][b]^1; 或者f[a][b] 1 - f[a][b]; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);int n scan.nextInt();int m scan.nex…

(南京观海微电子)——GOA介绍

GOA是Gate on Array的简写,简单可以理解为gate IC集成在玻璃上了,面板就可以不用gate ic了,是一种低成本的设计,窄边框面板大多数都用了GOA技术。还有一些公司叫GIP(Gate in Panel),GDM等等。 …

已上线项目,突然有一天网站虽进得去,但是接口拿不到数据,作为前端的你如何排查问题?

在开始写这篇博客之前,想说几句题外话哈,虽然自己的粉丝不多,但自己每篇博客都是用心在写,可能后面会针对部分文章开启只有VIP才能访问,原因你们也懂得(▽),无非是想赚点外块呗,不过主要现在也是知识付费时代,毕竟自己写出的东西也是本人亲身经历着,也是具有一定的价值…

针对pycharm打开新项目需要重新下载tensorflow的问题解决

目录 一、前提 二、原因 三、解决办法 一、前提 下载包之前,已经打开了,某个项目。 比如:我先打开了下面这个项目: 然后在terminal使用pip命令下载: 如果是这种情况,你下载的这个包一般都只能用在这一个…

【已解决】centos执行Hangfire任务时间隔八个小时

参数说明: centos系统是7.9版本的 hangfire是Hangfire 1.8.7 centos系统的目前设置时区是cts的东八时区,截图如下 原因: hangfire任务设定每天执行时间东八实际偏移的执行时间 比如:你设定的是早上6点执行东八实际下午两点执行 …

【web自动化】selenium的使用(二)

目录 复选框操作多层框架操作下拉框操作弹窗操作 复选框操作 示例&#xff1a;批量操作对象&#xff0c;比如将页面上所有的checkbox 都勾上 方法&#xff1a;先用标签选择器选择页面上所有的input&#xff0c;然后从中过滤出属性type是checkbox的 并勾选 List<WebElemen…

Debian linux版本下运行的openmediavault网盘 千兆网卡升级万兆

一、适用场景 1、使用vmware ESXi虚拟化平台运行多种不同应用服务器时&#xff0c;其中网盘服务器采用开源的openmediavault搭建&#xff1b; 2、将老专业服务器升级千兆网为万兆网&#xff1b; 3、需要转移的数据量大的企业或用户&#xff1b; 4、从服务器到服务器的数据转移…

Mac上的Gatekeeper系统跟运行时保护

文章目录 问题&#xff1a;无法打开“xxx.xxx”&#xff0c;因为无法验证开发者。macOS无法验证此App是否包含恶意软件。如何解决&#xff1f; 参考资料门禁运行时保护 问题&#xff1a;无法打开“xxx.xxx”&#xff0c;因为无法验证开发者。macOS无法验证此App是否包含恶意软件…

vue3+vite模版框架 tabs右键刷新时丢失路由参数

问题&#xff1a; 标题栏的tabs的右键&#xff1a;刷新时&#xff0c;没有保存上一个页面传递过来的参数 分析&#xff1a; TagView.vue刷新事件 function refreshSelectedTag(view: TagView) {console.log(|--执行刷新, view)tagsViewStore.delCachedView(view);const {full…

IDEA的使用(概念,安装,配置,)以及什么是字符集,模版

目录 Intellij IDEA IDE的概念 IntelliJ IDEA的安装 IntelliJ IDEA的使用 基本配置 JDK配置 创建Module 基本用法 字体配置 主题配置 字符集 设置IDEA默认字符集 注释模板 字符集 字符集简介 常见字符集 Intellij IDEA 我们不可能一直使用记事本之类变成&#…

Win7共享文件夹无法访问怎么办,win7共享文件夹访问不了

在win7系统中,用户可以通过局域网建立共享,然后将一些文件夹进行共享,方便用户访问。“共享文件”一般常用于办公室,某位同事的计算机用来和其它计算机间相互分享的文件夹。然而有时候需要访问共享文件时,却出现无法访问的情况,要怎么解决这样的问题呢?接下来,小编带来…

3D转换1111

1.三维坐标系 1.3D位移: translate3d(x,y,z)  translform:translateX(100px)&#xff1a;仅仅是在x轴上移动  translform:translateY(100px)&#xff1a;仅仅是在Y轴上移动  translform:translateZ(100px)&#xff1a;仅仅是在Z轴上移动&#xff08;注意&#xff1…

linux yum install jdk如何查找安装目录并配置环境变量

Linux服务已安装jdk1.8&#xff0c;此时需要在该服务器部署的应用要求依赖openJDK11&#xff0c;可按照以下命令进行安装openJDK11。 搜索查看安装包&#xff1a;yum search java-11-openjdk 如果能查找到安装包&#xff0c;执行以下安装命令进行安装。 安装openjdk11&#x…

互联网、因特网、万维网的区别

互联网 internet&#xff1a;凡是能彼此通信的设备组成的网络就叫互联网&#xff0c;即使只有两台计算机&#xff0c;无论以何种技术使其彼此通信&#xff0c;都叫互联网。所以&#xff0c;根据互联网的覆盖规模可以分为&#xff1a; 局域网&#xff08;Local Area Network&am…