某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参。调用含有默认实参的函数时,可以包含该实参,也可以省略该实参。
例如定义一个函数screen表示窗口的内容:
typedef string::size_type sz; string screen(sz ht = 24, sz wid = 80, char backgrnd = ' ');
我们可以为一个或多个形参定义默认值,但是需要注意:一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。
比如 string screen(sz, sz = 80, char = ' '); 这样的代码是正确的,但是 string screen(sz = 24, sz, char); 就是错误的。
我们可以提供实参覆盖默认值,但是要想覆盖后面的默认实参,必须给前面的形参也提供默认值,而不能跳过,比如:
string window = screen(, , '?');
是错误的,而下列两行都是正确的:
string window = screen(20, 20, '?');
string window = screen(20); //等价于screen(20, 80, ' ')
我们还可以多次声明同一个函数,后续声明能且只能给之前那些没有默认值的形参添加默认实参,而且该形参的右侧的所有形参都必须有默认值。假如给定
string screen(sz, sz, char = ' ');
我们不能修改一个已经存在的默认值
string screen(sz, sz, char = '*');//错误:重复声明
但是可以按照如下形式添加默认实参:
string screen(sz = 23, sz = 80, char);