目录

🍯1.3 缺省参数
缺省参数一共有两种类型:全缺省参数、半缺省参数;它的本质就是当不传参数进入函数时,就用函数定义时所设置的默认参数。
🥝1. 全缺省参数
1、有一个缺省参数时
void TestFunc(int a = 0) { cout << a << endl; } int main() { TestFunc(); //没有传参时,使用参数的默认值 TestFunc(1); //传具体参数时,使用传入的参数值 return 0; }
当只有一个默认参数时,当我们一个参数都不传递的时候,就使用默认参数;当我们传入了指定参数时,我们就使用指定参数。
2、有多个缺省参数时
void TestFunc(int a = 10, int b = 20, int c = 30) { cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl; } int main() { TestFunc(); //没有传参时,使用参数的默认值 TestFunc(1); //传1个参数 TestFunc(1,2); //传2个参数 TestFunc(1,2,3); //传3个参数 return 0; }
在包含多个缺省参数时,当我们不传参数时,就使用所有参数的默认值;当我们传1个参数时,就替换函数接收参数中从左开始的第一个参数的默认值。
例如我们想给a传一个数为1,b和c用默认值时,就可以传一个数过去TestFunc(1);但如果此时我们想给b传一个数2,a和c使用默认值时,我们就不能传TestFunc(2)或TestFunc(,2,)了,因为替换操作对于函数参数是从左往右顺序进行的,因此只能传递TestFunc(10,2),将a的默认值也传过去才行。
🥝2. 半缺省参数
半缺省并不是缺省一般参数,而是指缺省部分参数,此时至少需要传一个参数,不能一个参数都不传,如果不传参数,此时就会报错。
void TestFunc(int a, int b = 20, int c = 30) //半缺省c和b,参数a不可缺
特别需要注意的是,在半缺省中必须要求从右往左连续缺省,即为缺省参数赋值的操作必须从右向左连续:
void TestFunc(int a, int b = 20, int c = 30) // √ 缺省参数c和b从右往左都顺序赋值了 void TestFunc(int a = 10 , int b, int c = 30)// × 缺省参数c和a并不连续,中间夹了不可缺省的b void TestFunc(int a = 10 , int b = 20, int c)// × 缺省参数b和a并不是从右往左连续,最右的c未被赋值
🥝3. 缺省参数的应用
例如我们在进行数据结构中对“栈”进行初始化时,可以使用半缺省的方式对其进行初始空间的定义,当不指定初始化时所开空间的个数,就使用缺省参数的值,n=4进行开辟空间操作。
#include #include using namespace std; typedef struct Stack { int* a; int size; int capacity; }Stack; void StackInit(struct Stack* ps, int n = 4) //初始化若不指定开的空间个数,默认开4个 { assert(ps); ps->a = (int*)malloc(sizeof(int) * n); ps->size = 0; ps->capacity = 0; } int main() { Stack st; StackInit(&st); //全缺省 return 0; }
🥝4. 缺省参数在声明与定义中的矛盾
缺省参数在不能同时在声明和定义中出现,我们可以举个简单的例子来看一看~
//print1.h 中 void print1(int n = 10); //在声明时为默认参数赋值 //print1.cpp 中 void print1(int n = 10) //在定义时也为默认参数赋值 { cout << n << endl; }
通过上述案例可见我们只能在声明或者定义中选一处进行赋值,那么我们到底应该选哪里进行赋值呢?此时共有两种搭配:
- 声明赋值,定义不赋值(√):这种情况是可以正常运行滴!
void print1(int n = 10); //声明给值 void print1(int n) //定义不给 { cout << n << endl; }
- 定义赋值,声明不赋值(×):这种情况是不能正常运行的,这时因为编译器在进行链接时先找的是声明,如果在声明里没有为缺省参数赋值,那么当不传入参数时print1(),计算机就懵啦!
Q1:为什么声明和定义不能同时出现?
A1:因为计算机害怕声明和定义这两个部分对于默认参数的赋值不同,例如在声明时给默认参数赋值int n = 10,在定义时给默认参数赋值int n =20,这时计算机就不知道要听谁的了。