C++实现函数重载的原理

一、函数重载的概念

C++中允许存在同名函数,但要求函数参数的类型、个数不同,这些同名函数就称为函数的重载。

void func(int a, int b)
{cout << "func(int a, int b)" << endl;
}void func(double a, double b)
{cout << "func(double a, double b)" << endl;
}void func(int a, int b, int c)
{cout << "func(int a, int b, int c)" << endl;
}

二、C++实现函数重载的原理

C语言不支持函数重载,因为编译器在编译时会根据函数名寻找函数的地址。函数名相同,编译器就无法区分这些函数。

C语言源码的编译链接过程如下:

假设有一个函数func,函数声明在头文件func.h中,函数定义在源文件func.c中,主函数main在源文件test.c中。

编译器首先对三个文件进行预处理,生成func.i和test.i文件;再将两个C语言文件翻译为汇编语言,生成func.s和test.s文件,在test.s文件中有汇编语句 call func(?),这意味着将要从其他文件中找到func函数的地址,而函数的地址就是函数的定义,在func.s中;接着汇编器对两个文件进行汇编,生成func.o和test.o文件;最后将两个文件链接,生成可执行程序 .exe文件 。

C++支持函数重载的原理:

在链接时引入了函数名修饰规则,即在函数名中引入参数类型(各个编译器平台都有自己的一套修饰规则)。这样编译器在进行汇编时就不会因为函数名相同而无法找到对应函数的地址了。

例如,在Linux系统下编译器的函数名修饰规则

函数void func(int a, int b)会被修饰为 Z4funcii

函数void func(double a, double b)会被修饰为 Z4funcdd

函数void func(int a, int b, int c)会被修饰为 Z4funciii

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

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

相关文章

【Linux】Linux编译器-gcc/g++使用

1. 背景知识 预处理&#xff08;进行宏替换) 编译&#xff08;生成汇编) 汇编&#xff08;生成机器可识别代码&#xff09; 连接&#xff08;生成可执行文件或库文件) 2. gcc如何完成 格式 gcc [选项] 要编译的文件 [选项] [目标文件] 预处理(进行宏替换) 预处理功能主要包括…

【Linux】-对于信号章节补充的知识点,以及多线程知识的汇总

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

【shell-09】 shell控制台颜色输出

echo -e echo -e 一个重要的小例子和换行符控制字符一样&#xff0c;终端颜色也有自己的十进制控制符颜色的写法颜色参考图表 echo -e 一个重要的小例子 echo -e 的意思&#xff1a;如果字符串中出现某些特定的字符组合&#xff08;转义字符&#xff09;&#xff0c;echo会将这…

大模型学习与实践笔记(十二)

使用RAG方式&#xff0c;构建opencv专业资料构建专业知识库&#xff0c;并搭建专业问答助手&#xff0c;并将模型部署到openxlab 平台 代码仓库&#xff1a;https://github.com/AllYoung/LLM4opencv 1&#xff1a;创建代码仓库 在 GitHub 中创建存放应用代码的仓库&#xff…

DAY08_SpringBoot—整合Mybatis-Plus

目录 1 MybatisPlus1.1 MP介绍1.2 MP的特点1.3 MybatisPlus入门案例1.3.1 导入jar包1.3.2 编辑POJO对象1.3.3 编辑Mapper接口1.3.4 编译YML配置文件1.3.5 编辑测试案例 1.4 MP核心原理1.4.1 需求1.4.2 原理说明1.4.3 对象转化Sql原理 1.5 MP常规操作1.5.1 添加日志打印1.5.2 测…

电脑存储位置不够怎么办

电脑内存不够怎么办&#xff01;&#xff01;&#xff01; 我前段时间经常因为电脑D盘内存不够而苦恼&#xff08;毕竟电脑内存就那么丁点&#xff0c;C盘作为系统盘不能随便下东西的情况下&#xff0c;就只能选择其他盘进 方法一&#xff1a;检查电脑硬盘的分区情况&#xf…

全国大学生智能汽车竞赛—解决Ubuntu 18.04.6 无法连接网络的问题

1.1 用到的命令 lshw &#xff08;1&#xff09;功能描述: lshw是一个提取机器硬件配置详细信息的工具&#xff0c;并且能将结果输出成HTML、json、XML等格式。 &#xff08;2&#xff09;输出形式&#xff1a; -class 仅显示一类硬件信息&#xff0c;可以使用lshw -short或ls…

网络:PPP协议

1. HDLC协议 高级链路控制协议 2. PPP协议 点对点协议&#xff0c;是point-to-point的简称。和以太网协议一样&#xff0c;PPP是数据链路层协议&#xff0c;定义了帧格式&#xff0c;称为PPP帧。 3. PPP协议与以太网协议的区别 以太网协议工作在以太网接口和以太网链路上。 以…

如何通过系统命令排查账号安全?

如何通过系统命令排查账号安全 query user 查看当前登录账号 logoff id 注销用户id net user 查看用户 net user username 查看用户登录情况 lusrmgr.msc 查看隐藏账号 winR打开regedit注册表 找到计算机\HEKY_LOCAL_MACHINE\SAM\SAM\右键给与用户读写权限 刷新打开 HKEY…

ps去除图片上的文字

1. 打开ps, 打开文件 2. 选择套索工具 3. 使用套索工具将需要去除的文字框选 4. 然后鼠标右击&#xff0c;选择内容识别填充 5. 应用确定后, 此时文字就去掉了

【Java】一文读懂逃逸分析

逃逸分析 逃逸分析&#xff08;Escape Analysis&#xff09;是一种编译器优化技术&#xff0c;它分析程序中的对象分配&#xff0c;以确定对象的作用域和生命周期。具体来说&#xff0c;逃逸分析要确定一个对象是否会逃逸出它被创建的方法或者作用域&#xff0c;换句话说&…

保姆级CISP报考攻略,让你不再迷茫

信息安全领域越来越火&#xff0c;想要在这个行业闯出一片天&#xff1f;CISP认证就是你的“敲门砖”&#xff01;想知道如何顺利考取这个超牛的证书吗&#xff1f;下面就带你一起探索保姆级CISP报考流程&#xff01;&#x1f389; &#x1f393;报考条件&#x1f393; 学历专业…

vue2中的事件修饰符

在Vue2中&#xff0c;事件修饰符是一种用于在DOM事件处理中进行特定操作的特殊标记。Vue2提供了一些内置的事件修饰符来简化事件处理逻辑。以下是Vue2中常用的事件修饰符&#xff1a; .prevent&#xff1a;阻止默认事件&#xff08;常用&#xff09;&#xff1b;.stop&#xff…

推荐在线PS修图网页版工具PHP网站源码

在线PS修图网页版工具PHP网站源码&#xff0c;PHP在线照片图片处理PS网站程序源码photoshop网页版。 有很多朋友们都是在用PS作图的&#xff0c;众所周知在使用和学习PS时是需要下载软件的&#xff0c;Photoshop软件对电脑配置也是有一定要求的&#xff0c;今天就为大家带来一…

关于C#中的Select与SelectMany方法

Select 将序列中的每个元素投影到新表单。 实例1 IEnumerable<int> squares Enumerable.Range(1, 10).Select(x > x * x);foreach (int num in squares) {Console.WriteLine(num); } /*This code produces the following output:149162536496481100 */ 实例2 str…

牛客网-----跳石头

题目描述&#xff1a; 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行&#xff0c;河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间&#xff0c;有N块岩石(不含起点和终点的岩石)。在比赛过程中&#xff0…

第十一章:大模型之Adaptation

参考链接&#xff1a;https://github.com/datawhalechina/so-large-lm/tree/main 1 引言 为什么需要Adaptation? 在⾃动化和⼈⼯智能的时代&#xff0c;语⾔模型已成为⼀个迅速发展的领域。从语⾔模型的训练⽅式来说&#xff0c;语⾔模型&#xff0c;例如GPT-3&#xff0c;…

JAVA算法—排序

目录 *冒泡排序&#xff1a; *选择排序&#xff1a; 插入排序&#xff1a; 快速排序&#xff1a; 总结&#xff1a; 以下全部以升序为例 *冒泡排序&#xff1a; 引用&#xff1a; 在完成升序排序时&#xff0c;最大的元素会经过一轮轮的遍历逐渐被交换到数列的末尾&#…

项目实战——Qt实现FFmpeg音视频转码器

文章目录 前言一、移植 FFmpeg 相关文件二、绘制 ui 界面三、实现简单的转码四、功能优化1、控件布局及美化2、缩放界面3、实现拖拽4、解析文件5、开启独立线程6、开启定时器7、最终运行效果 五、附录六、资源自取 前言 本文记录使用 Qt 实现 FFmepg 音视频转码器项目的开发过…

LeetCode 410. 分割数组的最大值

一、题目 1、题目描述 给定一个非负整数数组 nums 和一个整数 k &#xff0c;你需要将这个数组分成 k 个非空的连续子数组。 设计一个算法使得这 k 个子数组各自和的最大值最小。 2、接口描述 ​ class Solution { public:int splitArray(vector<int>& nums, int …