21天学会C++:Day3----缺省参数

news2024/11/29 8:38:25

· CSDN的uu们,大家好。这里是C++入门的第三讲。
· 座右铭:前路坎坷,披荆斩棘,扶摇直上。
· 博客主页: @姬如祎
· 收录专栏:C++专题

目录

1. 知识引入

2. 缺省参数知识点

2.1 全缺省

2.2 半缺省

2.3 函数定义给缺省值还是函数声明给缺省值

2.4 小小的补充


1. 知识引入

还记得我们在用C语言实现栈的时候不是给了一个默认的栈的大小吗?当时我们使用的是#define定义标识符,然后初始化栈的时候,我们就会使用这个默认的标识符来初始化栈的大小。

#define STACK_INIT_SIZE 4

struct Stack
{
	int* a;
	int size;
	int capacity;
};

void StackInit(struct Stack* st)
{
	assert(st);
	st->a = (int*)malloc(sizeof(int) * STACK_INIT_SIZE);
	if (st->a == NULL)
	{
		perror("StackInit::malloc");
		exit(-1);
	}
	st->size = 0;
	st->capacity = STACK_INIT_SIZE;
}

我们可以看到这个代码有一个明显的缺陷,就是如果说我们一旦指定了 STACK_INIT_SIZE 的大小之后,后续就无法进行更改了。一旦我们想创建不同初始大小的栈,C语言的这种写法就无法满足我们的需求。因此C++引入了缺省参数的概念。

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

我们先来看有了缺省参数的好处:有了缺省参数,在调用StackInit函数时我们可以不传参,默认开辟4个大小的空间。也可以指定串defaultCapacity,这样就可以实现栈不同的初始大小。

struct Stack
{
	int* a;
	int size;
	int capacity;
};

void StackInit(struct Stack* st, int defaultCapacity = 4)
{
	assert(st);
	st->a = (int*)malloc(sizeof(int) * defaultCapacity);
	if (st->a == NULL)
	{
		perror("StackInit::malloc");
		exit(-1);
	}
	st->size = 0;
	st->capacity = defaultCapacity;
}

int main()
{
	struct Stack st1;
	StackInit(&st1); //创建一个初始大小为4的栈

	struct Stack st2;
	StackInit(&st2, 100); //创建一个初始大小为100的栈

	return 0;
}

2. 缺省参数知识点

再来看看缺省参数的定义:

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

2.1 全缺省

我们会想,可以把函数的参数全部都设置一个缺省值吗?当然是可以的哦!我们称之为全缺省。

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

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

既然是全缺省,就会上面这么多种调用函数的方式。

但是,这里我就想发问了:我们部分传参的时候,实参与形参的匹配顺序是怎样的呢?

比如:func(1, 2) 的输出结果是什么呢?答案是:1 2 30 。实参会从左向右去与形参进行匹配。

2.2 半缺省

所谓的半缺省就是,只有一部分参数是给了缺省值的。比如下面的代码:

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

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

上面在全缺省是我们提到了:实参会从左向右依次去匹配形参。那么我们就能够得出结论:半缺省参数必须从右往左依次来给出,不能间隔着给。

2.3 函数定义给缺省值还是函数声明给缺省值

这里我想发问了:为什么不能函数声明与定义同时给缺省值呢?我们来看下面的代码:

我们将函数定义与函数声明的缺省值设置为不同的常量。

void func(int a = 10); //函数声明
void func(int a = 20) //函数定义
{
	cout << a << " " << endl;
}

int main()
{
	func();
	return 0;
}

运行之后会报错:

 

 你在函数定义与函数声明同时给缺省值,缺省值不一样的时候它到底听谁的呢?还有就是就算缺省值一样,编译也不能通过,(VS2019)编译器已经禁止了这种行为。

那到底是函数定义给,还是函数声明给呢?这就得联系编译链接的知识了。

我们将函数的定义与函数的声明分文件编写,先看看代码:

/
//test.h 中的代码

void func(int a = 20); //函数的声明


//test.cpp中的的代码

void func(int a) //函数的定义
{
    cout << a << endl;
}


//main.cpp 中的代码

#include "test.h"
#include<iostream>
using namespace std;

int main()
{
    func();
    return 0;
}

这里的结论就是,缺省值需要在定义给。编译链接大致分为预处理,编译,汇编,链接四个阶段。在预处理阶段,主要执行头文件的展开,宏的替换,条件语句的确定······,然后头文件就不会存在了。每个源文件会分别,各自编译。在main.cpp编译时,经过预处理阶段头文件的展开,在main.cpp中就会有func函数的声明:void func(int a = 20); 在main函数调用 func() 处,编译器就会将这条语句理解为 func(20),那么main.cpp的编译就没有问题。

如果我们是在函数的定义里面给缺省值,那么在main.cpp编译过程中,函数的定义就会是这样的:void func(int a),在main函数调用 func() 处就会报错:func()不接受0个参数,即无法编译成功。

 这里的C2660中的C就是英文单词Compile (编译) 的缩写,即编译阶段报的错误。

因此,我们可以得出结论:缺省参数能且只能在函数声明的时候给。

2.4 小小的补充

函数形参的缺省值可以是全局变量,也可以是常量。

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

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

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

相关文章

MySQL 数据库 高可用 MAH

概述 什么是 MHA MHA&#xff08;Master High Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最…

数据结构-堆和堆排序-TopK问题

内容总览 1.堆的定义2.堆的实现接口&#xff08;大堆&#xff09;2.1 堆结构体定义2.2 堆的初始化与销毁2.3 堆的向上调整算法和插入2.4 堆的向下调整算法和删除堆顶元素2.5 堆的其他接口&#xff08;调整堆递归版本&#xff09; 3.建堆效率问题分析3.1 向上建堆3.2 向下建堆 4…

Java中的TCP (Android通用)

TCP服务端&#xff0c;创建了一个线程的接口 public class TCPServer implements Runnable {private static final String TAG "TCPServer";private String chaSet "UTF-8";private int port;private boolean isListen true;public TCPServer(int port)…

TypeScript 学习笔记 (学习中)

学习视频1&#xff1a;coderwhy 学习视频2&#xff1a;尚硅谷 文章目录 TypeScript 学习笔记概述TypeScript 开发环境搭建 类型注解类型推断 数据类型JS的7个原始类型Array数组object、Object 和 {}1.可选属性 ? 2.type 类型别名 和 接口interface函数TS类型: any类型 | unkno…

分享Python采集66个css3代码,总有一款适合您

分享Python采集66个css3代码&#xff0c;总有一款适合您 Python采集的66个css3代码下链接&#xff1a; 百度网盘 请输入提取码 提取码&#xff1a;mads css3svg炫酷水滴Loading特效 css剪裁GIF背景图片动画特效 纯CSS制作辛普森一家卡通人物动画特效 CSS3图片遮罩层变形…

1688商品详情数据采集技术,支持整站数据高并发采集

一、如何通过手动方式查看1688商品详情页面的数据 1.1688商品详情 API 接口&#xff08;item_get - 获得1688商品详情接口&#xff09;&#xff0c;1688API 接口代码对接可以获取到宝贝 ID&#xff0c;宝贝标题&#xff0c;价格&#xff0c;优惠价&#xff0c;掌柜名称&a…

ArcSWAT报错:-2147217385;创建栅格数据集失败

文章目录 1 报错内容2 报错分析3 解决方案3.1 数据集路径错误3.2 数据格式不受支持3.3 文件访问权限问题 1 报错内容 此报错通常发生在建立了一个SWAT数据库后&#xff0c;执行Watershed Delineator中的Automatic Watershed Delineation操作中&#xff0c;在选择了DEM数据后弹出…

亚马逊云科技Amazon Compute Optimizer基础设施

亚马逊云科技Amazon Compute Optimizer如今推出了一项新功能&#xff0c;可以利用多个CPU架构&#xff08;包括基于x86的实例和基于Amazon Graviton的实例&#xff09;更轻松地优化EC2实例。Compute Optimizer是一项可选服务基础设施&#xff0c;可为工作负载推荐最佳Amazon资源…

Kali-linux使用OpenVAS

OpenVAS&#xff08;开放式漏洞评估系统&#xff09;是一个客户端/服务器架构&#xff0c;它常用来评估目标主机上的漏洞。OpenVAS是Nessus项目的一个分支&#xff0c;它提供的产品是完全地免费。OpenVAS默认安装在标准的Kali Linux上&#xff0c;本节将介绍配置及启动OpenVAS。…

Flink基础介绍-3 Time与Window

Flink基础介绍-3 Time与Window 三、流处理中的Time与Window3.1 Time3.2 window3.3 Window API3.4 Watermark 三、流处理中的Time与Window 3.1 Time Event Time&#xff1a;是事件创建的时间。它通常由事件中的时间戳描述&#xff0c;例如采集的日志数据中&#xff0c;每一条日…

SpringSecurity原理和实际应用

前提知识 认证&#xff1a;系统提供的用于识别用户身份的功能&#xff0c;通常提供用户名和密码进行登录其实就是在进行认证&#xff0c;认证的目的是让系统知道你是谁。 授权&#xff1a;用户认证成功后&#xff0c;需要为用户授权&#xff0c;其实就是指定当前用户可以操作哪…

Spring Resource接口 学习

Resource 接口是 Spring 资源访问策略的抽象&#xff0c;它本身并不提供任何资源访问实现&#xff0c;具体的资源访问由该接口的实现类完成——每个实现类代表一种资源访问策略。Resource一般包括这些实现类&#xff1a;UrlResource、ClassPathResource、FileSystemResource、S…

MySQL基础(三十二)事务基础知识

1 数据库事务概述 1.1 存储引擎支持情况 SHOW ENGINES 命令来查看当前 MySQL 支持的存储引擎都有哪些&#xff0c;以及这些存储引擎是否支持事务。 能看出在 MySQL 中&#xff0c;只有InnoDB 是支持事务的。 1.2 基本概念 事务&#xff1a;一组逻辑操作单元&#xff0c;使数…

由浅入深理解java集合(三)——集合 List

一、List集合 List集合判断元素相等的标准 List判断两个对象相等只要通过equals()方法比较返回true即可&#xff08;关于equals()方法的详解可以参考第二篇文章中的内容&#xff09;。 下面以用代码具体展示。 创建一个Book类&#xff0c;并重写equals()方法&#xff0c;如果两…

ctf.show MiSC入门 图片篇 (信息附加)

目录 图片篇 信息附加 misc5 misc6 misc7 misc8 misc9 misc10 misc11 misc12 misc13 misc14 misc15 misc16 misc17 misc18 misc19 misc20 misc 21 misc22 misc23 misc41 图片篇 信息附加 misc5 打开后啥也没有 使用16进制编辑器打开&#xff0c;在最下面…

就业内推 | 上市公司招网工运维,有华为、思科、华三认证均可

01 软通动力 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;职责描述&#xff1a; 1、负责大型数据中心网络运维及变更&#xff0c;包括架构优化、性能调优、服务上线 2、负责网络故障类问题定位及排查&#xff0c;对于复杂故障类问题能够定位、跟进和解决实施等…

数据分析案例-BI工程师招聘岗位信息可视化分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

25.在vue中使用axios

目录 1 项目中安装 axios 2 做测试用的后端 3 全局引入axios 4 定义全局根路径 1 项目中安装 axios 2 做测试用的后端 我们用python的flask做后端 简单来讲就是&#xff0c;发两个数字&#xff0c;如果是get就两个数相加&#xff0c;如果是post就两个数相乘 3 全局引…

Kali-linux使用Nessus

Nessus号称是世界上最流行的漏洞扫描程序&#xff0c;全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务&#xff0c;并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件&#xff0c;Nessus可同时在本机或远端上遥控&#xff0c;进行系统的漏洞分析扫描…

【数据结构初阶】——第八节.优先级队列(小根堆的模拟实现)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Java初阶数据结构 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 目录 …