【C++】函数重载

news2024/9/21 4:31:56

函数重载

  • 1.函数重载的背景
  • 2.函数重载的概念
  • 2.1参数类型不同的重载
  • 2.2参数个数不同的重载
    • 2.3参数类型顺序不同的重载
    • 2.4注意事项:仅仅是返回值不同无法构成函数重载
  • 3.C++函数重载的原理---函数名字修饰
  • 4.函数重载总结

1.函数重载的背景

C语言中,我们写一个这样的一个函数

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

这是一个求两个数之和的函数,但是这样写有一个不足之处就是该函数只能求int类型的和,如果我们是double类型的和,这个函数就没办法完成,需要重新写一个double类型的求和函数

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

但是这时候因为在C语言函数名不能一样,所以我们一个加法函数就会有很多命名,这会造成不必要的麻烦,那么我们能不能将这个加法函数名统一成一个函数名呢

于是C++引入了函数重载。

2.函数重载的概念

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

2.1参数类型不同的重载

int Add(int a, int b)
{
	return a + b;
}
double Add(double a, double b)
{
	return a + b;
}

2.2参数个数不同的重载

void fun()
{
	cout << "无参数" << endl;
}
void fun(int a)
{
	cout << a << endl;
}
int main()
{
	fun();//调用fun()打印无参数
	fun(1);//调用fun(int a),打印1
	return 0;
}

2.3参数类型顺序不同的重载

void fun(int a,char b)
{
	cout << a << b << endl;
}
void fun(char a,int b)
{
	cout << b << a << endl;
}
int main()
{
	fun(1,'a');//调用fun(int a,char b),打印1a
	fun('b', 2);//调用fun(char a,int b)打印2b
	return 0;
}

2.4注意事项:仅仅是返回值不同无法构成函数重载

如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分


错误写法!!!

void  f()
{
	cout << "无返回值" endl;
}
int f()
{
	return 1;
}
int main()
{
	int a = f();//编译器不知道调用哪个函数
	f();//有返回值也不一定要接收,所以无法区分
	return 0;
}

在这里插入图片描述

3.C++函数重载的原理—函数名字修饰

C++如何追踪每一个重载函数呢?它给这些函数指定了一个身份。使用C++开发工具中的编译器编写和编译程序时,C++编译将执行一个神奇的操作----名称修饰(name decoratiom)或名称矫正(name mangling),它根据函数原型中指定的形参类型对每个函数名加密。
请看下述未经修饰的函数原型:
double fun(int,double);
这些各式对于人类来说很适合;我们知道函数接受两个参数(一个为int类型,另一个为double类型),并返回一个double 值。而编译器将名称转换为不太好看的内部表示,来描述该接口,如下所示:
?fun@@YAXH
对原始名称进行的表面看起来无意义的修饰(或矫正)将对参数数目和类型进行编码。添加的一组符号随函数特征标而异。而修饰使用的约定随编译器而异,不同编译器的修饰规则不同。

总的来说就是,C++的函数,进行函数重载的时候,一些表面看上去名字相同,
但是底层的是进行了名称修饰的,编译器根据这些名称修饰去区分这些相同名称的函数。

而C语言是没有这种函数修饰的,它是直接根据函数名去寻找对应函数的。

4.函数重载总结

C++函数重载解决了C语言因为数据类型不同而功能相同时的问题
构成函数重载的三个条件是:
1.数据类型不同
2.参数数量不同
3.数据类型顺序不同
只有C++有函数重载,因为编译器底层会对C++函数名称进行修饰
C语言无名称修饰

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

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

相关文章

通信原理 | 基本概念

1 通信及通信系统 通信(Communication)是实现信息和消息传输的过程 通信系统(Communication System)的组成: 实现通信的所有硬件和软件设备、传输媒介以及各种通信协议等 消息(Message)、信息(Information)、信号(Signal)的区别: 消息通常指人的感官能够感受到的…

无刷电机高压与低压的选择与未来发展前景

近几年来&#xff0c;伴随无刷马达被戴森吸尘器全力以赴运用在家用电器上&#xff0c;颠覆了传统家电的3个产品运用场景&#xff0c;吹风筒就是这样的一个例子。 迅速风筒由于其加工工艺的创新能力&#xff0c;给大家增添了不一般的产品体验度。新型的迅速风筒&#xff0c;搭配…

2023我的前端面试小结

对事件委托的理解 &#xff08;1&#xff09;事件委托的概念 事件委托本质上是利用了浏览器事件冒泡的机制。因为事件在冒泡过程中会上传到父节点&#xff0c;父节点可以通过事件对象获取到目标节点&#xff0c;因此可以把子节点的监听函数定义在父节点上&#xff0c;由父节点…

Elasticsearch:利用搜索提高医疗保健公平 - 用多语言 NLP 模型和分析来改善最终用户体验

随着更高生产力和更健康的人群寿命更长&#xff0c;医疗保健将成为社会最重要的方面之一。 COVID-19 大流行加速了现代技术的采用&#xff0c;并凸显了患者体验的重要性。 随着越来越多的消费者开始控制他们的数据&#xff0c;医疗保健系统变得捉襟见肘。 根据德勤和斯科茨代尔…

【High 翻天】Higer-order Networks with Battiston Federico (5)

目录扩散高阶扩散题外话高阶随机游走扩散 在给出建模之后&#xff0c;接下来讨论如何将传统意义下的扩散拓展到高阶系统。扩散是一个线性过程&#xff0c;但在许多不同的情况下都有强相关性。扩散这个词实际可指代两个不同的过程&#xff1a; 标准的扩散过程&#xff0c;或者…

课题-基于安卓androidstudio的校园外卖app

一、课题介绍 客户端&#xff1a; 1&#xff1a;登录注册&#xff1a;用户可以通过自己的信息进行账号的注册 2&#xff1a;商家搜索&#xff1a;可以对商家的信息进行模糊搜索 3&#xff1a;查看菜单&#xff1a;点击商家可以查看具体的菜单信息 4&#xff1a;添加购物车&…

SAP FICO 财务月结--自动清账

一、基本概念 清账是会计科目的借贷挂账后的核销&#xff0c;其中包括客户、供应商以及实行未清账管理的总账科目等。 客户和供应商的清账通常会在收款或者付款的时候同时完成&#xff0c;也就是边收边清或者边付边清&#xff0c;也可以后续手工清账&#xff08;客户F-32&…

人脸清晰化神器codeFormer图形界面包GUI

1. codeFormer介绍 在NeurIPS 2022上&#xff0c;南洋理工大学-商汤科技联合研究中心S-Lab提出了一种基于VQGANTransformer的人脸复原模型CodeFormer&#xff0c;效果是真的强大&#xff0c;先展示下效果&#xff0c;用的官方案例效果图。 官方给出的代码见这里 传送门 2. 图…

Python数组存储方式与向量化、按行按列展平/展开

文章目录1 逻辑存储与内存存储1.1 高维张量1.2 按行展开和按列展开2 矩阵向量化、按行按列展开2.1 numpy中&#xff1a;numpy.ravel()ndarray.flatten()2.2 Pytorch中&#xff1a;3 pytoch中的view&#xff0c;reshape&#xff0c;permute对比3.1 view3.2 reshape3.3 permute链…

Redis缓存雪崩缓存击穿缓存穿透

Redis缓存雪崩&缓存击穿&缓存穿透一 缓存更新策略二 缓存雪崩三 缓存击穿四 缓存穿透一 缓存更新策略 目前redis缓存更新存在3种主流策略&#xff0c;分别是&#xff1a;内存淘汰、超时剔除、主动更新。 1、内存淘汰 LRU/LFU/FIFO算法剔除&#xff1a;例如maxmemory-…

【云原生进阶之容器】第二章Controller Manager原理2.4节--Informer机制剖析

1 Informer机制剖析 如上图所示,client-go 包中一个非常核心的工具就是 informer,informer 可以让与 kube-apiserver 的交互更加优雅。 Informer的主要作用包括如下两个方面: 同步数据到本地缓存。Informer 会不断读取 Delta FIFO 队列中的 Object,在触发事件回调之…

MySQL8.0锁情况排查

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a; 杨延昭文章来源&#xff1a;GreatSQL社区投稿 在数据库中&#xff0c;除传统的计算资源(CPU、RAM、IO)的争用…

【C语言】-关于指针的知识你真的都知道了??快进来看看这里面的指针会让你眼前一亮

&#x1f387;作者&#xff1a;小树苗渴望变成参天大树 &#x1f38a;作者宣言&#xff1a;认真写好每一篇博客 &#x1f389; 作者gitee:link 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 指针进阶&#x1f4a6;前言&#x1f496;一、…

MYSQL 数据行列交换(交换数据) 存储过程实现

行列转换的存储过程 初始图&#xff1a; 效果图&#xff1a; 实现过程&#xff1a; 1&#xff1a;建表、建数据 CREATE TABLE changeprice ( id bigint(20) NOT NULL auto_increment, sid bigint(20) NOT NULL, datecreated timestamp NOT NULL defaultCURRENT_TIMESTAMP…

nvue2中使用axios和插槽

一、组件的生命周期1、组件的生命周期经历的阶段&#xff1a;&#xff08;1&#xff09;创建阶段&#xff1a;beforeCreate、created、beforeMount、mounted&#xff08;2&#xff09;运行阶段&#xff1a;beforeUpdate、update&#xff08;3&#xff09;销毁阶段&#xff1a;2…

C语言二维数组和二重指针详解

二维数组 一个二维数组&#xff0c;在本质上&#xff0c;是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组&#xff0c;形式如下&#xff1a; type arrayName [x][y]; 这个表示&#xff0c;有x个一维数组&#xff0c;每个一维数组的元素个数是y个。 声明示例&#xff1…

手写VITE-MockJS插件

mockJS是什么 mockJS是模拟接口数据&#xff0c;拦截客户端的请求的一个工具。 vite插件编写流程 pnpm init 初始化 pnpm install vite -D 安装Vite 配置package.json文件中的脚本 "scripts": {"dev": "vite","build": "vite…

K8s集群离线安装-kubeadm-详细篇

1、部署k8s的两种方式&#xff1a;kubeadm 和二进制源码安装 #本次实验采用的部署Kubernetes方式&#xff1a; kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。2、环境准备 #服务器要求&#xff1a; 建…

JavaSE学习day1_02, JDK安装

1.4 环境变量 1.4.1 为什么配置环境变量 在初次学习编程的时候,环境变量我们经常提到,但是环境变量到底是什么?是干嘛的?弄清楚这些问题很重要. 如果我们想要在CMD的任意路径下都可以打开任意的软件&#xff0c;那么就需要把软件的路径配置到环境变量当中。 为了便于大家…

Zotero | 快速入门

文章目录0. 前言1. Zotero快速入门1.1 下载Zotero和Connector2.2 联动sci-hub实现英文文献批量下载2.3 英文文献翻译2.4 中文文献元数据识别2.5 Zotero其他配置2.5.1 语言切换2.5.2 数据存储位置更改参考0. 前言 Zotero是一款自由及开放源代码的文献管理软件&#xff0c;管理书…