前言
缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(缺省参数也叫默认参数)。
如下面函数中的a = 0:
#include<iostream>
using namespace std;
void Func(int a = 0)
{
cout << a << endl;
}
int main()
{
Func(); // 没有传参时,使⽤参数的默认值
Func(10); // 传参时,使⽤指定的实参
return 0;
}
一、全缺省
全缺省就是全部形参给缺省值。如果调用函数时给定值,就用给定值。否则就用缺省值。
如下边的代码,给的abc的值时打印abc的值,没给定时打印缺省值:
#include<iostream>
using namespace std;
void Func1(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func1(); //没有传参时,使⽤参数的默认值
Func1(1); //只给定第一个值时,其余参数用默认值
Func1(1, 2);
Func1(1, 2, 3); //全部使用指定参数
return 0;
}
结果如下:
不支持下面的操作:
Func1( , 2, ,);
二、半缺省
半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
代码如下(示例):
void Func2(int a, int b = 10, int c = 20)//缺省值只能从右往左给
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
下面这种就是错误的给法:
void Func2(int a = 10, int b, int c = 20)//缺省值只能从右往左给
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
- 半缺省与全缺省的区别就是半缺省至少要传一个。
三、缺省参数的应用
我们在设计栈的时候可以用到缺省参数
在头文件stack.h中声明栈和栈的初始化函数:
//stack.h
#include<iostream>
#include<assert.h>
using namespace std;
typedef int SDataType;
typedef struct stack
{
SDataType* data;
int top;
int capacity;
}ST;
void STInit(ST* ps, int n = 4);//可以使用缺省参数
在stack.cpp中定义初始化函数的操作
//stack.cpp
#include"stack.h"
// 缺省参数不能声明和定义同时给
void STInit(ST* ps, int n)
{
asssert(ps);
ps->data = (SDataType*)malloc(n*sizeof(SDataType));
ps->capacity = n;
ps->top = 0;
}
在test.cpp中调用初始化函数:
//test.cpp
#include"stack.h"
int main()
{
ST s1;
STInit(&s1);//不传开辟空间的大小,n默认使用缺省值4
// 确定知道要插⼊1000个数据,初始化时⼀把开好,避免扩容
ST s2;
STInit(&s2,1000);
return 0;
}
总结
- C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
- 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
- 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。