有默认参数的函数
一般情况下,在函数调用时形参从实参那里取得值,因此实参的个数与形参相同。有时候多次调用同一函数时用同样的实参,C++提供简单的处理方式,给形参一个默认值,这样形参就不必一定要从实参取值了。如有一函数声明:
float area(float r = 6.5);
指定 r 的默认值为6.5,如果在调用此函数时,确认 r 的值为6.5,则可以不必给出实参的值,如
area(); //相当于 area(6.5);
如果不想使形参取此默认值,则通过实参另行给出。如
area(7.9); //实参的值为7.9,而不是6.5
此方法比较灵活,可简化编程,提高效率。
如果有多个实参,可以使每个形参有一个默认值,也可以只对一部分形参指定默认值,另一部分不知道默认值。如:
float volume(float h, float r = 12.5); //只对形参 r指定默认值12.5
这时,函数调用可以采用以下形式:
volume(45.6); //相当于 volume(45.6, 12.5);
volume(34.2, 10.4); //h 的值为34.2, r的值为10.4
实参与形参的结合是从左至右顺序进行的,第一个实参必然与第一个形参结合... 因此,指定默认值的参数必须放在形参列表中的最右端,否则出错。例如:
void f1(float a, int b = 0, int c, char d = 'a'); //Wrong
void f2(float a, int c, int b = 0, char d = 'a'); // Right
如果调用上面的 f2函数,可以采取下面的形式:
f2(3.5, 5, 3, 'x'); //全部从实参获得值
f2(3.5, 5, 3); //最后一个形参取默认值
f2(3.5, 5); //最后两个形参都取默认值
注意,由于实参与形参的结合是从左至右顺序进行的,调用 f2的时候不能缺省第三个形参,而同时写上第四个形参,系统会以为你写上的是第三个参数,而第四个参数使用默认值。
注意:
(1)如果函数的定义在函数调用前,则应在函数定义中给出默认值。如果函数定义在函数调用之后,则在函数调用之前需要有函数声明,此时必须在函数声明中给出默认值,在函数定义时可以不给出默认值。如果在声明函数时已对形参给出了默认值,而在定义时又对形参给出默认值,有的编译系统会报错“重复指定默认值”。为避免混淆,最好只在函数声明时指定默认值。
(2)一个函数不能既作重载函数,又作为有默认参数的函数。因为当调用函数时如果少写一个参数,系统无法判断是利用重载函数还是利用默认参数的函数,出现二义性。