C++ | 详细介绍缺省参数的作用
文章目录
- 一、前言
- 1、缺省参数概念
- 2、缺省参数的使用规则
- 二、全缺省参数【备胎是如何使用的♿】
- 1、四种实参传递方式说明
- 2、疑难细究
- 三、半缺省参数【⭐】
- 1、错误用法示范
- 2、正确用法示范
- 🔥实参缺省与形参缺省的混合辨析🔥
- 3、小结
- 四、缺省参数的实际应用 —— 栈
- 五、总结与提炼
一、前言
1、缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
- 通俗点讲,就是在定义函数的时候可以给形参赋一个初始化的值,这个值就叫做缺省值,缺省值可以有一个,也可以有多个
2、缺省参数的使用规则
- 半缺省参数必须从右往左依次且连续来给出,不能间隔着给【实参和形参同理】
- 可以通过下图先了解一下,下文我会详细介绍。可以看出对于形参中的缺省参数如果要给的话不可以随意给,要么从右往左给1个或者是2个,要么全部缺省,否则必须要连续。否则就不符合规定
2. 缺省参数不能在函数声明和定义中同时出现
- 可以看到,若是在声明和定义中同时给出函数的缺省参数,此时就会出现【重定义默认参数】的问题。下面我所给出的值是相同的,若是两边给出的值不同的话,编译器在编译的时候就会产生歧义,不知道使用那一块的参数
- 一般我们会选择定义在声明处,因为声明处的头文件其他
.cpp
文件可以包含。若是将这些缺省参数放在放在了定义出,其他文件就没办法使用到了
3. 缺省值必须是常量或者全局变量
- 这一点很好理解,你给出的缺省值必须是一个固定的值,而不是一个可修改的变量,否则这个缺省值将毫无意义;对于缺省值一般我们不会使用全局变量,因为全局变量会存在线程安全的问题,日常写代码也是不推荐使用全局变量
- C语言不支持(编译器不支持)
- 演示一下,创建了一个
test.c
的源文件的,然后和上面一样为这里的函数形参给到缺省值,接着去编译的话就可以发现是会出现很多错误的,这其实就可以看出C语言是不支持【缺省参数】的
因为对于缺省参数而言,虽然看上去很好理解,不过你真正去使用的话若是不注意会出现很多错误,了解了基本的概念和使用规则之后,接下去就让我们真正地去研究一下这个缺省参数
二、全缺省参数【备胎是如何使用的♿】
1、四种实参传递方式说明
- 首先来看一下全缺省参数,对于全缺省参数而言全部的形参值都给上一个缺省值,也就像下面这样
void func(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
- 然后我们便可以试着是去调用一下这个函数,因为有缺省参数的存在,可以不考虑传入全部的值,首先对于下面这种就是最常见的,那也就是传入所有的参数。【假设默认缺省值均为备胎,a为备胎1号,b为备胎2号,c为备胎3号】那么此时这样的传值是不需要备胎的
func(1, 2, 3);
- 然后试着传入前两个实参试试,那此时最后一个使用的就是默认的缺省参数30,也就是备胎3号【今天晚上想看场电影,但是电影票有点贵,所以叫来备胎3号】
func(1, 2);
- 接下去试着只传入一个参数,那后面两个b和c使用的就是默认的缺省参数20和30【早饭自己家里吃,中午吃饭叫来备胎2号付钱,晚上和备胎3号吃完饭然后看电影】
func(1);
- 下面这种应该不用我说了,典型的绿茶🍵使用的都是三个缺省值10、20、30【早上让备胎一号早起帮忙买早饭,中午和备胎2号去高档餐厅吃饭,晚上和备胎3号去湖边约会】
func();
来看一下运行结果。和我上面解释是一样的
2、疑难细究
- 可以看出,刚才我都是执行【从右往左依次连续给出缺省值】的,但若是我像下面这样传递参数的话,虽然是规则对的,但语法是错误的
func(, 1);
func(, 1, 2);
func(, ,1);
三、半缺省参数【⭐】
如果说全缺省参数比较好理解一些,那半缺省参数就够我们喝一壶了
【概念】:并不是所有的形参都有缺省值,可以缺省一个,也可以缺省多个
void Func(int a = 10, int b = 20, int c = 30)
例如像上面这种就是典型的半缺省参数
1、错误用法示范
① 没有从右往左进行缺省
- 对于下面三种而言,就是非常明显得没有从右往左去给出缺省值,只是给出了前两个缺省值或者是给出了第一个或者第二个缺省值
- 若是想要给出第2个缺省值,那么第3个就必须给出;若是想要给出第1个缺省值,那么那么第2个和第3个就必须给出
void func(int a = 10, int b = 20, int c)
void func(int a = 10, int b, int c)
void func(int a, int b = 20, int c)
② 没有连续地给出缺省值
- 对于第二种而言就是的虽然最后一个缺省值给出了,并且第一个缺省值也给出了,但是呢第二个缺省值却没有给出,这其实出现问题了,因为存在不连续的缺省值
- 上面说到过,若是想要给出第1个缺省值,那么那么第2个和第3个都必须给出
void func(int a = 10, int b, int c = 30)
2、正确用法示范
知道了怎样给缺省值是错误的之后我们来看看正确的半缺省参数应该如何给出
- 通过对比可以发现下面的这些全部满足【从右往左依次连续给出缺省值】,满足了若是前一个有缺省值后一个也连续的也必须有缺省值的条件
void func(int a, int b = 20, int c = 30) //✔ 后两个缺省
void func(int a, int b, int c = 30) //✔ 最后一个缺省
- 对于下面的这两种就比较特殊,第一个就是全部没有缺省值,那其实就是我们平时正常写函数的样子;而对于第二个就是全部给出缺省值,那其实也就是上面说到过的全缺省参数,对于它的调用方式比较多,我在上面已经演示过了
void func(int a, int b, int c) //✔ 全部不缺省(正常形参)
void func(int a = 10, int b = 20, int c = 30) //✔ 全部缺省【调用方式多】
🔥实参缺省与形参缺省的混合辨析🔥
通过了学习了半缺省参数,接下去我将带你通过实参传值,形参接收的形式,再度来辨析一下【半缺省参数】的难点究竟在哪里
- 第一形参无缺省,至少传入一个实参
void func(int a, int b = 20, int c = 30)
func(1, 2, 3); //a = 1 b = 2 c = 3
func(1, 2); //a = 1 b = 2 c = 30
func(1); //a = 1 b = 20 c = 30
func(); //a = ? b = 20 c = 30
- 可以看到,因为第一个形参没有给出缺省参数值,所以在传参的时候必须给到形参a一个值,可以看出编译器检查得严格,若是检查得不严格那么打印出来的就是一个随机值
- 第一、二形参无缺省,至少传入两个实参
void func(int a, int b, int c = 30)
func(1, 2, 3); //a = 1 b = 2 c = 3
func(1, 2); //a = 1 b = 2 c = 30
func(1); //a = 1 b = ? c = 30
func(); //a = ? b = ? c = 30
- 此时,当前两个形参都没有缺省参数值时,那么在传参的时候就必须给形参a和形参b都传入一个值,那就是必须要传入两个值,可以不传入第3个实参,因为第三个形参有默认缺省值
- 三个形参均为缺省参数,需传入三个实参
void func(int a, int b, int c)
func(1, 2, 3); //a = 1 b = 2 c = 3
func(1, 2); //a = 1 b = 2 c = ?
func(1); //a = 1 b = ? c = ?
func(); //a = ? b = ? c = ?
- 最后这一种,就是当所有的形参缺省值都没有给出的时候,此时就是我们在C语言中写的正常函数形式,三个形参就必须传入三个实参,缺一不可
3、小结
- 形参缺省不是缺了一个值,而是给了一个默认参数值。
- 不仅是在给出半缺省形参值时需要注意【从右往左依次连续给出】;在给具有半缺省参数的函数传递实参的时候,要注意传入实参的个数必须符合给出的缺省形参个数
四、缺省参数的实际应用 —— 栈
如果你认真自己地看下来,就会觉得大吃一惊,原来缺省参数还有这么多细节是被忽略的,那了解到这些之后可以带来什么实际的意义呢?
- 可以看到,这是我们在数据结构 — 栈中写的代码,定义了一个栈的结构体和一个对其进行初始化的Init函数。在初始化时我将这个栈的大小设置为4,以及这个容量大小Capacity也为4
struct Stack {int* a;int top;int Capacity;
};void InitStack(struct Stack* st)
{st->a = (int*)malloc(sizeof(int) * 4);st->top = 0;st->Capacity = 4;
}
- 此时我在外界普通得定义了一个栈,然后对其去进行一个初始化,后续的话再对其进行一些入栈和出栈的操作,对于顺序栈来说可能会出现栈满容量不够的情况,所以在Push的时候会有一个扩容的逻辑
- 但是一直这么容量不够去扩容的话也是会存在消耗的,因为我一开始给的只有4个空间的大小。但若是一开始就给到很大的容量比如说100,但是数据量只在10以内,这又会存在一个浪费的现象
struct Stack st;
InitStack(&st);
上面这种其实就是因为一开始初始化给到的栈容量太大或者太小导致的,若是我们在提前知道当前数据量的情况下可以手动给出栈的容量时,就不会导致这种情况了,此时就可以使用到我们本文所学习的【缺省参数】了
- 此时我们可以对栈的初始化函数做一个改进,添加一个
defaultCapacity
默认容量这个参数,然后为其设置一个缺省参数为4 - 从缺省参数的规则可以看出,【从右往左依次连续给出】没有问题,对于实参传递不会有问题,肯定不会忘了传入栈的地址,那么这个默认容量就可传可不传了
void InitStack(struct Stack* st, int defaultCapacity = 4)
{st->a = (int*)malloc(sizeof(int) * defaultCapacity);st->top = 0;st->Capacity = defaultCapacity;
}
- 此处我定义了两个栈,因为知晓了第一个栈的数据量是80个,所以可以去手动初始化一个默认容量为100大小的栈;可以对于第二个栈,我不知道数据量的大小,此时我可以选择不传入实参,函数内部就会默认使用给出的缺省参数值4,那么这个栈的初始大小就为4
struct Stack st;
InitStack(&st, 100);struct Stack st2;
InitStack(&st2);
这就是有关缺省参数实际应用的案例,当然不止这一个,我只是举个例子,在C++中有很多地方都会使用到这个【缺省参数】,比方说还有六大成员函数之一的构造函数若是你对其语法非常熟悉的话,用起来就会非常得顺手
五、总结与提炼
最后我们来总结一下本文所学习的内容
- 在一开始,首先认识了什么叫做【缺省参数】,知道了其使用的一些规则
- 接下去,我们学习了两种缺省参数的形式,一个是全缺省参数,一个则是半缺省参数。对于前者,我演示了四种实参传递的方式,向你展现了备胎是如何被使用的;对于后者,虽然看上去很简单,但若是细细地去研究其语法的话就会发现,还是存在许许多多的小细节需要注意的,最主要的就是要记住一点,对于缺省参数值一定要【从右往左依次连续给出】
- 最后,我们在学习了缺省参数后知道了如何去将其运用在实际的开发中,这一点需要在学习C++的过程中细细体会
以上就是本文要介绍的所有内容,感谢您的阅读🌹
相关文章:

C++ | 详细介绍缺省参数的作用
文章目录一、前言1、缺省参数概念2、缺省参数的使用规则二、全缺省参数【备胎是如何使用的♿】1、四种实参传递方式说明2、疑难细究三、半缺省参数【⭐】1、错误用法示范2、正确用法示范🔥实参缺省与形参缺省的混合辨析🔥3、小结四、缺省参数的实际应用 …...

【sdx62】sdx62分析代码中Serial Number的寄存器地址及获取Serial Number的方法
计算Serial Number寄存器地址 查看Serial Number ./boot_images/boot/QcomPkg/SocPkg/Library/XBLLoaderLib/boot_info_log.c /* Array of raw fuse addresses and names to be logged during boot loginitialization. Array must be null terminated. */ static struct boot_…...

MATLAB的快速入门
第一部分:基础知识常用命令:clc %清除命令行窗口 clear %清空工作区数据 cd %显示或改变工作目录 clf %清除图形窗口 help %打开帮助文档 save %保存内存变量到指定文件 hold %保持图形 close %关闭当前图窗 quit %退出变量&#x…...

Python中赋值、引用、深浅拷贝的区别和联系
文章目录一、对象的唯一id二、赋值三、可变对象和不可变对象四、函数的参数传递五、深拷贝和浅拷贝六、举个栗子6.1 不可变对象的拷贝6.2 可变对象的拷贝6.3 可变对象改变外层元素6.4 可变对象改变内层元素七、总结一、对象的唯一id python中的所有对象都有自己的唯一id&#…...

春招冲刺(十一):前端面试之网络总结
网络总结 Q1: GET和POST的请求的区别 应用场景:Get是一个幂等请求,一般用于请求资源。post不是幂等请求,一般用于修改资源。缓存:Get请求一般缓存,Post一般不缓存报文格式:Get请求体一般为空,…...

Mybatis插件
插件使用 动手实现plugin 首先我们需要实现一下这个Interceptor,其中plugin和setProperties方法可以不实现,plugin是因为已经有了完善的逻辑,而setProperties,如果不需要在intercept()中使用属性,也可以不设置。然后…...

计算机学科专业基础综合科目(408)
文章目录408 第一章 数据结构数据是客观事物的符号表示,是对现实世界的事物采用计算机能够识别,存储和处理的形式进行描述的符号的集合。 数据元素是数据的基本单位。一个数据元素由若干个数据项组成。数据项又成为简单数据项及复合数据项两种。简单数据…...

centos7安装教程
1.点击文件–新建虚拟机 2.根据图片一直下一步或者做一些改动 3. 点击自定义硬件,点击浏览选中下载好的ISO文件 4.配置完成后启动虚拟机 5.选择语言,中英文都可,按需求选择 6.进行设置目标位置,配置分区 7.选择网络和主机名 8.配置…...

Kafka 重平衡
Kafka 重平衡协调者RebalanceRebalance 条件Rebalance 避免Rebalance : 让单 Group 下所有的 Consumer 怎么消费订阅主题的所有分区Rebalance 时 , 所有 Consumer 要共同参与 (无法消费),在协调者 (Coordinator) 协调下,完成订阅主题分区的分配 协调者…...

PTA:L1-022 奇偶分家、L1-023 输出GPLT、L1-024 后天(C++)
目录 L1-022 奇偶分家 问题描述: L1-023 输出GPLT 问题描述: 实现代码: L1-024 后天 问题描述: 实现代码: 简单题,没写题解,看代码就能看懂 L1-022 奇偶分家 问题描述: 给…...

IDEA插件开发入门.02
前言许久没更新IDEA插件开发系列了。最近刚好在汇总日常开发中常见的代码“异味”,共享文档复制黏贴略显麻烦,所以想着是否可以搞一个IDEA插件来帮忙收集常见代码,毕竟IDEA作为后端程序员必备的开发工具,显然会方便很多。于是&…...

如何用 23 种编程语言说“Hello World”
在编程的世界里," Hello World " 往往是开发者开始学习一种新语言时写的第一个程序。这个简单的程序会将 “Hello World“ 输出在我们的屏幕上。看似很简单的行为,实际上对于每一个新学习编程语言的人来说,它代表着新的起点。那么&…...

【Linux快速入门】文件目录操作
文章目录概念1. Linux文件系统概述2. Linux文件目录结构3. Linux文件和目录操作3.1 文件操作3.1.1 创建文件3.1.2 复制文件3.1.3 移动文件3.1.4 删除文件3.1.5 查看文件3.1.6 输出指令3.1.7 >和>>指令3.2 目录操作3.2.1 创建目录3.2.2 复制目录3.2.3 移动目录3.2.4 删…...

字体反爬慢慢总结破解方式
什么是字体反爬 网页开发者自己创造一种字体,因为在字体中每个汉字都有其代号,那么以后再网页中不会直接显示这个文字的效果。而是显示其代号,因此即使获取了网页的文本内容。也只是获取到文字的代号,而不是文字本身。 简单来说&…...

Kafka 位移提交
Kafka 位移提交自动提交手动提交Consumer 的消费位移 : 记录 Consumer 下一条消息的消费位移 如 : Consumer 已消费 5 条消息 (位移: 0 - 4) , 此时 Consumer 位移 5 : 指向下一条消息的位移 提交位移 (Committing Offsets) : Consumer 向 Kafka 汇报位移数据 Consumer 能同…...

kubernetes--监控容器运行时:Falco
目录 Falco介绍 Falco架构 Falco的安装 告警规则示列 威胁场景测试: 监控容器创建的不可信任进程(自定义规则) Falco支持五种输出告警方式falco.yaml: Falco告警集中化展示: Falco介绍 Falco是一个Linux安全工具…...

HTTP协议详解(上)
目录 前言: 认识URL HTTP协议方法 通过Fiddler抓包 GET和POST之间典型区别 header详解 HTTP响应状态码 常见状态码解释 状态码分类 HTTP协议报文格式 小结: 前言: HTTP协议属于应用层协议,称为超文本传输协议ÿ…...

java性能-原生内存-内存分析
原生内存最佳实践 内存占用 jVM使用的原生内存和堆内存总和就是一个应用程序的总内存——操作系统角度 jvm启动时候加载的类路径下的jar文件相关的内存和系统其他进程共享资源的可能 测量内存占用 线程是个例外——每当创建一个线程操作系统都会分配一些原生内存存储线程栈…...

c++类与对象
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章 🔥座右铭:“不要等到什么都没有了,才下定决心去做” …...

Java并发编程与API详解
文章目录前言操作系统——进程和线程进程进程组成进程状态进程控制进程创建进程终止进程阻塞和唤醒进程通信线程线程组成线程状态线程控制线程的实现方式用户线程内核线程混合方式CPU调度调度的层次调度的实现调度器调度的时机、切换与过程进程调度的方式闲逛进程两种线程的调度…...

【冲刺蓝桥杯的最后30天】day5
大家好😃,我是想要慢慢变得优秀的向阳🌞同学👨💻,断更了整整一年,又开始恢复CSDN更新,从今天开始更新备战蓝桥30天系列,一共30天,如果对你有帮助或者正在备…...

大厂与小厂招人的区别,看完多少有点不敢相信
前两天在头条发了一条招人的感慨,关于大厂招人和小公司招人的区别。 大厂:有影响力,有钱,能够吸引了大量的应聘者。因此,也就有了筛选的资格,比如必须985名校毕业,必须35岁以下,不能…...

前端ES5对象特性
ES5对象特性 对象和函数的原型 JS中每一个对象都有一个特殊的内置属性,这个特殊的对象可以指向其他的对象 我们通过引用对象的属性key来获取一个value时,它会触发 Get 的操作首先检查该对象是否有对应的属性,如果有的话就使用对象内的如果…...

Linux入门介绍及Linux文件与目录结构
前言 本文小新为大家带来 Linux 入门介绍及Linux 文件与目录结构 相关知识,具体内容包括Linux入门介绍(包括:Linux概述,Linux与Windows区别,CentOS 下载地址),Linux文件与目录结构等进行详尽介绍…...

超赞,用python实现流媒体服务器功能,寥寥几句搞定。
步骤: 要使用Python将实时摄像机传送流写入H5页面,可以使用以下步骤。 1、安装必要的软件包。您需要安装OpenCV和Flask以及gunicorn 与 gevent 。您可以通过在终端中运行以下命令来执行此操作。 pip install opencv-python pip install Flask pip ins…...

冥想第七百二十一天
1.3.3周五,又是周五了。今天又运动了5公里,很舒服轻松。 2.还是往常的生活,休息的也很好,开春后跑的一直很好。 3.早上30分钟健康操。中午转了圈, 给大哥说下周去上海。 4.感谢父母,感谢朋友,感…...

06-Oracle表空间与用户管理
本讲主要内容: 1.表空间管理:表空间的作用,创建,修改,删除及管理; 2.用户管理:创建用户,修改用户,删除用户,修改密码,解锁; 3.用户…...

Mysql 索引特点
承接上文Mysql Server原理简介聚簇索引、二级索引、联合索引分别具备什么样的特点?聚簇索引数据跟索引放在一起的叫聚簇索引;数据和索引分开存储的叫非聚簇索引;innodb存储引擎,数据和文件都放在ibd文件中,实际的数据是…...

读书笔记-终身学习
前言人需要终身成长,也需要终身学习,以下是记录个人读书学习的笔记总结,希望能给大家一点借鉴,仅供参考。笔记1、《匠人精神》秋山利辉是日本神奈川县横滨市都筑区“秋山木工”的经营者,从事订制家具制作业务。是一家小…...

了解栈Stack一篇文章就够了
什么是栈栈是一种特殊的线性表,只允许一端进行数据的插入和删除,即先进后出原则。类似于弹夹先装进去的子弹后面出,后放入的子弹先出。栈的底层原理栈是一种线性结构,所以既能使用数组实现,也能使用链表实现࿰…...