C++之函数重载

news2024/10/5 15:34:17

文章目录

  • 前言
  • 一、函数重载
  • 二、如何支持函数重载(C++支持函数重载的原理--名字修饰(name Mangling))
  • 三、参数有什么区别才能构成函数重载
    • 1.参数个数不同
    • 2.参数类型不同
    • 3.参数顺序不同
  • 四、返回值类型不同是否可以构成函数重载
  • 总结


前言

我们知道在使用C语言进行编程时,可能会产生函数名称出现冲突的情况,对此C++中的解决办法是引入命名空间,不同域内可以出现相同名称的函数。那么如果我们希望几个函数在同一个域内并且函数名相同,有什么办法吗?这就涉及到我们今天要了解的内容——函数重载。


一、函数重载

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

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

首先,在程序环境一文中我们了解过,一个项目会有许多不同的源文件,为了将这些源文件中的内容进行连接,最终形成可执行文件,所有的源文件都会在编译阶段生成符号表。符号表中记录了该源文件中的函数的函数名和地址。链接阶段会将整个项目中所有源文件生成的目标文件链接在一起,此时所有符号表也会合成一个符号表,再根据符号表中的函数名及其地址实现跨源文件的函数调用。
函数调用的过程,就是先找到符号表中该函数的函数名,再通过函数名找到函数的地址,再根据地址对函数进行调用。
C语言和C++的函数修饰规则不同:
C语言形成的符号表中的函数名,只有用户自定义的函数名而没有其他的修饰。因此两个相同名称的函数,在符号表中的函数名是相同的,相当于同一个函数名有两个地址,编译器不知道应该使用哪个地址调用该函数。因此,C语言不能支持函数重载
C++中函数的函数名不仅包含用户自定义的函数名,还使用函数的参数对函数名进行了修饰。因此两个同名,但是参数部分有区别的函数,在C++的函数调用中是可以被区分开的。因此,C++支持函数重载

三、参数有什么区别才能构成函数重载

函数参数的个数、类型、顺序,这三个中的任意一个不一样就可以区分开两个函数。

1.参数个数不同

void f(int x, int y)
{
	printf("haha\n");
}
void f(int x)
{
	printf("hehe\n");
}
int main()
{
	f(1, 2);
	return 0;
}

在这里插入图片描述

2.参数类型不同

void f(int x)
{
	printf("haha\n");
}
void f(double x)
{
	printf("hehe\n");
}
int main()
{
	f(1.0);
	return 0;
}

在这里插入图片描述

3.参数顺序不同

void f(int x, double y)
{
	printf("haha\n");
}
void f(double x, int y)
{
	printf("hehe\n");
}
int main()
{
	f(1.0, 2);
	return 0;

在这里插入图片描述

四、返回值类型不同是否可以构成函数重载

问题来了,函数的参数不同可以构成函数重载,那么返回值类型不同是否可以构成函数重载呢?
答案:不能。
原因:编译器在进行函数调用时是不指定函数的返回值类型的。如果两个函数函数名和参数是一样的,返回值类型不同,在调用时会产生二义性,导致编译器不能区分。
在这里插入图片描述


总结

以上就是今天要讲的内容,本文介绍了函数重载的相关概念。本文作者目前也是正在学习C++相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。
最后,如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!

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

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

相关文章

jmh的一些作用

目录说明说明 jmh可以用来java基准测试,性能测试用这个测比较标准,可以设置预热、迭代次数,对某块代码精准测试,耗时时间单位有毫秒、纳秒等。 就先说到这\color{#008B8B}{ 就先说到这}就先说到这 在下Apollo\color{#008B8B}{在下…

AcWing 323. 战略游戏(树形DP + 状态机DP)

AcWing 323. 战略游戏(树形DP 状态机DP)一、问题二、分析1、思路分析2、状态表示3、状态转移4、循环设计5、初末状态三、代码一、问题 二、分析 1、思路分析 这道题最后问的其实就是,在一棵树中,每个边至少选择一个端点的条件下…

【FLASH存储器系列十五】NAND Flash究竟能不能随机读写到某个字节的数据?

网上有很多文章写道,nand flash的读写操作是以page为单位,还有文章说些nand flash时必须按page0、page1、page2…的顺序写,必须先写完前面的page才能写后面的page。难道nandflash就不能随机读到某个字节吗?只能一次性读一页&#…

区区几行代码,就能全面实现 Python 自动探索性数据分析

探索性数据分析是数据科学模型开发和数据集研究的重要组成部分之一。在拿到一个新数据集时首先就需要花费大量时间进行EDA来研究数据集中内在的信息。自动化的EDA Python包可以用几行Python代码执行EDA。 在本文中整理了10个可以自动执行EDA并生成有关数据的见解的Python包&am…

C语言——二分查找与猜数字游戏

文章目录二分查找二分查找的思想二分查找的条件二分查找的实现过程代码举例猜数字游戏游戏说明猜数字游戏思想代码实现打印菜单打印主函数打印游戏函数整体代码演示二分查找 题目: 在一个有序数组中查找具体的某个数字n。 首先我们先定义一个110的数组 ,…

immersive-translate(沉浸式双语网页翻译扩展),解决谷歌翻译无法使用问题

前言 谷歌停止了大陆的谷歌翻译服务,所以找到了immersive-translate 插件解决翻译问题。当然 最直接就是 换个浏览器比如 Edge\Firefox等等。 主要特性 智能识别网页主内容区,区别于同类插件翻译网页所有的区域,这可以极大增强译文的阅读…

【C++11】右值引用与移动构造、万能引用与完美转发

目录 一、右值引用 1.1 左值引用和右值引用 1.2 左值引用与右值引用比较 1.3 右值引用的使用场景和意义 二、移动构造 2.1 移动构造的实现 2.2 移动赋值 2.3 默认成员函数 2.4 default关键字 2.5 delete 关键字 2.6 STL中的移动构造 二、完美转发 2.1 模板中的万能…

利用剪枝降低bfs算法的时空复杂度(一道OJ题目)

作者:非妃是公主 专栏:《算法》《刷题笔记》 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 《算法》专栏系列文章 算法设计与分析复习01:主方法求递归算法时间复杂度 算法设计与分析…

我写了一个脚本,实现了图片分类问题的全自动化训练

众所周知,图片分类问题属于计算机视觉中比较容易解决的问题之一 但 这几天被数据集的问题搞得焦头烂额, 照理说分类问题的数据集应该比较好制作 但 如果之前没有现成的数据集 也会变得比较麻烦 直到我偶然发现了一个HuggingFace的图片搜索API 无限次调用 而且不需要身份验证 真…

【手撕面试题】HTML+CSS(高频知识点一)

目录 面试官:给定一个元素,如何实现水平垂直居中? 面试官:padding与margin有什么不同? 面试官:vw和百分比有什么区别? 面试官:行内元素与块级元素有什么区别? 面试官…

MapReduce实现TopN

目录 1、先导知识 2、案例 2.1 需求 2.2 代码实现 FlowBean类 Mapper类 Reducer类 Driver类 3、总结 1、先导知识 TreeMap底层是根据红黑树的数据结构构建的,默认是根据key的自然排序来组织(比如integer的大小,String的字典排序&…

一刷代码随想录——回溯算法

1.理论基础【1】本质回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以…

线性DP与真题

目录 一、前言 二、最长公共子序列(lanqiaoOJ题号1189,类似于1054) 三、最长递增子序列 1、蓝桥骑士(lanqiaoOJ题号1188) 四、编辑距离 1、字符串转换(lanqiaoOJ题号1507) 五、网络图上的…

JavaScript两数之和

两数之和 两层for循环 // O(n^2) const twoNum function(nums,target){for(let i 0;i<nums.length;i){for(let ji1 ;j<nums.length;j){if(nums[i]nums[j]target){return[i,j]}}} }双指针 // 当数组为有序的时候O(n) const twoNum2 function(nums,target){let i 0 …

SpringCloud学习

由于Spring Cloud基于Spring Boot构建&#xff0c;而Spring Cloud Alibaba又基于Spring Cloud Common的规范实现&#xff0c;所以当我们使用Spring Cloud Alibaba来构建微服务应用的时候&#xff0c;需要知道这三者之间的版本关系。 目前Spring Cloud Alibaba的版本与Spring Bo…

1-1MySql复习

MySql复习 一 数据类型 数值 字符串 ​ char(5) 定长字符串 varchar(5) 可变长度字符串 日期 ​ timestamp 记录行数据的最后修改事件 二 基本查询 1 聚合函数 avg count sum max min 2 排序 order by ​ asc ​ desc 3 分组 group by … having … 分组通常跟…

Python语言的重要性(模式识别与图像处理课程作业)

Python语言的重要性&#xff08;模式识别与图像处理课程作业&#xff09;Python语言的重要性1 Python的优点主要有&#xff1a;1.1、简单1.2、易学1.3、速度快1.4、免费1.5、高层语言1.6、解释性1.7、面向对象1.8、可扩展性1.9、可嵌入性1.10、丰富的库1.11、规范的代码2 Pytho…

TCP/IP网络编程——套接字的多种可选项

完整版文章请参考&#xff1a; TCP/IP网络编程完整版文章 文章目录第 9 章 套接字的多种可选项9.1 套接字可选项和 I/O 缓冲大小9.1.1 套接字多种可选项9.1.2 getsockopt & setsockopt9.1.3 SO_SNDBUF & SO_RCVBUF9.2 SO_REUSEADDR9.2.1 发生地址分配错误&#xff08;B…

高效学 C++|编程实例之计算器

本节将实现一个能进行实数间加、减、乘、除运算的简易计算器。首先创建一个基于QWidget带界面的Qt项目&#xff0c;然后按照如下步骤进行操作&#xff1a; 01、计算器界面设计 在界面中拖入两个单行文本框和十七个按钮&#xff0c;按钮上显示的文字、按钮对象和单行文本框对象…

百分百拿捏offer的自动化测试面试题全套教程

最近很多咨询我&#xff0c;有没有软件测试方面的面试题&#xff0c;尤其是Python自动化测试相关的最新面试题&#xff0c;所以今天给大家整理了一份&#xff0c;希望能帮助到你们。 接口测试基础 1、公司接口测试流程是什么&#xff1f; 从开发那边获取接口设计文档、分析接口…