C++缺省参数
缺省参数
什么是缺省参数呢?
简单来说,就是 函数的参数可以给一个默认值,如果不给这个函数传递参数的时候
那么改参数就是默认值 , 否则参数就是你指定的参数
缺省参数分为全缺省和半缺省
- 全缺省参数: 所有的参数都有默认值
void func(int a=10,int b=20,int c=30)
{
cout<<"a= "<<a<<endl;
cout<<"b= "<<b<<endl;
cout<<"c= "<<c<<endl;
}
int main()
{
func();//此时 a,b,c都有默认参数,调用不传参
return 0;
}
/****输出****/
// a= 10
// b= 20
// c= 30
- 半缺省参数:不是所有的参数都有默认值,也就是说,必须要传递参数给没有默认值的参数
void func(int a,int b,int c=30)
{
cout<<"a= "<<a<<endl;
cout<<"b= "<<b<<endl;
cout<<"c= "<<c<<endl;
}
int main()
{
//因为a和b两个没有缺省,即最少传两个参数,此时调用错误
// func();
//正确调用
func(99,999);
return 0;
}
/****输出****/
// a= 99
// b= 999
// c= 30
注意事项
-
全缺省和半缺省参数都是从左向右传参,传一个参数默认给第一个形参
-
半缺省参数必须从右向左依次来给, 并且不能间隔着给
之所以从右往左缺省是因为,传参是从左向右
//这是间隔缺省的例子,是错误的 void func3(int a, int b = 20, int c) { /******/ }
-
缺省参数不能在函数声明和定义中同时出现,否则会提示重定义默认参数的问题. 原因是因为如果声明和定义给的默认值是一样的,那么就不知道该设置哪一个为默认值了
规定: 默认参数(缺省参数) 在声明中给定
// test.h中 void func(int b, int a, int c = 20); // test.c中 void func(int b, int a, int c /* = 20*/) { /******/ }
-
缺省值必须是常量或者全局变量, 一般都是常量
缺省参数的应用
我们在设计顺序表的时候,第一次需要初始化
而尾插的时候,如果此时需要扩容,那么存在两种情况:
-
顺序表的capacity(容量)为0 那么我们就把他设置为4
-
否则就capacity 变成二倍
利用缺省参数可以更加巧妙的设计这里
我们在初始化函数中 就设置一个缺省参数,如果用户有需要(知道要插入多少个数据), 可以把capacity设置为100或者更大的数传入进行初始化,这样就减少了一些不必要的扩容(毕竟扩容是有代价的) ,如果没什么需要,因为设置了缺省值,传入的capacity就是默认值4
//test.h
typedef struct SeqList {
int* a;
int capacity;
int size;
}SeqList;
//声明的时候,设置capacity默认为4
void SeqListInit(SeqList* slist, int capacity=4);
//test.c
/*顺序表的初始化*/
void SeqListInit(SeqList* slist, int capacity)
{
int*tmp = (int*)malloc(sizeof(int) * capacity);
if (tmp == NULL)
{
printf("malloc fail!\n");
exit(-1);
}
slist->a = tmp;
slist->capacity = capacity;
}
int main()
{
struct SeqList slist;
//如果知道 一定会插入100个数据,就可以传参数100
// 这样提前开辟好空间,减少插入数据时的扩容操作
SeqListInit(&slist,100);
return 0;
}