若函数末尾连续存在多个默认参数,在函数调用时实参会按先后顺序传给函数中形参
void Func(int i, float f = 2.0f, double d = 3.0) ;
调用函数时
Func(1,3);
此时第二个实参3会传给函数的第二个形参,不会传给第三个形参,这一点是肯定的。
如果某个参数是默认参数,那么它后面的参数必须都是默认参数
下面两种情况都可以
void Func(int i, float f = 2.0f, double d = 3.0) ; void Func(int i, float f, double d = 3.0) ;
但是下面的这样就不可以
void Func(int i, float f = 2.0f, double d) ;
编译器报错:
默认参数的连续性能保证编译器正确的匹配参数。所以可以下这样一个结论,如果一个函数含有默认参数,那么它的最后一个参数一定是默认参数。
函数重载时谨慎使用默认参数值
比如下面两个重载函数func,一个只接受一个参数,而另一个接受两个参数,包括一个默认参数。
class Test { public: int func(int a) { return a; } int func(int a, int b = 1) { return a + b; } } ;
如果像下面这样调用函数
int main(void) { Test test; int result = test.func(1); getchar() ; return 0 ; }
调用时出现歧义,编译器就不知道选择哪个函数,这就造成了混淆,所以函数重载时谨慎使用默认参数值