【C++】缺省参数和函数重载

 

目录

1.缺省参数

1.1缺省参数的定义

1.2  缺省参数的简单应用 

1.3 缺省参数分类:全缺省参数和半缺省参数

1.3.1半缺省参数

1.3.2全缺省参数

3.缺省参数注意事项:缺省参数不能在函数声明和定义中同时出现  

4.函数重载

4.1 函数重载概念

4.2 函数参数类型不同的函数重载

4.3函数参数个数不同的函数重载 

4.4 顺序不同也可以归类为类型不同

5.c++支持函数重载/c语言不支持函数重载的原因


 

1.缺省参数

1.1缺省参数的定义

缺省参数是声明或定义函数时函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参。

void Print(int x = 8)
{
	cout << x << endl;

}

这里的x就是一个缺省参数,如果我们调用这个函数的时候我们给函数传入参数,则使用的是我们传入的参数,如果我们调用这个函数不给这个函数传入参数,则某认使用缺省参数的值。

1.2  缺省参数的简单应用 

在我们写栈的初始化或者顺序表的初始化的时候,如果我们知道要开多大的空间,我们可以直接给函数传入空间大小的值,如果不知道的情况下,我们可以利用缺省参数固定开多少空间。使得函数参数调用非常灵活。

void Func(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl << endl;
}

int main()
{
	Func();
	Func(1);
	Func(1,2);
	Func(1,2,3);

	return 0;
}

1.3 缺省参数分类:全缺省参数和半缺省参数

1.3.1半缺省参数

参数缺省部分

特点:缺省值只能从右往左给,必须是连续的。

这两种方式都是错误的,因为函数调用传参的时候会有争议。 

1.3.2全缺省参数

函数的所有参数都设置缺省值

void Func(int a = 10, int b = 20, int c = 30)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl << endl;
}

int main()
{
	Func();
	Func(1);
	Func(1,2);
	Func(1,2,3);

	return 0;
}

全缺省参数不可以之传递中间的某一个或者某几个值。不要间隔着传

3.缺省参数注意事项:缺省参数不能在函数声明和定义中同时出现  

因为害怕函数声明的时候是一个参数值,函数定义的时候又是一个参数值,没有办法有一个标准

但是也不能定义是缺省参数,函数声明没有, 所以如果声明和定义分离,只能在声明地方给缺省参数。因为有些地方只用到函数的声明,所以以声明为主,然后定义可以不用给。

缺省值一般是常量或者全局变量,但是一般是变量 ,c语言不支持缺省。

4.函数重载

在汉语或者自然语义中,一个词通常有多个意义,人们可以根据不同的环境和语态来理解一个词的不同意思比如:卧槽,那么我们就说这个词被重(chong)载了.

4.1 函数重载概念

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

也就是说函数名可以相同但是参数不同(参数的个数,类型,顺序不同)但是对返回值没有要求(可同可不同)

4.2 函数参数类型不同的函数重载

int Add(int left, int right)
{
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}

int main()
{
	Add(10, 20);
	Add(10.1, 20.2);
	
	return 0;
}

看着是两个相同的函数,但是编译器会去匹配,C语言不可以这样写

如果我们使用:Add(1,2.2)这样的方式传参,编译会报错,因为我们知道整型和浮点型之间是会有隐式类型转换的,对于两个参数来说到底是double转int还是int 转double是有争议的,所以编译不过,

但是我们要是屏蔽其中一个函数就可以编译通过:

因为此时就没有争议了。

4.3函数参数个数不同的函数重载 

// 2、参数个数不同
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
	cout << "f(int a)" << endl;
}


int main()
{
	/*Add(10, 20);
	Add(10.1, 20.2);
	*/
	f();
	f(10);

	return 0;
}

函数重载和缺省参数

缺省参数的有和没有不影响两个同名函数构成函数重载,因为属于参数个数不同的类型,但是在调用这两个函数的时候,不传参数的情况下就有歧义

4.4 顺序不同也可以归类为类型不同

// 3、参数类型顺序不同
void f(int a, char b)
{
 cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
 cout << "f(char b, int a)" << endl;
}

为什么不能是返回值不同:

返回值不同不能够构成区分函数的条件,存在调用歧义。

5.c++支持函数重载/c语言不支持函数重载的原因

多文件编译的时候是需要使用函数名去寻找函数地址的,因为只有函数声明,同名函数要得以区分就要用函数名修饰规则。

在代码编译运行的过程中,在编译阶段会形成符号汇总,这时候的函数声明等没有具体的地址,具体的地址是函数实现的地址,但是编译器会让通过,就像打了一个欠条,在汇编的时候形成符号表,这个时候将函数名和地址合在一起,形完整的符号表,后续调用这个函数,就可以call这个函数的地址。C语言不存在同名函数,链接函数时就用函数名去找。

 

但是c++中 存在同名函数,寻找函数地址时就不以函数去找,不同编译器下的解决方案不同,在在linux下:

linux下函数名修饰规则:call函数的时候使用这样的地址去找这个函数,类型不同修饰的函数就不同,得以区分同名函数)

_Z是前缀   +函数名的字符个数+函数名+参数的首字母

gcc编译c语言代码:使用函数名寻找

 

g++编译,:使用修饰过后的函数名去寻找,区分了同名函数。

 

不同的编译器区分规则是不一样的,linx下更直观一些。

6.结语

上述就是今天分享的内容,如果大家觉得有用,创作不易,希望收获三连。我是Nicn,欢迎一起交流学习。

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

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

相关文章

matlab使用教程(35)—求解时滞微分方程(3)

1中立型 DDE 以下示例说明如何使用 ddensd 求解中立型 DDE&#xff08;时滞微分方程&#xff09;&#xff0c;其中时滞出现在导数项中。此问题最初由 Paul [1] 提出。方程是&#xff1a; 由于该方程在 y ′ 项中存在时滞&#xff0c;因此该方程称为中立型 DDE。如果时滞仅出现…

基于SSM的基于个人需求和地域特色的外卖推荐系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的基于个人需求和地域特色的外卖推荐系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

10 - 三态门和寄存器

1. 三态门 1.1 引入背景 现在我们需要封装一个单字节存储器。 Clear 清零&#xff0c;Pre 置 1&#xff0c;CP 的上升沿将输入 DI 数据写入。 问题&#xff1a;总线冲突。如果将多个存储器连到一起&#xff0c;就会出现一个输入连到多个输出发生数据冲突的问题。 需要三态门…

【单片机家电产品学习记录--红外线】

单片机家电产品学习记录–红外线 红外手势驱动电路&#xff0c;&#xff08;手势控制的LED灯&#xff09; 原理 通过红外线对管&#xff0c;IC搭建的电路&#xff0c;实现灯模式转换。 手势控制灯模式转换&#xff0c;详细说明 转载 1《三色调光LED台灯电路》&#xff0c…

计数排序解读

当我们提及排序算法时&#xff0c;通常会想到冒泡排序、选择排序、插入排序、归并排序和快速排序等经典算法。然而&#xff0c;今天我们要探讨的是一种非比较型整数排序算法——计数排序。计数排序在某些特定场景下表现出色&#xff0c;具有线性的时间复杂度。下面我们将深度剖…

SYS-2722音频分析仪SYS2722

181/2461/8938产品概述&#xff1a; Audio Precision 2722 音频分析仪是 Audio Precision 屡获殊荣的 PC 控制音频分析仪的旗舰型号&#xff0c;长期以来一直是音频设备设计和测试的全球公认标准。功能齐全的 SYS-2722 提供了测试转换器技术最新进展所需的无与伦比的失真和噪声…

NoSQL概述

NoSQL概述 目录 一、为什么用NoSQL 二、什么是NoSQL 三、经典应用分析 四、N o S Q L 数 据 模 型 简 介 五、NoSQL四大分类 六、CAP BASE 一、为什么用NoSQL 1、单机MySQL的美好年代 在90年代&#xff0c;一个网站的访问量一般不大&#xff0c;用单个数据库完全可以轻松应…

Linux离线安装python3(源码编译)

1、下载python包 下载python3.9.6的源码包 python下载 下载后&#xff0c;解压&#xff0c;目录如下&#xff1a; -rw-------. 1 root root 1454 Aug 26 2023 anaconda-ks.cfg -rw-r--r--. 1 root root 25640094 Apr 4 21:52 Python-3.9.6.tgz drwxrwxr…

搭建电商购物独立站抓取主流电商产品数据的方法:工具+电商数据采集API接口

分享一个抓取数据产品的方法&#xff0c;也是别人给我说的。 想做一个联盟产品相关的网站&#xff0c;然后需要采集电商网站的产品。咨询大佬告诉我&#xff0c;大量级电商商品数据的采集可以接入专业的电商数据采集API接口&#xff0c;也可以用webscrsper&#xff0c;于是乎就…

秒懂Springboot之如何使用logback做日志脱敏和截取

[版权申明] 非商业目的注明出处可自由转载 出自&#xff1a;shusheng007 文章目录 前言日志logback原理实现原理方案 技术总结总结源码 前言 日志的重要性无需多言&#xff0c;而数据的安全性亦不用赘述&#xff0c;但不幸的是它两常常产生矛盾。要便利就会牺牲安全&#xff0…

【MySQL】如何判断一个数据库是否出问题

在实际的应用中&#xff0c;其实大多数是主从结构。而采用主备&#xff0c;一般都需要一定的费用。 对于主备&#xff0c;如果主机故障&#xff0c;那么只需要直接将流量打到备机就可以&#xff0c;但是对于一主多从&#xff0c;还需要将从库连接到主库上。 对于切换的操作&a…

阿里云无影云电脑具体价格_4核8G和8核16G配置99元一年

2024年阿里云无影云电脑具体价格99元一年起&#xff0c;配置可选4核8G和8核16G&#xff0c;使用时长可选800小时和1800小时&#xff0c;目前有四款无影云电脑可以享受优惠价格&#xff0c;阿里云服务器网aliyunfuwuqi.com整理2024年无影云电脑详细配置和优惠价格表&#xff0c;…

ARMv8/Armv9架构中cacheable属性的介绍

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 思考&#xff1a;在页表的Descriptors中的Lower attributes中的AttrIndx中指向的MAIR_EL1寄存器中有配置cacheable属性, 在TCR_EL1寄存器中有cacheable属性位ORGN0、IRGN0、ORGN1…

每日五道java面试题之ZooKeeper篇(三)

目录&#xff1a; 第一题. 会话管理第二题. 服务器角色第三题. Zookeeper 下 Server 工作状态第四题. 数据同步第五题. zookeeper 是如何保证事务的顺序一致性的&#xff1f; 第一题. 会话管理 分桶策略&#xff1a;将类似的会话放在同一区块中进行管理&#xff0c;以便于 Zoo…

C语言第四十弹---预处理(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 预处理 1、#和## 1.1 #运算符 1.2、##运算符 2、命名约定 3、#undef 4、命令行定义 5、条件编译 6、头文件的包含 6.1、头文件被包含的方式 6.1.1、本地…

蓝桥杯-冶炼金属(二分求最大最小)

P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 二分做法&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long const int N 1e410; int n,a,b; int v[N],cnt[N]; int check(int x){for(int i1;i<n;i…

硬件-1、体系架构

cpu 处理器 arm处理器的七种工作模式 arm寄存器 两张图是一样的&#xff0c;r0---r12是通用寄存器。其他寄存器可参考图一&#xff0c;cpu架构。 程序状态寄存器psr&#xff08;cpsr/spsr&#xff09; 程序异常处理 理解示例 当使用swi&#xff08;软中断指令&#xff09;指令…

RabbitMQ3.13.x之十_流过滤的内部结构设计与实现

RabbitMQ3.13.x之十_流过滤的内部结构设计与实现 文章目录 RabbitMQ3.13.x之十_流过滤的内部结构设计与实现1. 概念1. 消息发布2. 消息消费 2. 流的结构1. 在代理端进行过滤2. 客户端筛选3. JavaAPI示例4. 流过滤配置5. AMQP上的流过滤6. 总结 3. 相关链接 1. 概念 流过滤的思…

大算力芯片,正在拥抱Chiplet

随着摩尔定律走到极限&#xff0c;Chiplet被行业普遍认为是未来5年算力的主要提升技术。 在和业内人士交流时&#xff0c;有人曾表示&#xff1a;“要么业界采用Chiplet技术&#xff0c;维持摩尔定律的影响继续前进&#xff0c;要么就面临商业市场的损失。” 随着摩尔定律走到…

使用ADS确定元器件的等效感值与等效容值

使用ADS确定元器件的等效感值与等效容值 使用Win家的ADS的PDK&#xff0c;里面有一些微带电感结构&#xff0c;但是居然没有标注感值&#xff0c;给设计带来了一定的不便。 那么对于一个电路结构&#xff0c;如微带线、微带螺旋电感&#xff0c;我们如何知道其实际的感值、容…