[C++]缺省参数-声明和定义歧义问题
目录
一、缺省参数概念
二、缺省参数分类
1、全缺省参数
2、半缺省参数
三、缺省参数中声明和定义歧义问题
情况一:在函数声明和定义分离时,如果都使用缺省参数,则执行时会报错。
情况二:在函数声明和定义分离时,函数声明不指定缺省参数,定义指定缺省参数,则执行也会报错。
一、缺省参数概念
缺省函数是声明或者定义函数时给函数参数指定的一个缺省值,在函数调用时,如果没有指定实参就使用函数形参的缺省值,否则使用指定的实参。
二、缺省参数分类
1、全缺省参数
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();func(1);func(1, 2);func(1, 2, 3);
}
2、半缺省参数
//半缺省必须从右往左连续设置
void func(int a , int b = 20, int c = 30)
{cout << "a=" << a << endl;cout << "b=" << b << endl;cout << "c=" << c << endl;
}
int main()
{func(1);func(1, 2);func(1, 2, 3);
}
三、缺省参数中声明和定义歧义问题
情况一:在函数声明和定义分离时,如果都使用缺省参数,则执行时会报错。
以下面代码为例:

声明和定义同时使用缺省参数,执行会出错
原因:声明和定义同时使用缺省参数,可能会出现缺省参数不一致的情况,比如Stack.h中void InitStack(Stack* pst, int stackCapacity =40);
Stack.cpp中void InitStack(Stack* pst, int stackCapacity =100);
这种情况执行时会出现歧义,不知道使用哪个缺省参数,因此声明和定义同时使用缺省参数,会执行出错。
情况二:在函数声明和定义分离时,函数声明不指定缺省参数,定义指定缺省参数,则执行也会报错。

函数声明不指定缺省参数,定义指定缺省参数
原因:程序在执行的预处理阶段展开头文件,test.cpp中包含了Satck.h头文件,将Satck.h中的内容展开,得到void InitStack(Stack* pst, int stackCapacity);的声明,但是test.cpp中InitSatck(&st)只有一个参数,从而会在编译阶段报错,因此语法规定缺省参数在声明中,而不在定义中。
正确代码

