类中成员函数如有默认实参,最好能将默认实参写在成员函数的声明中。具体原因如下:
一. 函数的实现与默认参数无关,所以,没必要让默认实参出现在函数的定义体中。
二. 函数的默认参数可能会要改动,修改函数的声明比修改函数的定义更方便。
(以上两点中提及的函数不仅仅局限于类的成员函数)
三. 现有如下情况:
有三个文件,分别为a.h, a.cpp, main.cpp
a.h:
class A
{
public:
void output(char);
}
a.cpp:
#include<iostream>
void A::output(char c = 'C')
{
std::cout<<c<<std::endl;
}
main.cpp:
#include "a.h"
int main()
{
A n;
n.output();
return 0;
}
这段代码将通不过编译。编译器报错为output方法调用0个参数。
具体原因如下:
当程序在main()方法中调用output方法时,该方法仅有声明是可见的。而显然,该方法被声明为接受一个字符型参数,无返回。故默认实参调用output方法是非法的。
同样,下面这段代码同样通不过编译。
void f(char);
int main()
{
f();
}
void f(char c = 'C'){}
实际上,当函数声明和函数定义同时存在时,将默认实参写在函数定义中是非法的。此种情况只有当函数定义与函数调用位于同一个源文件中,且函数定义先于函数调用被编译时,程序才能通过编译。而这种情况下函数根本就不需要声明。
故:如果方法有默认实参,将其写在该方法的声明中是必要的。
PS:在函数声明及函数定义中均写入默认实参是非法的。
文章出处:http://hi.baidu.com/binary_sun/blog/item/51f28b5ebe505f48faf2c02a.html