目录
- 缺省参数
- 全缺省
- 半缺省
- 有意义的使用场景
- 注意点
缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
举例:Func(2),那么a就是2,Func(),那么a是1
//缺省参数
void Func(int a = 1)
{
cout << a << endl;
}
int main()
{
Func(2);
Func();
return 0;
}
全缺省
可以不传参数,传的时候默认传给第一个,不能只传给第二个第三个
//全缺省
void Func(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func();
// 显示传参,从左往右显示传参
Func(1);
Func(1,2);
Func(1, 2, 3);
return 0;
}
半缺省
半缺省参数必须从右往左依次来给出,不能间隔着给
void Func(int a=10, int b, int c = 20)这种写法是错误的
// 半缺省 -- 必须从右往左,给缺省值
void Func(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
有意义的使用场景
void dz::StackInit(ST* ps, int N=4)
{
ps->a = (int*)malloc(sizeof(int) * N);
ps->top = 0;
ps->capacity = 0;
}
int main()
{
Func(1);
Func(1,2);
Func(1, 2, 3);
dz::ST st1;
StackInit(&st1, 10);
for (size_t i = 0; i < 10; i++)
{
StackPush(&st1, i);
}
dz::ST st2;
StackInit(&st2, 100);// 避开了扩容
for (size_t i = 0; i < 100; i++)
{
StackPush(&st2, i);
}
// 不知道可能会插入多少个
dz::ST st3;
StackInit(&st3);
return 0;
}
注意点
缺省参数不能在函数声明和定义中同时出现
只能声明给,定义不给的场景:
stack.h头文件中
void StackInit(ST* ps, int N);
stack.cpp文件中
void dz::StackInit(ST* ps, int N=4)
{
ps->a = (int*)malloc(sizeof(int) * N);
ps->top = 0;
ps->capacity = 0;
}
test.cpp中调用时就会失败
声明和定义选一个给的场景:
在stack.h文件中同时有声明和定义那么声明和定义选一个给缺省参数就可以
namespace dz
{
typedef struct Stack
{
int* a;
int top;
int capacity;
}ST;
// 不允许声明和定义同时给缺省参数
void StackInit(ST* ps, int N);
void StackPush(ST* ps, int x);
}
void dz::StackInit(ST* ps, int N = 4)
{
ps->a = (int*)malloc(sizeof(int) * N);
ps->top = 0;
ps->capacity = 0;
}
建议声明和定义分开
错误案例:
在stack.h文件中
在test.cpp文件中
然后在另外的stack.cpp中
这样就造成了链接冲突,test.cpp和stack.cpp两边都有stackInit()的定义,就重定义了
建议声明和定义分开,函数的缺省参数在声明赋值,便于在头文件中查找修改。