C++缺省参数的具体使用

news2025/1/21 11:59:16

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】
在这里插入图片描述

本文来详细介绍C++中的缺省参数。正文开始:

目录

  • 一、缺省参数概念
  • 二、缺省参数分类
    • 2.1全缺省
    • 2.2半缺省
  • 三、缺省参数传参样例
  • 四、缺省参数不能在函数声明和定义中同时出现
  • 五、总结

一、缺省参数概念

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

二、缺省参数分类

2.1全缺省

我们具体来意一小截代码:

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

上面代码中void fun(int a = 0)中的int a = 0,即在形参的位置上给a赋值了0,这就是缺省参数。意思就是我们在进行函数传参的时候,我们既可以不给a进行赋值,也可以给a进行赋值。就比如:
在这里插入图片描述
在这里插入图片描述
当函数中有三个参数时,请看:
在这里插入图片描述

在这里插入图片描述
注意这里实参传给形参的顺序是从左到右的,而栈帧调用的压参数,即参数入栈有的地方是从左往右有的地方是从右往左(具体取决于编译器)
还要注意,我们是不可以跳着进行传参的。
比如:
在这里插入图片描述
这里记住就好,即缺省参数不可以跳着进行传参。因为我们的祖师爷(本贾尼)当时就是这么规定的。
以上的缺省就是全缺省。

2.2半缺省

下面来看半缺省,即我们缺省部分参数(并不是缺省一般)。
注意我们的半缺省的顺序是从右往左进行缺省的,如果我们从左往右进行缺省传参,就会报错,请看:
在这里插入图片描述
所以我们要从右往左进行缺省。比如:

//半缺省
void func(int a, int b, int c = 3)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl << endl;
}
int main()
{
	func(4, 5);
	func(4, 5, 6);
	return 0;
}

在这里插入图片描述
还有一点需要我们注意,半缺省是我们不可以什么都不全,如下图:
在这里插入图片描述
上图错误就是因为半缺省时一个参数都没有传导致的,上图的半缺省我们至少要传两个才可以。比如:

//半缺省
void func(int a, int b, int c = 3)
{
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl << endl;
}
int main()
{
	func(4, 5);
	/*func(4, 5);
	func(4, 5, 6);*/
	return 0;
}

在这里插入图片描述

三、缺省参数传参样例

缺省参数具体有什么用途呢?我们就拿栈的初始化来举例:

在这里插入图片描述
上图的栈经过初始化后可以存放4个数据,但是如果我们此时想插入100个、甚至是1000个数据的话,就需要我们不断的进行扩容,所以就很麻烦,这个时候我们就可以这样:
在这里插入图片描述
这样会减少一点扩容带来的消耗。
倘若现在我们对栈进行初始化的时候不知道要插入多少个数据,我们就可以用缺省参数来解决问题,请看:
在这里插入图片描述
这里我们不知道要插入多少个数据,所以就默认情况下开辟4个。如果想要控制要插入多少个数据的话直接显式的传参就好了:
比如:
在这里插入图片描述
好了,就到这里,以上内容就是C++缺省参数的具体使用。

四、缺省参数不能在函数声明和定义中同时出现

如果缺省参数在声明和定义中同时出现的话,就会报错,比如:
在这里插入图片描述
所以,缺省参数不能在函数声明和定义中同时出现,因为如果我们声明和定义如果默认参数不一致的话,我们应该听谁的呢?比如在声明中默认参数是4,而到了定义中默认参数是40,那到底默认参数是几呢?故缺省参数不能在函数声明和定义中同时出现

还有一个问题就是缺省参数到底是声明给呢还式定义给呢?
我们先来看看定义给:
在这里插入图片描述

在这里插入图片描述

我们发现如果定义给的话报错了,主要问题就是函数不接受一个参数
首先在编译阶段的预处理阶段,在两个.cpp文件中展开.h头文件两个.cpp文件在编译阶段各走各的(在链接阶段才会合到一起),
这里出错是在编译阶段就报错了,因为我们包含的头文件是.h,而.h文件中只有声明没有定义而编译器在处理的时候发现一开始传参传了两个参数,后来就值传了一个参数,请看下图:
在这里插入图片描述
故缺省参数定义给是不可以的。
那如果是声明给呢,请看:
在这里插入图片描述
这里我们发现程序是可以正常运行的,当编译器处理StackInit(&st1, 100);的时候按照正常传参即可(跟缺省参数没有什么关系);而当编译器处理StackInit(&st2);的时候,我们由于在声明中给了缺省,所以编译器在编译的时候,我们可以认为编译器会把StackInit(&st2);转换为StackInit(&st2,4);,所以对于函数定义而言根本不需要关心到底是不是缺省的,因为函数定义的时候都要传两个参数给它,所以声明调用的时候如果只有一个参数,会转换成两个参数。故缺省参数声明给而定义不给

五、总结

1.缺省参数(也叫默认参数)分为部分缺省和全缺省。
2.缺省参数不能在函数声明和定义中同时出现,同时缺省参数只能给声明而不能给定义(编译器会自动转换)。
3.缺省参数可以提供更加灵活的函数调用(可以理解为弥补C的一个短板吧)。

好了,以上就是缺省参数的全部内容,就到这里吧。
再见了各位!!!

在这里插入图片描述

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

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

相关文章

Linux上搭建Discuz论坛

一.准备工作 1.下载php*&#xff0c;mariadb-server 2.上传Discuz3.5压缩包并解压 二.搭建过程 基于redhat 9 版本和Discuz3.5&#xff0c;php8.0&#xff0c;mariadb10.5演示 一.准备工作 1.下载php*&#xff0c;mariadb-server [rootredhat9 aaa]# yum install -y php*…

300元的蓝牙耳机什么牌子好?300内无线蓝牙耳机推荐

感受过无线的自在舒适后&#xff0c;越来越多的小伙伴爱上了蓝牙耳机白天出街更潇洒&#xff0c;目前市面上蓝牙耳机琳琅满目可选择性较多价格从几十、几百元到数千元不等然而蓝牙耳机的安全性、舒适性如何&#xff1f;连接稳吗&#xff1f;下面整理了几款300元价位的耳机分享给…

前端配置项

默认下载安装所需插件的时候会自动添加配置&#xff0c;但有时候可能需要自己去配&#xff0c;比如系统重装&#xff08;重装的是C盘&#xff0c;系统变量会丢失&#xff0c;软件在其他盘符并不需要重新下载&#xff09;。 前端开发涉及到需要配置变量的软件有&#xff1a;git…

JVM之GC日志解读

通过阅读Gc日志&#xff0c;我们可以了解Java虚拟机内存分配与回收策略。 内存分配与垃圾回收的参数列表 -XX:PrintGC 输出GC日志。类似&#xff1a;-verbose:gc -XX:PrintGCDetails 输出GC的详细日志 -XX:PrintGCTimestamps 输出GC的时间戳&#xff08;以基准时间的形式&#…

如何进行帕累托分析

【面试题】有一张“学生成绩表”&#xff0c;包含3个字段&#xff1a;学号、课程、成绩。 问题&#xff1a;找出每门课程A类和B类的学生&#xff0c;判断标准是累计占比&#xff0c;0~60%的记为A类&#xff0c;60%~85%记为B类 【解题思路】 什么是二八定律&#xff1f; 二八定律…

Java通过显示弹奏音乐的方式来实现继承的有关方法

目录 前言 一、Music.java类 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 二、Brass.java类 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 三、Wind.java类 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 四、Instrument.java类 1.1运行流程&…

世界领先的电动汽车国际标准 一 ISO 15118全系列

世界领先的电动汽车国际标准 一 ISO 15118全系列 ISO 15118 的官方名称是“道路车辆——车辆到电网的通信接口”。我可能有点偏见&#xff0c;因为我是该国际标准的共同作者之一&#xff0c;但我坚信 ISO 15118 是当今可用的最重要和面向未来的标准之一。 ISO 15118 中内置的…

C语言学习分享(第三次)------了解C语言-下

了解C语言-下 前言知识列表1. 函数1.1认识函数1.2 自己实现函数1.3 注意事项以及函数的好处 2. 数组2.1 认识数组2.2 数组的下标 3. 操作符3.1 算数操作符3.2 移位操作符和位操作符3.3 赋值操作符3.4 单目操作符3.5 关系操作符3.6 条件操作符3.7 逗号表达式 4. 常见关键字4.1 关…

开源正当时,共赢新未来 OpenHarmony开发者大会成功召开

4月19日&#xff0c;以“开源正当时&#xff0c;共赢新未来”为主题的开放原子开源基金会OpenHarmony开发者大会2023&#xff08;以下简称“大会”&#xff09;成功举办。 本次大会由开放原子开源基金会指导&#xff0c;OpenHarmony项目群工作委员会主办&#xff0c;华为、开鸿…

Windows逆向安全(一)之基础知识(九)

汇编比较三种循环 众所周知&#xff0c;在C语言可以使用可以使用三种循环&#xff0c;分别是&#xff1a;while、do…while和for 本文从汇编的角度出发&#xff0c;观察这三种循环的差异 范例代码 先贴出三种循环的代码&#xff0c;分别用这三种循环计算 0123456789&#…

【PyTorch】第三节:反向传播算法

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;PyTorch 描述&#x1f3a8;&#xff1a;PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语&#x1f493;&#xff1a;&#x1f43e;没有白走的路&#xff0c;每一步都算数&#…

SpringBoot高校毕业生就业信息管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot框架开发的高校毕业生就业信息管理系统项目。首先&#xff0c;这是一个响应式的项目&#xff0c;代码…

五:用户空间内存分配

目录 用户空间内存分配 mmap malloc 用户空间内存分配 mmap 将内核空间直接映射到用户空间&#xff0c;省去从内核到用户空间的内存拷贝。 mmap的缺点 mmap 使用时必须实现指定好内存映射的大小&#xff0c;因此 mmap 并不适合变长文件&#xff1b;mmap如果更新文件的操作…

【通过Cpython3.9源码看看python字符串的缓存机制】

基本说明 在CPython中&#xff0c;字符串intern机制是一种字符串对象缓存机制&#xff0c;用于避免创建多个相同内容的字符串对象&#xff0c;以减少内存使用。具体来说&#xff0c;如果两个字符串对象的内容相同&#xff0c;那么这两个字符串对象实际上会共享同一块内存空间。…

【Vue基础】前端工程化Vue项目

一、创建Vue项目步骤 1、新建一个文件夹&#xff0c;起名为vue_project01 2、在该文件夹中打开cmd&#xff0c;输入指令vue ui&#xff0c;打开图形化界面 3、此时跳转到网页&#xff0c;根据以下步骤配置vue项目 1&#xff09;项目名命名为test01&#xff1b;选择包管理器为…

使用R语言进行方差分析(ANOVA、ANCOVA)(一)

方差分析&#xff08;一&#xff09; 1. ANOVA模型拟合1.1 aov()函数1.2 表达式中各项的顺序 2. 单因素方差分析&#xff08;One-Way ANOVA&#xff09;2.1 绘制各组均值及其置信区间的图形2.2 多重比较-TukeyHSD2.2.1 成对比较图2.2.2 多重均值比较-TukeyHSD&#xff08;更易理…

图的存储(邻接矩阵邻接表)

图的存储 文章目录 图的存储1 邻接矩阵1.1 邻接矩阵存储结构定义1.2 完整代码应用 2 邻接表2.1 邻接表存储结构定义2.2 完整代码应用 1 邻接矩阵 A [ i ] [ j ] 1 A[i][j]1 A[i][j]1 表示顶点i与顶点j邻接&#xff0c;即i与j之间存在边或者弧。 A [ i ] [ j ] 0 A[i][j]0 A…

使用jdk17 搭建Hadoop3.3.5和Spark3.3.2 on Yarn集群模式

搭建Hadoop3.3.5和Spark3.3.2 on Yarn集群模式&#xff0c;使用jdk17 搭建Hadoop3.3.5和Spark3.3.2 on Yarn集群模式1. 创建一台虚拟机2. 安装jdk17&#xff08;1&#xff09;下载jdk17&#xff08;2&#xff09;安装jdk17&#xff08;3&#xff09;配置环境变量 3. 虚拟机之间…

【音视频第15天】webRTC协议(2)

目录 协议ICESTUNNATTURNSDPSDP结构 Signaling and ConnectingSignaling: How peers find each other in WebRTCConnecting and NAT Traversal with STUN/TURN Signalingsdp协议WebRTC如何使用sdpWebRTC会话示例 Connecting为什么WebRTC需要一个专用的子系统来连接?现实世界的…

Day949.遗留系统之殇:为什么要对遗留系统进行现代化? -遗留系统现代化实战

遗留系统之殇&#xff1a;为什么要对遗留系统进行现代化&#xff1f; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录是关于遗留系统之殇&#xff1a;为什么要对遗留系统进行现代化&#xff1f;的内容。 不知道你是否跟曾经一样&#xff0c;身处一个遗留系统的漩涡之中&…