C++缺省参数

news2024/11/23 22:54:37

目录

  • 什么是缺省参数
  • 缺省参数分类
    • 全缺省参数
    • 半缺省参数
  • 缺省参数函数的声明
  • 缺省参数的使用

什么是缺省参数

缺省参数是声明定义函数时,为函数的参数指定一个缺省值。
在调用该函数时,如果没有指定实参,那么形参就会采用缺省值,如果指定了实参,就使用实参值
缺省参数是C++特有的,C语言不支持

#include <iostream>
using namespace std;

void test(int a = 1)//这里的a就是缺省参数
{
	cout << a << endl;
}

int main()
{
	test();    //没有传参时,采用参数的默认值
	test(10);  //有传参时,采用实参值
	return 0;
}

输出结果:
在这里插入图片描述

上面代码中,test函数里的形参a就是一个缺省参数

还有一点要注意的是缺省值必须是常量或者全局变量,其他不可以


缺省参数分类

全缺省参数

全缺省参数,顾名思义,就是为每一个函数形参都
赋了一个缺省值

//全缺省参数
void test2(int a = 10, int b = 20, int c = 30)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}


int main()
{
	test2();//没有传参时,采用参数的默认值
	test2(1);//传了1个参数,形参a采用实参值,其余采用参数的默认值
	test2(1,2);//传了2个参数,形参a,b采用实参值,剩下的c采用参数的默认值
	test2(1,2,3);//传了3个参数,全都采用实参值
	return 0;
}

这里对缺省参数的赋值只能从左往右赋值,不能 “跳着” 赋值
什么叫从左往右呢?
就是test2(1),里面有1个实参值,那么形参参数列表从左开始第一个形参就是a,所以这个1的形参值就是赋
a
同理test2(1,2),里面有2个实参值,形参参数列表从左往右的2个形参是a b,1、2就被赋值给了a b

如果想给缺省参数ac赋值,b采用缺省值,其实是无法实现的,因为给缺省参数赋值只能从左往右,跳过一个赋值是实现不了的


半缺省参数

半缺省参数,不是缺省一半的参数,而是部分参数是缺省的

半缺省参数必须是从右往左依次来给出,不能间隔着给

//半缺省参数
void test3(int a, int b = 20, int c = 30)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}


int main()
{
	test(1);
	test(1,2);
	test(1,2,3);
}

缺省参数函数的声明

如果要对含有缺省参数的函数进行声明,缺省参数只需要在声明中存在,不能在函数声明和定义中同时出现
这么设计的原因是防止函数的声明和定义时,2个缺省参数不一样

下面我们看一下如果在函数声明和定义中同时出现缺省参数的结果
在这里插入图片描述


缺省参数的使用

我们用顺序表的初始函数来说明一下缺省参数的使用场景

以前我们用C语言实现顺序表是这样的

#include <stdio.h>
#include <stdlib.h>

#define DEFAULT 4
struct SList
{
	int* a;
	int size;
	int capacity;
};

void SlistInit(struct SList*plist)
{
	plist->a = (int*)malloc(sizeof(struct SList) * DEFAULT);
	if (plist->a == NULL)
	{
		perror("malloc fail");
		return ;
	}
	plist->size = 0;
	plist->capacity = DEFAULT;

}

因为是动态开辟,我们不知道表里需要多大空间,所以我们给表的空间大小初始化为4
但是如果我们知道要存100个数据,而空间大小初始化为4,那么需要多次空间开辟,而空间开辟又是有消耗的,所以我们可以改为#define DEFAULT 100,但是将DEFAULT 改为100后,如果其他情况下不需要100空间大小,那么开100个空间又浪费了

所以我们可以通过缺省参数去升级写法:

void SlistInit(struct SList*plist,int defaultcapacity = 4)
{
	plist->a = (int*)malloc(sizeof(struct SList) * defaultcapacity);
	if (plist->a == NULL)
	{
		perror("malloc fail");
		return ;
	}
	plist->size = 0;
	plist->capacity = defaultcapacity;
}

如果这样写,当我们知道表中会存多少元素时,我们可以通过对缺省参数传参,改变defaultcapacity 的值,直接开辟正好的空间,避免多次开辟,有消耗

当我们不知道表中会存多少元素时,不用对缺省参数传参,defaultcapacity 采用缺省值,在后序的操作中,按需扩容,避免空间浪费

这样写就完美的解决了之前用C写的缺陷。


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

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

相关文章

【C语言】基础语法5:数组和指针

上一篇&#xff1a;函数和递归 下一篇&#xff1a;字符串和字符处理 ❤️‍&#x1f525;前情提要❤️‍&#x1f525;   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图&#xff08;结束换链接&#xff09;并免费提供给大家学习&#xff0c;希望…

C#串口通信从入门到精通(4)——串口调试助手的使用

前言: 关于本文中使用到的串口助手工具,订阅专栏后,加入vip群,即可在群文件免费下载 1、认识串口助手 串口助手主要的功能有以下六个模块,功能介绍分别如下: 1.1 打开、关闭串口、清除接收区数据按钮区 这些按钮用于打开串口、关闭串口、清除接收数据区的数据 1.2 …

IIC协议——同步半双工串行通信方式

文章目录 前言一、简要介绍1、优点2、缺点 二、信号线和连接方式1、信号线2、连接方式2.1 单主设备&#xff0c;单从设备2.2 单主设备&#xff0c;多从设备2.3 多主设备&#xff0c;多从设备 三、数据传输格式1、数据传输过程 二、SPI配置1、传输模式2、地址位宽3、仲裁机制3.1…

【Linux】Linux基本指令(1)

一.前言 从这篇文章开始&#xff0c;博主就开启了Linux学习之路了&#xff0c;本篇文章也是博主的第一篇Linux的文章&#xff0c;今后也会持续不断更新的。 二.理解文件 1.文件 文件文件数据文件属性&#xff08;所以一个建好的文件就算没有数据&#xff0c;也占用存储空间&am…

[RoarCTF 2019]Easy Calc、攻防世界 ics07、[极客大挑战 2019]EasySQL

[RoarCTF 2019]Easy Calc 进入题目是一个计算器的功能 检查网页源码发现这样一个重要信息 这题有WAF计算功能是通过calc.php这里面的代码执行的&#xff0c;我们去访问一下得到源码 <?php error_reporting(0); if(!isset($_GET[num])){show_source(__FILE__); }else{$str…

传统机器学习(二)逻辑回归算法(二)

传统机器学习(二)逻辑回归算法(二) 之前在传统机器学习(二)逻辑回归算法(一)中介绍了逻辑回归的原理、公式推导、手动python实现及sklearn工具包的使用详解等内容。继续对逻辑回归的使用细节进行介绍。 一、如何得到逻辑回归模型系数 1.1、一个简单的逻辑回归例子 已采集15…

广州蓝景分享—6 个ES13 中非常实用的新 JavaScript 特性

首先作为前端最重要的编程语言JavaScript&#xff0c;每年都在不断发展&#xff0c;让该语言都会通过新功能变得更强大。今天由小蓝跟大家分享6 个ES13 中非常实用的新 JavaScript 特性。 接下来让我们开始&#xff1a; 1.at 当我们想要获取数组的第 N 个元素时&#xff0c;…

Redis底层设计与源码分析---学习笔记

一.Redis为什么快 高速的存储介质 机械硬盘—>固态硬盘—>内存&#xff0c;随机访问的延迟逐渐变小 优良的底层数据结构设计 底层设计用到了hashtable&#xff0c;时间复杂度低 高效的网络IO模型 epoll等&#xff0c;不同平台有不同的实现   高效的线程模型 二.Re…

【论文阅读笔记|ACL2022】Legal Judgment Prediction via Event Extraction with Constraints

论文题目&#xff1a;Legal Judgment Prediction via Event Extraction with Constraints 论文来源&#xff1a;ACL2022 论文链接&#xff1a;https://aclanthology.org/2022.acl-long.48.pdf 代码链接&#xff1a;GitHub - WAPAY/EPM 0 摘要 近年来&#xff0c;虽然法律判…

动态内存管理--->(经典入手版详解)

友友们有时候在开辟内存的时候&#xff0c;所需要的空间大小不太好确定&#xff0c;只有在程序运行的时候才能知道&#xff0c;这时候我们就要尝试一下动态内存开辟空间了&#xff0c;下面来和阿博一起了解并掌握它吧&#x1f917;&#x1f917;&#x1f917; 文章目录 1.为什么…

系统的部署

把报错的三个给删了&#xff0c;系统可以运行了我猜测它对应的是商品分类页面 我觉得它分页器有问题所以研究了下userdto和mtuser的区别 Failed to parse configuration class [com.fuint.fuintApplication]; nested exception is java.lang.IllegalArgumentException: Could…

Mycat数据库中间件 mycat2 路由转发

1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的。例如下图中的一个Mycat分库方案&#xff1a; 根据 tt_waybill 表的 id 字段来进行分片 分片方法为 id 值取 3 的模&#xff0c;根据模值确定在DB1&#xff0c;DB2&#xff0c;DB3中的某个分片 非分片字段…

ESP32设备驱动-LPS25H压阻式压力传感器驱动

LPS25H压阻式压力传感器驱动 文章目录 LPS25H压阻式压力传感器驱动1、LPS25H介绍2、硬件准备3、软件准备4、驱动实现1、LPS25H介绍 LPS25H 是一款超紧凑型绝对压阻式压力传感器。它包括一个单片传感元件和一个能够从传感元件获取信息并向外部世界提供数字信号的 I2C 接口。 传…

leetcode两数、三数、四数之和

如有错误&#xff0c;感谢不吝赐教、交流 文章目录 两数之和题目方法一&#xff1a;暴力两重循环&#xff08;不可取&#xff09;方法二&#xff1a;HashMap空间换时间 三数之和题目方法一&#xff1a;当然是暴力破解啦方法二&#xff1a;同两数之和的原理&#xff0c;借助Has…

工厂管理系统该如何选?5款主流的工厂管理软件全测评!

工厂管理系统该如何选&#xff1f;5款主流的工厂管理软件全测评&#xff01; 阅读本文您将了解&#xff1a;1.工厂管理系统软件是什么&#xff1b;2.五大主流工厂管理系统介绍&#xff1b;3.如何选择工厂管理系统。 一、工厂管理系统软件是什么&#xff1f; 工厂管理系统软件…

SpringBoot整合JUnit--MyBatis--MyBatis-Plus--Druid

文章转自黑马程序员SpringBoot学习笔记,学习网址:黑马程序员SpringBoot2教程 1.整合JUnit ​ SpringBoot技术的定位用于简化开发&#xff0c;再具体点是简化Spring程序的开发。所以在整合任意技术的时候&#xff0c;如果你想直观感触到简化的效果&#xff0c;你必须先知道使用…

SpringBoot项目创建和使用

Idea创建&#xff08;社区版&#xff09; 安装插件 首先找到设置&#xff0c;然后点击插件&#xff0c;在里面搜索 springboot helper 安装好后名字和图标会变为如下&#xff1a; 安装好后就可以开始创建项目了。 创建项目 第一步&#xff1a;打开创建项目面板 上面设置源…

2.2.1服务器百万并发实现

接上节课&#xff0c;上节课中&#xff0c;我们使用了epoll实现了同时监听多个文件描述符&#xff0c;是对IO的管理&#xff0c;也提到了reactor是对事件的管理&#xff0c;那具体来说是怎样的呢&#xff1f;reactor是事件驱动模型&#xff0c;也就是EPOLLIN/EPOLLOUT&#xff…

arm64 页表以及映射分析

arm64 页表映射分析 1 linux 6.10 xilinx内核的内存配置2 arm64不同粒度页的页表2.1 4KB页面粒度的页表配置2.2 16KB页面粒度的页表配置2.3 64KB页面粒度的页表配置 3 页表描述符3.1 无效页表描述符3.2 L0~L2页表描述符3.3 L3页表描述符 4 linux arm64 页表映射4.1 __create_pg…

Java 字符串类型的JSON数组转List<Object>

1.依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.21</version></dependency> 2.代码 import cn.hutool.json.JSONUtil; import java.util.List;/*** 字符串类型的JSON数组…