C++ -缺省参数-详解

博客主页:【夜泉_ly】
本文专栏:【C++】
欢迎点赞👍收藏⭐关注❤️

在这里插入图片描述

C++ -缺省参数-详解

  • 1.是什么
  • 2.分类
    • 2.1全缺省参数
    • 2.2半缺省参数:
  • 3.实际应用
  • 4.关于缺省参数的声明与定义
  • 5.总结

1.是什么

先来看看下面这段代码:

#include <stdio.h>
void func(int i = 0)
{printf("%d\n", i);
}
int main()
{func();return 0;
}

如果是在C语言中,那么编译器毫无疑问会报错:
首先,C语言不支持在参数列表中初识化参数:
在这里插入图片描述
其次,C语言不支持少传参数:
在这里插入图片描述
但是,如果将这段代码放在.cpp中再运行,就会输出结果:

0

这就是今天我要讲的缺省参数(也叫默认参数)。
其规则大致如下:

func(); //没有传参时,使用默认值。
func(1);//有传参时,使用指定的实参。

2.分类

2.1全缺省参数

当一个函数的所有参数都是缺省参数时,称为全缺省参数:

void func(int a = 0, int b = 0, int c = 0)
{printf("a = %d\n", a);printf("b = %d\n", b);printf("c = %d\n", c);printf("\n");
}

使用:

  • 不传参时,使用所有参数的默认值
    func();
    
    运行结果:
    0
    0
    0
    
  • 只传第一个参数
    func(1);
    
    运行结果:
    1
    0
    0
    
  • 传前两个参数
    func(1,2);
    
    运行结果:
    1
    2
    0
    
  • 传三个参数
    func(1,2,3);
    
    运行结果:
    1
    2
    3
    

不可以跳着传!!
在这里插入图片描述

为什么?
因为祖师爷本贾尼·斯特劳斯特卢普没有这样规定。

2.2半缺省参数:

void func(int a, int b = 0,int c = 0)
{printf("a = %d\n", a);printf("b = %d\n", b);printf("c = %d\n", c);
}

这种情况,至少要传入a的参数。
bc 可以选择是否传递,如果不传递,函数会使用默认值。
注意:

  • 缺省从右往左
    如果像这样定义:

    void func(int a = 0, int b = 0, int c)
    {printf("a = %d\n", a);printf("b = %d\n", b);printf("c = %d\n", c);
    }
    

    那么只传一个参数时究竟是传给a还是c,这里会引发歧义。
    并且,这样的写法编译器会直接报错:
    在这里插入图片描述

  • 传参从左往右
    道理与上面类似,传参不能跳过左边的,因为也会引发歧义。

因此,在使用缺省参数时有一个必须注意的点:避免产生歧义!

3.实际应用

在栈的初始化过程中,经常面临“小了不够,大了浪费”的问题。

void StackInit(Stack* s)
{assert(s);s->a = (StackDataType*)malloc(sizeof(StackDataType) * 4);if (!s->a){perror("InitStack::malloc");return;}s->top = 0;s->capacity = 4;
}

此处的函数默认初始化的大小为4。
但如果已经知道了要插入100个数据,那么每次都扩容会很麻烦,且效率不高。

或许可以传入想要初始化的大小:

StackInit(&Stack1,100);

但如果不知道要插入多少数据呢?
这样就再次遇到“小了不够,大了浪费”的问题😂。

此时,缺省参数就能派上用场了:

void StackInit(Stack* s,int default_capacity = 4)
  • 默认开小一点,避免空间浪费
  • 也可以自己传参,减少扩容次数。

而在C语言中,往往会这样解决这个问题:

#define DEFAULT_CAPACITY 4

但这样的解决方法,不能做到下面这种操作:

StackInit(&Stack1,100);//使用给定值100
StackInit(&Stack2);    //使用默认值4

因此,缺省参数更加灵活👍。

4.关于缺省参数的声明与定义

一个常见的疑问是:

声明、定义都给缺省参数,还是只给一个?

为了解释这个问题,我创建了三个文件:
在这里插入图片描述
func.h:

#pragma once
#include <stdio.h>
void func(int a = 0);

func.c:

#include "func.h"
void func(int a = 0) 
{printf("%d\n", a);
}

test.c:

#include "func.h"
int main()
{func(); return 0;
}

如果都给,如上面代码所示,运行结果如下:
在这里插入图片描述
报错重定义默认参数(即缺省参数)。
这说明不允许都给,为什么呢?
因为这样可以避免声明和定义中缺省参数不同的可能。


那么是在声明中给缺省参数,还是在定义中给?

定义中给,运行结果如下:
在这里插入图片描述
报错函数不接受0个参数
这说明参数传少了,为什么?
在预处理阶段,头文件会展开,编译时,每个 .c.cpp 文件都是独立编译的,直到链接阶段才会被链接在一起。
而查看语法是在编译阶段进行,此时还没有链接在一起,而在声明中没有缺省参数,传参时又少传了参数,因此编译器会报错。
因此,在声明中给出缺省参数可以确保编译时正确识别:

//展开的头文件:
#pragma once
#include <stdio.h>
void func(int a = 0);//test.cpp:
int main()
{func(); //-->func(0);return 0;
}

因此,在声明中给缺省参数,在定义中不给

5.总结

通过上述例子和讨论,可以看到,C++ 缺省参数是一种非常有用的功能,它极大地提高了代码的灵活性和可读性。
使用缺省参数可以简化函数调用,避免冗余代码,并且使得代码更加易于维护。
通过合理设置缺省参数,可以更好地应对实际编程中的各种需求,提高程序的健壮性和实用性。

在这里插入图片描述


希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!

本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

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

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

相关文章

HTML5简介的水果蔬菜在线商城网站源码系列模板3

文章目录 1.设计来源1.1 主界面1.2 商品列表1.3 商品信息1.4 购物车1.5 其他页面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.ne…

JavaScript 类型转换:数字转换和 Symbol 类型转换

数字转换 将数据类型转换为数字称为数字转换&#xff0c;可以使用Number()、parseInt()、parseFloat()等方法将数据类型显式转换为数字。当一个值不能被强制转换为一个数字时&#xff0c;就会返回 NaN。 1. 字符串 > 数字&#xff1a; 当把字符串转换为数字时&#xff0c…

2024年双十一有哪些值得入手的好物?2024年双十一必买物品推荐

2024年的双十一购物季将是一个精彩的时刻&#xff0c;各大电商平台将推出一系列精品数码产品&#xff0c;包括最新款的智能手机、笔记本电脑、平板电脑、智能手表等等。这些产品不仅拥有时尚的外观和高端的配置&#xff0c;而且还能够满足消费者多种多样的需求&#xff0c;比如…

windows11上超详细JDK17安装教程

1.下载安装包,访问官网地址​&#xff1a; https://www.oracle.com/java/technologies/downloads/#java172、选择jdk-17_windows-x64_bin.exe Installer。 3、接着等待下载&#xff0c;下载完成后双击进行安装 4、点击下一步 5、这里可以选择安装位置 6、等待安装 7、安…

24年最新Stable Diffusion之最全详解图解

前言 1. Stable Diffusion介绍 1.1 研究背景1.2 学术名词 2.Stable Diffusion原理解析 2.1 技术架构2.2 原理介绍 扩散过程 3.1 Diffusion前向过程3.2 Diffusion逆向&#xff08;推断&#xff09;过程 本次教程将使用AI绘画工具 Stable Diffusion 进行讲解&#xff0c;如还未…

超详细超实用!!!AI编程之cursor配置中文(一)

云风网 云风笔记 云风知识库 一、配置中文扩展 打开扩展&#xff0c;搜索chinese,安装chinese(simplified) 简体中文语言包,重启即可 二、配置中文方法二 使用快捷键组合【CtrlShiftp】&#xff0c;在搜索框中输入configure display language,选择中文也可配置中文 三、配置…

近几年来说最有效率的编程语言和市场最认可的编程语言分别是什么?

在过去的几年中&#xff0c;编程语言的效率和市场认可度在不断演变。不同的语言适用于不同的领域和场景&#xff0c;因而编程语言的“效率”和“市场认可”需要根据具体应用来分析。本文将从两个角度入手&#xff0c;分别探讨近几年中被认为最有效率和最受市场认可的编程语言。…

开源语音实时交互新突破:LLaMA-Omni实现大语言模型无缝语音交互

像 GPT-4o 这样的模型通过语音实现了与大型语言模型&#xff08;LLMs&#xff09;的实时交互&#xff0c;与基于文本的传统交互相比&#xff0c;显著提升了用户体验。然而&#xff0c;目前在如何构建基于开源 LLMs 的语音交互模型方面仍缺乏探索。为了解决这个问题&#xff0c;…

如何精准计算:大型语言模型(LLM)部署到底需要多少GPU内存?

在几乎所有关于大型语言模型&#xff08;LLM&#xff09;的访谈中&#xff0c;总有一个问题反复出现&#xff1a;“部署 LLM 需要多少 GPU 内存&#xff1f;” 这个问题并非偶然&#xff0c;它是衡量您对这些强大模型在实际生产环境中部署和扩展能力理解程度的关键指标。 当您…

Transformer推理结构简析(Decoder + MHA)

一、Transformer 基本结构 Transformer由encoder和decoder组成&#xff0c;其中&#xff1a; encoder主要负责理解&#xff08;understanding&#xff09; The encoder’s role is to generate a rich representation (embedding) of the input sequence, which the decoder c…

国内短剧cps系统和短剧(播放)系统的区别,附各源码部署教程

国内短剧项目主要分为两大形式&#xff1a;一种是做短剧播放平台&#xff0c;让用户付费观看&#xff1b;另一种是做短剧的分销&#xff0c;就是将他人的平台短剧推广&#xff0c;可做平台可入驻&#xff0c;拿分成。 首先来说一下短剧播放平台&#xff08;短剧系统&#xff0…

828华为云征文|华为云服务器Flexus X 搭建BTC虚拟币质押投资理财系统(仅测试学习)

一、华为云服务器Flexus X 选购和介绍 强大性能&#xff0c;引领云服务新潮流 柔性算力&#xff0c;满足多样化需求 Flexus X实例的部署与管理过程也非常便捷。用户只需在华为云官网注册账号&#xff0c;选择适合的Flexus X实例规格&#xff0c;完成购买后即可开始部署。华为…

telnet ftp ssh 如何在交换设备上创建

telnet 测试 说明telnet 成功 这测试ftp 成功

深入理解MySQL InnoDB中的B+索引机制

目录 一、InnoDB中的B 树索引介绍 二、聚簇索引 &#xff08;一&#xff09;使用记录主键值的大小进行排序 页内记录排序 页之间的排序 目录项页的排序 &#xff08;二&#xff09;叶子节点存储完整的用户记录 数据即索引 自动创建 &#xff08;三&#xff09;聚簇索引…

【每日刷题】Day129

【每日刷题】Day129 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 105. 从前序与中序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; 2. LCR 154. 复杂…

足球预测模型理论:足球数据分析——XGBoost算法实战

简介&#xff1a;本文将探讨如何使用XGBoost算法进行足球数据分析&#xff0c;特别是足球运动员身价估计。我们将通过实例和生动的语言&#xff0c;解释XGBoost算法的原理和实际应用&#xff0c;帮助读者理解复杂的技术概念&#xff0c;并提供可操作的建议和解决问题的方法。 足…

Eclipse离线安装Tomcat插件

Eclipse离线安装Tomcat插件 最近的自己在对低版本的代码的进行维护补丁,不得不采用Eclipse 来进行跑项目,真的是折磨 其中遇到一个问题就是打开Eclipse的2021版,安装Tomcat的插件,发现好家伙,就是死活在线安装失败 (喵的,真的是让我抓耳挠腮!!哈哈哈) 无奈,只好采用离线安装,特…

实时语音识别技术实现

实时语音识别 1.环境2.完整代码3.效果4.可能的问题 实时语音识别 1.环境 python版本&#xff1a;3.11.9 2.完整代码 import sqlite3 import timefrom funasr import AutoModel import sounddevice as sd import numpy as np# 模型参数设置 chunk_size [0, 10, 5] encoder_c…

60.【C语言】内存函数(memset,memcmp函数)

3.memset函数(常用) *简单使用 memset:memory set cplusplus的介绍 点我跳转 翻译: 函数 memset void * memset ( void * ptr, int value, size_t num ); 填充内存块 将ptr指向的内存块的前num个字节设置为指定值&#xff08;解释为无符号char&#xff09;。 (指针ptr类型为…

短剧APP分销小视频联盟收益源码带版权激励视频无需自己上传短剧

功能介绍&#xff1a; 带2000多部短剧资源&#xff0c;有版权&#xff0c;无需自己更新短剧&#xff0c; 已对接广告联盟&#xff0c;解锁短剧观看激励视频&#xff0c;对接各大广告平台 带刷小视频功能&#xff0c;插入视频广告&#xff0c;获取广告收益&#xff0c; 带任…