c++篇---缺省参数

news2024/9/21 17:01:09

文章目录

  • 一、缺省参数概念
  • 二、缺省参数实例
  • 三、缺省参数声明和定义
  • 四、全缺省和半缺省


一、缺省参数概念

缺省参数

在调用该函数时,如果实参没有指定传内容,那么在函数中用形参时,就采用为函数参数指定的这个缺省值
但是如果在调用该函数时,实参指定传了内容,那么函数在使用时使用指定的形参
缺省参数是一个默认参数,在函数形参中给它赋一个值,此时也就叫做缺省参数

二、缺省参数实例

实例1

#include<iostream>
using namespace std;

//缺省参数
void fun(int a = 0)
{
	cout << a << endl;
}

int main()
{
	fun();//没有为fun函数传参,fun采用的是它的缺省值

	fun(10);//调用fun函数时,为其指定传参,fun函数使用的是指定传的参数
	return 0;
}

在这里插入图片描述

实例2

#include<iostream>
using namespace std;

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

int main()
{
	fun1();//调用fun1函数时,一个实参都没传,fun1函数采用的是形参的缺省值

	fun1(1);//调用fun1函数时,传了一个实参,c++调用函数时,实参传参,形参接收是从左边开始传的
	//实参传给形参是从左边开始传的从左往右,此时传了一个,那么fun1在使用是除了使用指定的实参之外,
	//其余的还是采用形参的缺省值

	fun1(1, 2);//调用fun1函数时,传了两个实参,由于参数传参是从左往右,那么fun1函数在使用形参时前两个形参使用指定实参,
	//后一个形参采用形参的缺省值

	fun1(1, 2, 3);//调用fun1函数时,传了三个实参,fun1函数在使用形参时,使用的是指定实参值

	return 0;
}


在这里插入图片描述

实例3
模拟栈插入数据

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

void stackInit(struct stack* pst)
{
	pst->a = (int*)malloc(sizeof(int) * pst->capacity);
	if (pst->a == NULL)
	{
		perror("malloc fail\n");
		return;
	}

	pst->size = 0;
	pst->capacity = 4;
}


void stackPush(struct stack* pst, int x)
{
	if (pst->size == pst->capacity)
	{
		int* tmp = (int*)malloc(sizeof(int) * (pst->capacity) * 2);
		if (tmp == NULL)
		{
			perror("malloc fail\n");
			return;
		}

		pst->a = tmp;
		pst->capacity *= 2;
	}
	pst->a[pst->size++] = x;
}

但是这样可以发现每次往栈中插入数据时都会检查是否需要扩容 而真的当空间不够需要扩容时,扩容又会导致额外消耗
在对栈初始化时可以先开空间,至于开多大,可以初始给默认为4
但是如果此时我们已经知道需要插入多少数据,数据量又超过了初始给开的空间,此时序需要扩容造成消耗,所以在初始化时可以给缺省参数,缺省值默认为4,如果知道要插入多少数据,
那么在调用这个函数时,实参传给定知道插入的数据个数,此时初始化开的空间也就是实参给定的值 这样可以避免因空间不够开空间带来的消耗
但是此时会问,既然都知道要插入多少数据了直接用静态栈不好吗,静态栈虽然好但是不是每次都能知道要插入多少数据
所以在初始化时给缺省值应对不同场景

初始化栈给缺省参数

void stackInit(struct stack* pst,int defaultcapacity = 4)
{
	pst->a = (int*)malloc(sizeof(int) * defaultcapacity);
	if (pst->a == NULL)
	{
		perror("malloc fail\n");
		return;
	}

	pst->size = 0;
	pst->capacity = defaultcapacity;
}

三、缺省参数声明和定义

将栈插入分文件实现是否可行,结果发现不可行,因为缺省时声明和定义不能同时缺省
为什么?如果可行的话,假设在声明时给的缺省值与在定义时给的缺省值并不相同
那么在调用它时如果用哪个缺省值,分不清楚,因此并不能在声明和定义时同时给缺省
在这里插入图片描述
默认参数为缺省参数,重定义了,不可行

不能同时给的话,在缺省给还是定义给?

定义给声明不给

在这里插入图片描述
在这里插入图片描述

程序预处理阶段将头文件展开,得到声明,然后编译阶段走各个源文件查看语法是否出错

在这里插入图片描述
这里调用传参的时候只传一个参数,而声明得到的初始化函数需要有两个参数,这里只传了一个,在编译阶段它只能查看当前文件的语法,并不能去其它源文件中,而在预处理阶段只得到声明并没有得到定义,所以声明没给缺省时编译会报错

声明给定义不给
在这里插入图片描述
在这里插入图片描述
可以发现是编译过了的
在这里插入图片描述

四、全缺省和半缺省

全缺省
函数形参的各个参数都指定一个缺省值
在这里插入图片描述

半缺省
函数形参参数部分缺省

在这里插入图片描述

而缺省参数在缺省时也有要求就是从右往左开始依次缺省,

为什么?因为调用传参是从左往右开始传的,在调用传参时如果有一个参数没给缺省,那么就至少要传一个
而如果是从左往右缺省的,那么最后一个每缺省,参数传参从左往右,传的值被第一个接收,那么导致最后一个没有传参会发生错误
总结:缺省参数从右往左开始缺省,不可跳跃缺省和指定缺省 传参从左往右开始传参,不可跳跃传参和指定传参

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

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

相关文章

【Qt 实现一个画板,基于QWidget,可以绘制直线和矩形】

【Qt 实现一个画板&#xff0c;基于QWidget,可以绘制直线和矩形】 简介效果展示源码mainwindow.hmainwindow.cpppainterwidget.hpainterwidget.cppshape.h &#xff08;管理&#xff09;line.hline.cpprect.hrect.cpp 结 &#x1f649;&#x1f649;更多内容 点击&#xff1a;Q…

力扣sql中等篇练习(七)

力扣sql中等篇练习(七) 1 查询活跃业务 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below # 先求出所有业务的平均发生次数 SELECT t2.business_id FROM (SELECT e.*,IF(e.occurences>t1.A_NUM,1,0) tota…

【C++】vector的简化模拟实现

文章目录 1. 主要结构2. 默认成员函数3. 迭代器4. 容量相关1. size和capacity2. reserve3. resize 5. 数据访问6. 数据修改1. push_back2.pop_back3. insert4.erase5.swap6.clear 1. 主要结构 参照SGI版本的vector实现&#xff0c;使用三个指针来维护这样一段内存空间 templa…

ACL访问控制列表简介和配置演示

一.ACL功能和特点 1.功能 2.特点 二.ACL种类 1.基础ACL&#xff1a; 2.增强ACL&#xff1a; 三.配置演示 1.基础ACL&#xff1a; 2.增强ACL&#xff1a; 一.ACL功能和特点 1.功能 对感兴趣的路由 (控制层面)进行设置策略 对感兴趣的流量 (数据层面)进行设置策略 2.…

Activity启动模式的生命周期

四种启动模式 1.standard android:launchMode"standard" 默认的标准启动模式&#xff0c;每次启动当前Activity&#xff0c;任务栈中都添加一个当前Activity的实例。按返回键时&#xff0c;表现出退出多个当前Activity的现象。 MainActivityOne和MainActivityTwo都…

DPText-DETR原理及源码解读

一、原理 发展脉络&#xff1a;DETR是FACEBOOK基于transformer做检测开山之作&#xff0c;Deformable DETR加速收敛并对小目标改进&#xff0c;TESTR实现了端到端的文本检测识别&#xff0c;DPText-DETR做了精度更高的文字检测。 DETR 2020 FACEBOOK&#xff1a; 原理 https://…

c/c++:函数的作用,分类,随机数,函数定义,调用,申明,exit()函数,多文件编程,防止头文件重复

c/c&#xff1a;函数的作用&#xff0c;分类&#xff0c;随机数&#xff0c;函数定义&#xff0c;调用&#xff0c;申明&#xff0c;exit()函数&#xff0c;多文件编程&#xff0c;防止头文件重复 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大…

Spring启动及Bean实例化过程来看经典扩展接口

目录 一、Spring启动及Bean实例化过程 二、分析其对应经典扩展接口 三、对开发的指导意义 备注&#xff1a;以下总结只是一些基本的总结思路&#xff0c;具体每个扩展接口的应用后续进行分析总结。 一、Spring启动及Bean实例化过程 Spring启动及Bean实例化的过程&#xff0…

6 款顶级 Android 数据恢复软件列表

数据丢失可能会扰乱您的个人/企业生活&#xff0c;如果手动完成&#xff0c;可能很难恢复丢失的数据。Android 数据恢复软件是解决此问题的完美解决方案。这些工具可帮助您快速轻松地从 Android 设备恢复丢失的数据。它可以帮助您恢复照片、视频、笔记、联系人等。 我研究了市…

1. C++使用Thread类创建多线程的三种方式

1. 说明 使用Thread类创建线程对象的同时就会立刻启动线程&#xff0c;线程启动之后就要明确是等待线程结束&#xff08;join&#xff09;还是让其自主运行&#xff08;detach&#xff09;&#xff0c;如果在线程销毁前还未明确上面的问题&#xff0c;程序就会报错。一般都会选…

webserve简介

目录 I/O分类I/O模型阻塞blocking非阻塞 non-blocking&#xff08;NIO&#xff09;IO复用信号驱动异步 webServerHTTP简介概述工作原理HTTP请求头格式HTTP请求方法HTTP状态码 服务器编程基本框架两种高效的事件处理模式Reactor模式Proactor模拟 Proactor 模式 线程池 I/O分类 …

字节岗位薪酬体系曝光,看完感叹:不服真不行

曾经的互联网是PC的时代&#xff0c;随着智能手机的普及&#xff0c;移动互联网开始飞速崛起。而字节跳动抓住了这波机遇&#xff0c;2015年&#xff0c;字节跳动全面加码短视频&#xff0c;从那以后&#xff0c;抖音成为了字节跳动用户、收入和估值的最大增长引擎。 自从字节…

最全MySQL8.0实战教程

文章目录 最全MySQL8.0实战教程一.前言1.计算机语言概述2.SQL的概述2.1 语法特点2.2 MySQL的安装2.2.1 方式1&#xff1a;解压配置方式2.2.2 方式2&#xff1a;步骤安装方式 二. 数据库DDL操作1.DDL概念2.对数据库常用操作 最全MySQL8.0实战教程 长路漫漫&#xff0c;键盘为伴&…

【Linux进阶篇】启动流程和服务管理

目录 &#x1f341;系统启动 &#x1f343;Init和Systemd的区别 &#x1f343;运行级别和说明 &#x1f341;Systemd服务管理 &#x1f343;6和7命令区别 &#x1f343;systemd常用命令 &#x1f341;系统计划调度任务 &#x1f343;一次性任务-at &#x1f343;batch &#x1…

论文 : Multi-Channel EEG Based Emotion Recognition Using TCNBLS

Multi-Channel EEG Based Emotion Recognition Using Temporal Convolutional Network and Broad Learning System 本文设计了一种基于多通道脑电信号的端到端情绪识别模型——时域卷积广义学习系统(TCBLS)。TCBLS以一维脑电信号为输入&#xff0c;自动提取脑电信号的情绪相关…

自然语言处理 —— 01概述

什么是自然语言处理呢? 自然语言处理就是NLP,全名为Natural Language Processing。 一、NLP的困难 1. 歧义 (1)注音歧义 (2)分词歧义 (3)结构歧义 (4)指代歧义 (5)语义歧义 (6)短语歧义

javascript简单学习

简介&#xff1a; javascript 是脚本语言 javascript是轻量级的语言 javascript是可插入html页面的编程代码 javascript插入html页面后&#xff0c;可由所有现代浏览器执行 以下是JavaScript的一些基本概念&#xff1a; 1. 变量&#xff1a;变量用于存储数据值&#xff0…

每日学术速递4.13

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Slide-Transformer: Hierarchical Vision Transformer with Local Self-Attention(CVPR 2023) 标题&#xff1a;Slide-Transformer&#xff1a;具有局部自注意力的分层视觉变换器 …

一、vue之初体验-两种方式引入vue

一、Vue引入方式-CDN <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevice-width, initial-s…

开源问答社区软件Answer

什么是 Answer &#xff1f; Answer 是一个开源的知识型社区软件。您可以使用它快速建立您的问答社区&#xff0c;用于产品技术支持、客户支持、用户交流等。 Answer是国内SegmentFault 思否团队开发的技术问答社区&#xff0c;Answer 不仅拥有搭建问答平台&#xff08;Q&A…