C++中允许为函数提供默认参数,又名缺省参数。
- 使用默认参数时的注意事项:
① 有函数声明(原型)时,默认参数可以放在函数声明或者定义中,但只能放在二者之一。建议放在函数声明中。
double sqrt(double f = 1.0); //函数声明
double sqrt(double f) //函数定义
{
// ....
}
② 没有函数(原型)时,默认参数在函数定义时指定.
//没有 函数声明
double sqrt(double f = 1.0) //函数定义
③ 在具有多个参数的函数中指定默认值时,默认参数都必须出现在不默认参数的右边,一旦某个参数开始指定默认值,它右边的所有参数都必须指定默认值.
int f (int i1, int i2 = 2, int i3 = 3); // 正确
int g (int i1, int i2 = 2, int i3); // 错误, i3未指定默认值
int h (int i1 = 1, int i2, int i3 = 3); // 错误, i2未指定默认值
④ 在调用具有默认参数的函数时, 若某个实参默认,其右边的所有实参都应该默认。
//例如, 一个函数声明如下
int f(int i1 = 1, int i2 =2, int i3 = 3);
//调用函数 f()
f(); //正确, i1=1, i2=2, i3=3
f(3); //正确, i1=3, i2=2, i3=3
f(2, 3); //正确, i1=2, i2=3, i3=3
f(4, 5, 6); //正确, i1=4, i2=5, i3=6
f(, 2, 3); //错误, i1默认,其右边的i2和i3没有默认
注意的是:
带缺省值的参数必须放在参数列表的最后面。因为传参是从右向左的。
缺省参数不能同时在函数声明和定义中出现,只能二者留其一。
缺省值必须是常量或者全局变量。
C语言并不支持缺省。
函数传参顺序和匹配原则:
假设一个函数头是void show(int a,int b,int c)
1、因为传参时,是按形参列表从左向右赋值的(即先赋给a,再赋给b,最后赋给c)。故如果设默认值的话,应该从最右端开始,才能保证传进来的值能正确对应地赋给所想的参数,也不会覆盖掉预先设好的默认值
2、上例中,如果要定义默认参数,则首先应该定义c的默认参数值,只有在c的默认值定义好的情况下才能继续定义b为默认参数。满足从右向左顺序。例如,void show(int a,int b =1,int c=2)
3、如果不按顺序来,比如定义成了void show(int a,int b=1,int c),首先,vs2010会报错。不过,先假设比较早的版本不报错。
若想让b使用默认值,则在调用函数时无法成功
1)比如,写成show(2,3),这样写是错误的
2)比如,写成show(2,3),系统肯定会认为这是给a、b传的值。而c没被传值,又没有默认值,因此还是错的
总结:
设置函数默认参数(缺省实参)是从右往左;调用函数传入实参时,实参和函数的形参的匹配顺序是从左往右