与一些答案相反,这两种做法存在差异。
如果将实现放入类声明中,该方法将自动标记为inline
。对于像包装这样的非常简短的方法,这是一个非常有用的功能建议的练习。
如果将实现放入单独的.cc
文件中,您将增加可读性(正如David Titarenco在他的答案中已经写过的)并减少项目中的可能依赖项。仅在方法声明中作为引用,指针或返回值出现的类只需要在头中有一个前向声明。他们的实现细节在这里是不相关的,因此对于包含这个头文件的每个文件也是如此举个例子:
// test.h
class A; // forward declaration of A
// #include "decl_of_class_A.h" // not needed here, because ...
class B {
public:
A method1(); // in these cases the forward
void method2(A* a); // declaration of A above
void method3(A& a); // is completely sufficient.
};
// test.cc
#include "decl_of_class_A.h" // here we really need
// the complete declaration of A
// in order to be able to *use* it
A B::method1() { /*...*/ }
// ...
现在,如果你有test.h
到另一个.cc
文件和A
类的改变声明,只test.cc
需要重新编译,而不是其他.cc
文件。类别B
的声明没有变化。
此外:有些情况下您必须将实现放在您的头文件中:如果您正在编写类或函数模板,或者确实需要将函数声明为inline
。
Omnifarious正确地评论道:您有时看到的附加代码肯定会被每个C++编译器拒绝。 const
类的成员必须在初始化程序列表中初始化。之后,他们保持固定并且不会为您提供默认分配操作员。这意味着,即使你使用初始化列表,你将永远无法写出这样的事情,只要你没有重载赋值运算符:
Point p(10, 20);
Point q(0, 0);
q = p; // no assignment operator provided ==> error!
如果你真的需要不断协调你应该写const Point p(10, 20)
。
初始化列表的构造函数呢?我应该把它们放入声明中(因为构造函数的主体通常是空的?)。 – helpermethod 2011-03-01 19:55:34
那么,“自动”取决于编译器。但是,是的,内嵌小叶函数是非常理想的。 – EboMike 2011-03-01 19:55:35
@Helper方法:如果函数体是空的,我通常会将它们放入声明中。但是当涉及到“内联”时,这取决于它。查看C++ FAQ lite,第9节“内联函数”以获得对该主题的详细描述。 – phlipsy 2011-03-01 20:01:02