C++函数重载

目录

  • 函数重载
  • 函数重载是怎样实现的

函数重载

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

要注意的是:只有函数名相同,形参不同(个数\类型\类型顺序不同)才能构成函数重载
而函数名相同,返回值不同的函数不构成函数重载

返回值类型与函数是否重载无关

  • 参数类型不同
int add(int a, int b)
{
	cout << "int:" << a + b << endl;
	return a + b;
}

double add(double a, double b)
{
	cout << "double:" << a + b << endl;
	return a + b;
}



int main()
{
	add(1,1);
	add(1.1,2.2);
}
  • 参数个数不同
void fun(int a)
{
	cout << a << endl;
}

void fcun(int a, int b)
{
	cout << a <<" "<< b << endl;
}

int main()
{
	fun(1);
	fun(1,2);
}
  • 参数类型顺序不同

这里注意:是参数类型顺序不同,而不是参数名顺序不同
int f(int a,double b)int f(int b,double a)是不构成重载的

void ff(int a, char b)
{
	cout << a << " " << b << endl;

}

void ff(char a, int b)
{
	cout << a << " " << b << endl;

}

int main()
{
	ff(10,'a');
	ff('a',10);
}

以上三个情况就是各种类型的函数重载

其实还有一种情况,就是当重载和缺省在一起时:

void fff()
{
	cout << 1 << endl;
}

void fff(int a = 0)
{
	cout << a << endl;
}

上面2个函数都可以通过编译
当我们使用实参对缺省参数赋值fff(1),可以正常运行
但是无参调用时会出现歧义,会报错
fff(),编译器不知道是要调用无参的那么函数还是调用缺省参数函数,发生冲突,无法运行


函数重载是怎样实现的

C语言不支持函数重载,而C++却能支持,C++是如何支持的呢?

这其实是在编译链接过程中,利用函数名修饰规则实现的

我们先来看一下编译链接的过程,如果我们在test.h中声明了函数,在test.cpp中实现,在_test.cpp文件中调用
实验代码如下:

test.h

#include <iostream>
using namespace std;

int add(int a, int b);
double add(double a, double b);

test.cpp

#include "test.h"

int add(int a, int b)
{
	return a + b;
}

double add(double a, double b)
{
	return a + b;
}

_test.cpp

#include "test.h"

int main()
{
	add(1,1);
	add(1.1, 2.2);
	return 0;
}

编译链接过程如下图:
在这里插入图片描述

调用函数都会被转换成call+一个地址,这个地址就是函数的地址
在这里插入图片描述

所以,这段代码在编译过程中,需要call2次,本来call需要去找到函数的地址,但是函数的定义在test.cpp文件中,地址也在test.i文件中,当前还未链接,所以还找不到地址
在这里插入图片描述
下面接着编译链接,在链接时,会生成一个符号表,这里面有函数名和其地址,这时2个文件是链接在一起的了
,之后就会进行找函数地址操作

但是C语言中,规定的是通过函数名进行寻址,因为这里有2个姓名相同的函数名,所以找不到正确的地址
所以C语言才不支持函数重载

下面,我们也通过linux系统,给;能够更方便得观察到函数名修饰规则

我们先在linux环境下创建一个c语言文件test.c
在这里插入图片描述
然后我们通过下面这些操作可以看到这个代码的汇编代码:
在这里插入图片描述
从汇编代码中找到调用func函数的部分:
在这里插入图片描述

这也证实了C语言是通过函数名进行寻址的

下面我们看一下C++是什么样的

先写一个cpp文件
在这里插入图片描述
然后还是观察它的汇编代码
可以看见汇编代码中,2个func的名字变了,这里不是func
在这里插入图片描述

这其实就是函数名修饰规则

第一个调用的函数名是_Z4funci
-Z是编译器规定的长度
4是指函数名func的长度
func就是原函数命
最重要的就是i,它jiusint类型的缩写
同理,第二个函数名最后的id就是intdouble类型的缩写

这里也能看出来为什么饭返回值不同不会构成函数重载?
因为返回值不会进入到函数名修饰规则里
参数会进入函数名修饰规则里,参数不同,最后函数名也不同

所以到这里就理解了为什么C++支持函数重载了


最后我们思考一个问题

如果我们把函数名修饰规则修改,允许返回值的类型以某种方式进入规则中,那么返回值不会是否会导致函数重载?

答案是也不可以

因为如果遇到如下的代码,2个函数的函数名相同,没有参数或参数都相同,只有返回值不同

int a()
{
	printf("int\n");
}

double a()
{
	printf("double\n");
}

int main()
{
	a();
	return 0;
}

这样到了汇编阶段,调用函数时返回值类型是体现不出来的,所以编译器也不知道到底是调用哪个函数
所以不论怎样,返回值类型不同不会导致函数重载

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

找PPT模板就上这5个网站~

分享几个可以永久免费下载PPT模板、素材的网站&#xff0c;上万个模板随便下载&#xff0c;赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/search/ppt/0_0_0_1.html?vNTYxMjky 网站素材非常全面&#xff0c;主要以设计类素材为主&#xff0c;办公类素材也很多&#x…

Spring MVC 接收 json 和返回 json (14)

目录 总入口 测试case 源码分析 1. 针对RequestBody的参数解析 2. 针对 ResponseBody 的返回值处理 总入口 通过上一篇Spring MVC 参数解析&#xff08;13&#xff09;_chen_yao_kerr的博客-CSDN博客的说明&#xff0c;相信大家对Sping MVC的参数解析有了一定的了解&…

8. 优先队列

8. 优先队列 普通的队列是一种先进先出的数据结构&#xff0c;元素在队列尾追加&#xff0c;而从队列头删除。在某些情况下&#xff0c;我们可能需要找出队列中的最大值或者最小值&#xff0c;例如使用一个队列保存计算机的任务&#xff0c;一般情况下计算机的任务都是有优先级…

【有功-无功协调优化】基于改进多目标粒子群优化算法(小生境粒子群算法)的配电网有功-无功协调优化研究(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

中断嵌套实验

使用汇编语言&#xff0c;要求&#xff1a; 外部中断1可以嵌套外部中断0 没有中断时&#xff0c;8个LED发光二极管以0.1s的速度闪烁。 有外部中断0时&#xff0c;8个LED发光二极管以0.1s的速度流水点亮。&#xff08;中断子程序0&#xff09; 有外部中断1时&#xff0c;会打断外…

gdb调试常用指令及案例讲解

文章目录 前言一、常用指令二、案例说明1、测试源文件2、编译和调试 三、其他指令四、案例说明 前言 GDB是一个由GNU开源组织发布的、UNIX/LINUX 操作系统下的、基于命令行的、功能强大的程序调试工具。 GDB 支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调…

每天一道大厂SQL题【Day22】华泰证券真题实战(四)

每天一道大厂SQL题【Day22】华泰证券真题实战(四) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

2023软件测试工程师必备技能?要卷,谁还不会了......

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件测试岗位是怎…

day15 消息队列

目录 消息队列 消息队列的使用 发送消息 消息的接收 消息队列的控制 消息队列 概念&#xff1a; 消息队列是system V IPC对象的一种&#xff1b; 消息队列有消息队列ID来唯一标识&#xff1b; 消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等&a…

zabbix故障排查

zabbix server服务问题可以查看server日志 tail -f /var/log/zabbix/zabbix_server.log 根据日志中的error报错提示分析原因 zabbix agent服务问题可以查看agent日志 tail -f /var/log/zabbix/zabbix_agentd.log 根据日志中的error报错提示分析原因 zabbix的nginx服务问题可…

从零开始学架构-计算高性能

一、概述 高性能是每个程序员的追求&#xff0c;无论做一个系统、还是写一组代码&#xff0c;都希望能够达到高性能的效果。而高性能又是最复杂的一环&#xff0c;磁盘、操作系统、CPU、内存、缓存、网络、编程语言、数据库、架构等&#xff0c;每个都可能影响系统的高性能&…

【FPGA实验1】FPGA点灯工程师养成记

对于FPGA几个与LED相关的实验&#xff08;包括按键点灯、流水灯、呼吸灯等&#xff09;的记录&#xff0c;方便日后查看。这世界上就又多了一个FPGA点灯工程师了&#x1f60f; 成为一个FPGA点灯工程师分三步&#xff1a; 一、按键点灯1、按键点灯程序2、硬件实现 二、流水灯1、…

智慧医院微信小程序定制开发功能有哪些

无论是哪个时代&#xff0c;人们对于医疗资源的需求都没有消退过&#xff0c;尤其是随着经济条件的提高&#xff0c;人们也越来越关注健康问题。无论是生病就诊还是定期体检都要用到医疗资源。但是平时到医院好像什么时候都人满为患&#xff0c;排很长时间的队&#xff0c;不仅…

ChatGPT4 的体验 一站式 AI工具箱 -—Poe(使用教程)

最近由于人工智能聊天机器人的爆火(ChatGPT)&#xff0c;因此各种各样的AI助手流行与网络&#xff0c;各种各样的都有&#xff0c;不论是什么样的其实都是为了我们更方便的解决问题&#xff0c;今天介绍一款AI工具箱——Poe将多种AI集成与一个界面&#xff0c;大家可以一次感受…

SQL Server基础 第五章 函数的使用(日期、字符串、时间、数学、转换等函数)

前言 在SQL Server中提供了许多内置函数&#xff0c;SQL Server中的内置函数就相当于Java、C#等编程语言中的内置API函数。按照函数种类可以分为聚合函数、数学函数、字符串函数、日期函数和时间函数、转换函数和元数据的数6种。在本章中重点讲解比较常用的4种函数&#xff0c…

在线题库整理及一些刷题注意事项

在线题库整理及一些刷题注意事项 刷题站CSDN编程语言支持 LeetCode编程语言支持数据库语言支持 牛客网编程语言支持数据库语言支持 洛谷编程语言支持 AcWing编程语言支持 蓝桥编程语言支持 做题的两种模式调用模式委托模式 注意事项小结 刷题站 老顾一个人单打独斗太久了&…

如何使用ffmpeg给视频减震去抖

之前自己发过一些记录仪拍下来的画面&#xff0c;你们可能已经看过了&#xff0c;例如&#xff1a; 最适合骑行的罐装饮料 然而&#xff0c;自己这个骑行记录仪&#xff0c;仅仅是很低端的一款&#xff0c;防抖功能很差&#xff0c;远远比不了GoPro那些高端的户外运动记录仪&am…

Qt扫盲-QAbstractSeries理论总结

QAbstractSeries理论总结 一、概述二、常用函数1. 属性2. 设置功能3. 显示隐藏4. 与 绘图的交互 三、信号 一、概述 QAbstractSeries类是所有Qt图表线的基类。通常&#xff0c;特定于序列类型的继承类会被使用&#xff0c;而不是这个基类。这个基类只是提供了一些管理和控制这…

再聊 MySQL 聚簇索引

为什么是再次理解呢&#xff1f;因为松哥之前写过相关的文章介绍过聚簇索引&#xff0c;但是感觉还不够&#xff0c;因此今天想再来和小伙伴们聊一聊这个话题。 1. 什么是聚簇索引 数据库的索引从不同的角度可以划分成不同的类型&#xff0c;聚簇索引便是其中一种。 聚簇索引…

数据库基础篇 《4. 运算符》

目录 1. 算术运算符 1&#xff0e;加法与减法运算符 2&#xff0e;乘法与除法运算符 3&#xff0e;求模&#xff08;求余&#xff09;运算符 2. 比较运算符 1&#xff0e;等号运算符 2&#xff0e;安全等于运算符 3&#xff0e;不等于运算符 4. 空运算符 5. 非空运算…
最新文章