当前位置: 首页 > article >正文

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.kler.cn/a/316109.html

相关文章:

  • 云运维基础
  • C++算法练习-day40——617.合并二叉树
  • Excel筛选的操作教程
  • Android 10 默认授权安装app运行时权限(去掉运行时所有权限授权弹窗)
  • Mysql数据库里的SSH连接
  • 大数据新视界 -- 大数据大厂之 Impala 性能飞跃:动态分区调整的策略与方法(上)(21 / 30)
  • Exploring Large Language Models for Knowledge Graph Completion
  • 【设计模式】工厂模式、单例模式、观察者模式、发布订阅模式
  • C++_继承详解
  • 构建智能化直播美颜工具:视频美颜SDK的开发指南
  • 灯塔:JavaScript
  • C++:多态(协变,override,final,纯虚函数抽象类,原理)
  • 10 vue3之全局组件,局部组件,递归组件,动态组件
  • 博睿谷IT认证-订阅试学习
  • 利用H5无插件播放RTSP流的实现方案
  • Vue3 路由传参:玩转 params,让页面交互更流畅!
  • 什么是堡垒机?运维为什么需要堡垒机?
  • ES 索引或索引模板
  • 【图像匹配】基于SIFT算法的图像匹配,matlab实现
  • ECMAScript与JavaScript的区别:深入解析与代码实践
  • 出厂非澎湃OS手机解BL锁
  • STM32篇:通用输入输出端口GPIO
  • 智谱清影的魅力:使用CogVideoX-2b生成6秒视频的真实体验!
  • 信息安全工程师(10)网络信息安全法律与政策文件
  • jvm中的程序计数器、虚拟机栈和本地方法栈
  • Spring8-事务