函数声明由返回类型、函数名和形参列表(这三个元素组成函数原型 function prototype)组成,形参列表可以只包含形参类型而不包含形参名。
函数通常在头文件中声明,在源文件中定义。
可以给函数添加默认实参,这样编译器会为省略的实参提供默认值。不过,如果有一个形参具有默认实参,那么它后面所有的形参都必须有默认实参。
string screenInit(string::size_type height = 24, string::size_type width = 80, char background = ‘ ‘);
调用screenInit时如果提供了实参,将覆盖默认的实参值。
string screen; screen = screenInit(); // equivalent to screenInit(24, 80, ‘ ‘); screen = screenInit(66); // equivalent to screenInit(66, 80, ‘ ‘); screen = screenInit(66, 256); // equivalent to screenInit(66, 256, ‘ ‘); screen = screenInit(66, 256, ‘#’);
需要注意的是,默认实参是用来替换函数调用缺少的尾部实参,并且是按位置解析(从所缺少的尾部实参的第一个位置开始匹配)。换句话说,如果要为screenInit()的background提供实参,就必须也为height、width提供实参。否则看如下示例:
screen = screenInit(‘?’); // calls screenInit(‘?’, 80, ‘ ‘);
本意是想将’?’传递给background,但实际却传递给了height(char类型实参隐式提升为string::size_type)。所以在设计带有默认实参的函数时,应该将最少使用默认实参的形参放在前面,最有可能使用默认实参的形参排在后面。
既可以在函数声明也可以在函数定义中指定默认实参,但在一个文件中,只能为一个形参指定默认实参一次。通常是在函数声明中指定默认实参,并将该声明放在合适的头文件中。如果在函数定义中指定默认实参,则只在包含该函数定义的源文件中调用该函数时,默认实参才有效。
【学习资料】 《c++ primer》