C++ 缺省参数

news2024/10/6 22:27:06
1.缺省参数

一般情况下,函数调用时的实参个数应与形参相同,但为了方便地使用函数,C++允许定义具有缺省参数的函数,这种函数调用时,实参个数可以与形参不相同。

缺省参数指在定义函数时为形参指定缺省值(默认值)。
这样的函数在调用时,对于缺省参数,可以给出实参值,也可以不给出参数值:
如果给出实参,将实参传递给形参进行调用;
如果不给出实参,则按缺省值进行调用。

#include<iostream>
using namespace std;

void delay(int loops = 5)
{
	//延时函数,默认延时5个时间单位
	for (loops = 5; loops > 0; loops--);
}
int main()
{
	delay(3);
	cout << "延长3个时间单位" << endl;
	delay();//等同于delay(5)
	cout << "延长5个时间单位" << endl;
	return 0;
}

输出结果为:
在这里插入图片描述
缺省参数的函数调用:缺省实参并不一定是常量表达式,可以是任意表达式,甚至可以通过函数调用给出。如果缺省实参时任意表达式,则函数每次被调用时该表达式被重新求值。但表达式必须有意义。

#include<iostream>
using namespace std;
int my_rand()
{
	srand(time(NULL));
	/*用于设置随机数生成器种子的常见操作。它使用当前时间作为种子,
	以确保每次程序运行时生成的随机数序列都是不同的。
	这样可以增加随机性,使得随机数更具预测性和不可重现性。*/
	int ra = rand() % 100;//是随机生成0~99的数
	return ra;
}
void fun(int a, int b = my_rand())
{
	cout << "a=" << a << " b=" << b << endl;
}
int main()
{
	fun(12);
	return 0;
}

运行三次输出结果分别为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
缺省参数可以有多个,但所有缺省参数必须放到参数表的右侧,即先定义所有的非缺省参数,再定义缺省参数。这是因为在函数调用时,参数自左向右逐个匹配,当实参和形参个数不一致时只有这样才不会产生二义性。

#include<iostream>
using namespace std;
void fun(int a, int b = 23, int c = 8000)
{
	cout << "a=" << a << " b=" << b << " c=" << c << endl;
}
int main()
{
	fun(12);
	fun(10, 20);
	fun(10, 20, 30);
	fun(10, , 30);//error  注意,它没有办法实现b不传,只传a和c,也就是说编译器只能按照顺序自左向右传递
	return 0;
}

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

2.缺省参数的分类

(1)全缺省参数
全缺省参数就是所有的参数都带有缺省值。

int Add(itn a = 10, int b = 20, int c = 30)  {}

全缺省参数通常这样进行参数传递:

#include<iostream>
using namespace std;
int Add(int a = 10, int b = 20, int c = 30)
{
	return a + b + c;
}
int main()
{
	cout << Add() << endl;//打印60,没有实参,使用缺省值
	cout << Add(1) << endl;//打印51,将1传递赋值给a,b和c使用缺省值
	cout << Add(1, 2) << endl;//打印33,将1传递赋值给a,将2传递赋值给b,c使用缺省值
	cout << Add(1, 2, 3) << endl;//打印6,a,b,c分别传递赋值为1,2,3,不使用缺省值
	//cout << Add(1, , 3) << endl;//error,编译器不会跳着传参
	return 0;
}

输出结果如下:
在这里插入图片描述
(2)半缺省参数
函数只有部分参数有缺省值,且在函数定义时缺省值要从右向左依次给出。

int func(int a, int b = 20, int c = 30)  {}  // 只有参数b、c具有缺省值

半缺省参数通常这样进行参数传递:

#include<iostream>
using namespace std;
int Sum(int a , int b = 20, int c = 30)
{
	return a + b + c;
}
int main()
{
	//cout << Sum() << endl;//编译出错,因为a没有缺省值,在调用函数时必须传参
	cout << Sum(1) << endl;//打印51
	cout << Sum(1, 2) << endl;//打印33
	cout << Sum(1, 2, 3) << endl;//打印6
	return 0;
}

在这里插入图片描述

3.多文件结构

A.h如下:

#pragma once
#ifndef A_H
#define A_H
void fun(int a, int b = 23, int c = 8000);

//也可以是以下形式
//void fun(int , int  = 23, int  = 8000);

#endif

A.cpp如下:

#include<iostream>
using namespace std;
#include"A.h"
//void fun(int a, int b = 10, int c = 20);
//定义中 不可以再给出缺省值,不可以重定义默认参数
void fun(int a, int b , int c )
{
	cout << "a=" << a << " b=" << b << " c=" << c << endl;
}

Maintest.cpp如下:

#include<iostream>
using namespace std;
#include"A.h"
int main()
{
	fun(12);
	fun(10, 20);
	fun(10, 20, 30);
	return 0;
}

输出结果为:
在这里插入图片描述
习惯上,缺省参数在公共头文件包含的函数声明中指定,不要在函数的定义中指定。
如果在函数的定义中指定缺省参数值,在公共头文件包含的函数声明中不能再次指定缺省参数值。

4.总结

(1)所有带缺省的参数必须放在参数列表的右侧,即先定义所有的非缺省参数,再定义缺省参数
(2)缺省参数在公共头文件包含的函数声明中指定,不要在函数的定义中指出(如果在函数的定义中指定缺省参数值,在公共头文件包含的函数声明中不能再次指定缺省参数值)
(3)缺省实参不一定必须是常量表达式,可以使用任意表达式
(4)当缺省实参是一个表达式时,在函数被调用时该表达式被求值
(5)C语言不支持缺省参数

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

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

相关文章

SSIS对SQL Server向Mysql数据转发表数据 (二)

1、在SQL Server数据库创建一个数据库表&#xff1a;users USE [Test1] GO/****** Object: Table [dbo].[users] Script Date: 2023/7/27 16:25:11 ******/ SET ANSI_NULLS ON GOSET QUOTED_IDENTIFIER ON GOCREATE TABLE [dbo].[users]([id] [int] IDENTITY(1,1) NOT NUL…

【数据结构】实验八:树

实验八 树 一、实验目的与要求 1&#xff09;理解树的定义&#xff1b; 2&#xff09;掌握树的存储方式及基于存储结构的基本操作实现&#xff1b; 二、 实验内容 题目一&#xff1a;采用树的双亲表示法根据输入实现以下树的存储&#xff0c;并实现输入给定结点的双亲结点…

实验二十五、压控振荡电路的测试

一、题目 研究压控振荡电路输出波形频率随输入电压幅度的变化。 二、仿真电路 仿真电路如图1所示。集成运放采用 LM324AJ&#xff0c;其电源电压为 15 V。输入直流电压采用虚拟电压源&#xff0c;锯齿波才用函数发生器产生的锯齿波输出。 三、仿真内容 &#xff08;1&…

[自然语言处理] 自然语言处理库spaCy使用指北

spaCy是一个基于Python编写的开源自然语言处理库。基于自然处理领域的最新研究&#xff0c;spaCy提供了一系列高效且易用的工具&#xff0c;用于文本预处理、文本解析、命名实体识别、词性标注、句法分析和文本分类等任务。 spaCy的官方仓库地址为&#xff1a;spaCy-github。本…

mysql的整体架构

服务层-引擎层-硬盘层 一条语句执行的整体过程: 先建立连接&#xff08;mysql -h -p 密码&#xff09;–预处理-词法分析-语法分析-优化器选择用什么索引表如何连接等-执行器 到这里都是属于server层&#xff0c;大多数功能包括视图&#xff0c;存储过程&#xff0c;触发器都是…

透明屏能在商业广告中使用吗?

透明屏是一种新型的显示技术&#xff0c;它可以将图像或文字显示在透明的玻璃或塑料材料上&#xff0c;使得观看者可以同时看到背后的物体。 这种技术在商业广告、展览、零售和家庭娱乐等领域有着广泛的应用前景。 首先&#xff0c;透明屏可以用于商业广告。传统的广告牌通常…

100个网络安全测试面试题

1、Burpsuite常用的功能是什么&#xff1f; 2、reverse_tcp和bind_tcp的区别&#xff1f; 3、拿到一个待检测的站或给你一个网站&#xff0c;你觉得应该先做什么&#xff1f; 4、你在渗透测试过程中是如何敏感信息收集的&#xff1f; 5、你平时去哪些网站进行学习、挖漏洞提交到…

React 前端应用中快速实践 OpenTelemetry 云原生可观测性(SigNoz/K8S)

OpenTelemetry 可用于跟踪 React 应用程序的性能问题和错误。您可以跟踪从前端 web 应用程序到下游服务的用户请求。OpenTelemetry 是云原生计算基金会(CNCF)下的一个开源项目&#xff0c;旨在标准化遥测数据的生成和收集。已成为下一代可观测平台的事实标准。 React(也称为 Re…

基于物联网、视频监控与AI视觉技术的智慧电厂项目智能化改造方案

一、项目背景 现阶段&#xff0c;电力行业很多企业都在部署摄像头对电力巡检现场状况进行远程监控&#xff0c;但是存在人工查看费时、疲劳、出现问题无法第一时间发现等管理弊端&#xff0c;而且安全事件主要依靠人工经验判断分析、管控&#xff0c;效率十分低下。 为解决上述…

一文了解什么是Selenium自动化测试?

目录 一、Selenium是什么&#xff1f; 二、Selenium History 三、Selenium原理 四、Selenium工作过程总结&#xff1a; 五、remote server端的这些功能是如何实现的呢&#xff1f; 六、附&#xff1a; 一、Selenium是什么&#xff1f; 用官网的一句话来讲&#xff1a;Sel…

Vue2基础六、组件通信

零、文章目录 Vue2基础六、组件通信 1、组件通信 &#xff08;1&#xff09;组件通信是什么 组件通信, 就是指 组件与组件 之间的数据传递。 组件的数据是独立的&#xff0c;无法直接访问其他组件的数据。 想使用其他组件的数据&#xff0c;就需要组件通信 &#xff08;…

QTday2信号和槽

点击登录按钮,关闭Widget登录窗口,打开QQList窗口 widget.cpp #include "widget.h"void my_setupUI(Widget *w);Widget::Widget(QWidget *parent): QWidget(parent) {my_setupUI(this); }Widget::~Widget() { }void Widget::login_slots() {//fixemit jump_signal(…

Springboot+MyBatis使用

目录 依赖 配置信息 xml文件 mapper接口 打印日志 分页查询 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><dependency><groupId>my…

SpringBoot集成 Swagger

Spring Boot 集成 Swagger 在线接口文档 1、Swagger 简介 1.1 解决的问题 随着互联网技术的发展&#xff0c;现在的网站架构基本都由原来的后端渲染&#xff0c;变成了前后端分离的形态&#xff0c;而且前端技术和后端技术在各自的道路上越走越远。前端和后端的唯一联系变成…

LeetCode647.Palindromic-Substrings<回文子串>

题目&#xff1a; 思路&#xff1a; 错误代码&#xff1a;&#xff08;缺少部分判断&#xff09; 使用的是寻找回文子串的方法。以一个点为中心向两边扫描。但是有一点小问题。 因为回文子串是分奇偶的&#xff0c;所以需要两种判断方式。 看了下答案后发现我的代码距离答案一…

创建一个简单的 Servlet 项目

目录 1.首先创建一个 Maven 项目 2.配置 maven 仓库地址 3.添加引用 4.配置路由文件 web.xml 5.编写简单的代码 6.配置 Tomcat 7.写入名称,点击确定即可 8.访问 1.首先创建一个 Maven 项目 2.配置 maven 仓库地址 3.添加引用 https://mvnrepository.com/ 中央仓库地址…

入门篇——了解数据库

一、数据库是什么&#xff1f; 数据库是存放数据的仓库。它的存储空间很大&#xff0c;可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数据进行存放&#xff0c;是有一定的规则的&#xff0c;否则查询的效率会很低。当今世界是一个充满着数据的互联网世界&…

给jupter设置新环境

文章目录 给jupternotebook设置新环境遇到的报错添加路径的方法 给jupternotebook设置新环境 # 先在anaconda界面新建环境 conda env list # 查看conda prompt下的有的环境变量 带星号的是当前活跃的 activate XXXX pip install ipykernel ipython ipython kernel install --u…

AI编程常用工具 Jupyter Notebook

点击上方蓝色字体&#xff0c;选择“设为星标” 回复”云原生“获取基础架构实践 深度学习编程常用工具 我们先来看 4 个常用的编程工具&#xff1a;Sublime Text、Vim、Jupyter。虽然我介绍的是 Jupyter&#xff0c;但并不是要求你必须使用它&#xff0c;你也可以根据自己的喜…

C++中deque的底层讲解

1.前言 1.了解过queue和stack底层的或许了解过&#xff0c;库里面的底层实现&#xff0c;选择的默认容器就是deque&#xff0c;那他有什么好处呢&#xff1f; 2.先前了解过deque的接口会发现&#xff0c;他感觉像是vector和list的合体&#xff0c;什么接口都有&#xff1a; 很…