我发现了一些奇怪的代码......
//in file ClassA.h:
class ClassA {
public:
void Enable( bool enable );
};
//in file ClassA.cpp
#include <ClassA.h>
void ClassA::Enable( bool enable = true )
{
//implementation is irrelevant
}
//in Consumer.cpp
#include <ClassA.h>
....
ClassA classA;
classA.Enable( true );
显然,由于Consumer.cpp
仅包含ClassA.h
而非ClassA.cpp
,编译器将无法看到该参数具有默认值。
方法实现的签名中声明的默认值ClassA::Enable
何时会产生影响?只有在包含ClassA.cpp
?
答案 0 :(得分:11)
默认值只是一个编译时间。编译代码中没有默认值(没有元数据或类似的东西)。它基本上是编译器的替代品“如果你不写任何东西,我会为你指定。”因此,如果编译器看不到默认值,则假定没有一个。
演示:
// test.h
class Test { public: int testing(int input); };
// main.cpp
#include <iostream>
// removing the default value here will cause an error in the call in `main`:
class Test { public: int testing(int input = 42); };
int f();
int main() {
Test t;
std::cout << t.testing() // 42
<< " " << f() // 1000
<< std::endl;
return 0;
}
// test.cpp
#include "test.h"
int Test::testing(int input = 1000) { return input; }
int f() { Test t; return t.testing(); }
测试:
g++ main.cpp test.cpp
./a.out
答案 1 :(得分:3)
首先我要承认,这是我第一次看到这种类型的代码。在头文件 IS 中设置默认值是正常做法,但事实并非如此。
我的猜测是这个默认值只能用于编写在同一个文件中的代码,这样编写这个代码的程序员想把它放在调用函数的某种类型的容易性但是他不想打扰外部世界可见的界面(头文件)。
答案 2 :(得分:1)
这只会在方法发生时发生 从文件中调用 包括ClassA.cpp?
这是对的。但请注意,这样做几乎肯定会产生多个定义错误,因此默认情况下只能从ClassA.cpp中的定义点开始提供。
答案 3 :(得分:0)
将默认值放在声明中,而不是定义。
class ClassA {
public:
void Enable( bool enable = true );
};