目录
- 什么是缺省参数
- 缺省参数分类
- 全缺省参数
- 半缺省参数
- 缺省参数函数的声明
- 缺省参数的使用
什么是缺省参数
缺省参数是声明或定义函数时,为函数的参数指定一个缺省值。
在调用该函数时,如果没有指定实参,那么形参就会采用缺省值,如果指定了实参,就使用实参值
缺省参数是C++特有的,C语言不支持
#include <iostream>
using namespace std;
void test(int a = 1)//这里的a就是缺省参数
{
cout << a << endl;
}
int main()
{
test(); //没有传参时,采用参数的默认值
test(10); //有传参时,采用实参值
return 0;
}
输出结果:
上面代码中,test
函数里的形参a
就是一个缺省参数
还有一点要注意的是缺省值必须是常量或者全局变量,其他不可以
缺省参数分类
全缺省参数
全缺省参数,顾名思义,就是为每一个函数形参都
赋了一个缺省值
//全缺省参数
void test2(int a = 10, int b = 20, int c = 30)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
int main()
{
test2();//没有传参时,采用参数的默认值
test2(1);//传了1个参数,形参a采用实参值,其余采用参数的默认值
test2(1,2);//传了2个参数,形参a,b采用实参值,剩下的c采用参数的默认值
test2(1,2,3);//传了3个参数,全都采用实参值
return 0;
}
这里对缺省参数的赋值只能从左往右赋值,不能 “跳着” 赋值
什么叫从左往右呢?
就是test2(1)
,里面有1个实参值,那么形参参数列表从左开始第一个形参就是a
,所以这个1的形参值就是赋
给a
的
同理test2(1,2)
,里面有2个实参值,形参参数列表从左往右的2个形参是a
b
,1、2就被赋值给了a
b
如果想给缺省参数
a
和c
赋值,b
采用缺省值,其实是无法实现的,因为给缺省参数赋值只能从左往右,跳过一个赋值是实现不了的
半缺省参数
半缺省参数,不是缺省一半的参数,而是部分参数是缺省的
半缺省参数必须是从右往左依次来给出,不能间隔着给
//半缺省参数
void test3(int a, int b = 20, int c = 30)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
int main()
{
test(1);
test(1,2);
test(1,2,3);
}
缺省参数函数的声明
如果要对含有缺省参数的函数进行声明,缺省参数只需要在声明中存在,不能在函数声明和定义中同时出现
这么设计的原因是防止函数的声明和定义时,2个缺省参数不一样
下面我们看一下如果在函数声明和定义中同时出现缺省参数的结果
缺省参数的使用
我们用顺序表的初始函数来说明一下缺省参数的使用场景
以前我们用C语言实现顺序表是这样的
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT 4
struct SList
{
int* a;
int size;
int capacity;
};
void SlistInit(struct SList*plist)
{
plist->a = (int*)malloc(sizeof(struct SList) * DEFAULT);
if (plist->a == NULL)
{
perror("malloc fail");
return ;
}
plist->size = 0;
plist->capacity = DEFAULT;
}
因为是动态开辟,我们不知道表里需要多大空间,所以我们给表的空间大小初始化为4
但是如果我们知道要存100个数据,而空间大小初始化为4,那么需要多次空间开辟,而空间开辟又是有消耗的,所以我们可以改为#define DEFAULT 100
,但是将DEFAULT
改为100后,如果其他情况下不需要100空间大小,那么开100个空间又浪费了
所以我们可以通过缺省参数去升级写法:
void SlistInit(struct SList*plist,int defaultcapacity = 4)
{
plist->a = (int*)malloc(sizeof(struct SList) * defaultcapacity);
if (plist->a == NULL)
{
perror("malloc fail");
return ;
}
plist->size = 0;
plist->capacity = defaultcapacity;
}
如果这样写,当我们知道表中会存多少元素时,我们可以通过对缺省参数传参,改变defaultcapacity
的值,直接开辟正好的空间,避免多次开辟,有消耗
当我们不知道表中会存多少元素时,不用对缺省参数传参,defaultcapacity
采用缺省值,在后序的操作中,按需扩容,避免空间浪费
这样写就完美的解决了之前用C写的缺陷。