一直受默认实参的困扰,可能还是自己太懒,查找资料得出结论:
将默认实参放在函数的声明中,并且在函数定义中没有默认实参!也就是说,函数实参只存在于声明中.
1.为什么默认实参从声明中删除,而在定义中添加会报错?(错误提示:error C2660: “xxx”: 函数不接受 0 个参数)
假定有三个文件,分别为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方法是非法的。
2.为什么在声明和定义中都添加,也会报错?(错误提示:error C2572: “xxx”: 重定义默认参数)
原因是因为书上说的:在一个文件(准确的说,是一个作用域)中只能为一个形参指定默认实参一次。当编译的时候,头文件会和源文件结合,这时,就会出现多次指定默认形参的情况.