什么是缺省参数
缺省参数是声明或定义函数时,为函数的参数指定一个缺省值。
在调用该函数时,如果没有指定实参,那么形参就会采用缺省值,如果指定了实参,就使用实参值
缺省参数是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); }
1
缺省参数函数的声明
如果要对含有缺省参数的函数进行声明,缺省参数只需要在声明中存在,不能在函数声明和定义中同时出现
这么设计的原因是防止函数的声明和定义时,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写的缺陷。