默认成员值是最佳实践

当编写C ++ 11代码来为类的头文件中的类成员设置默认值时,是不是很好的做法?

还是在这个类的构造函数中做这个更好?

编辑:

我的意思是:

foo.h

#include <string> using std::string; class Foo{ private: string greet = "hello"; public: Foo(); }; 

VS

foo.cpp (当然有必要的头文件,但没有在类初始化):

 Foo::Foo(){ greet = "hello"; } 

哪一个更好,为什么?

如果一个类成员总是初始化为相同的初始值,那么你应该使内联初始化器,以避免重复。 如果初始值取决于构造函数,则将其放入构造函数初始值设定项列表中。 (不要以你所做的方式使用任务。)

例:

 class Foo { bool done = false; // always start like this int qty; Bar * p; public: Foo() : qty(0), p(nullptr) { } Foo(int q, Bar * bp) : qty(q), p(bp) { } explicit Foo(char const * s) : qty(std::strlen(s)), p(new Bar(s)) { } // ... }; 

在这个假设的例子中, done的成员总是需要以false开始,因此最好是内联写入初始化程序。 另外两个成员, qtyp ,可以在三个不同的构造函数中分别初始化,所以它们在构造函数的初始化列表中初始化。

一个curiosum:请注意,提供一个内联初始化器可以防止你的类有一个微不足道的默认构造函数

这取决于您是否需要保持与较旧的C ++编译器兼容。如果您不使用C ++ 11,则必须在构造函数中初始化大多数成员(全部为非静态)。 此外,许多人主张明确地初始化每个成员,即使这意味着明确地调用默认的ctor。 通常你应该把实现细节放在一个cpp文件中,而不是放在头文件中,这样就是一个例子

 Example: //foo.h class Foo{ public: Foo(); private: std::vector<int> vect; }; //foo.cpp Foo::Foo():vect(){ } 

在C ++ 11中,你有更多的select,并且在类成员初始化器中会变得非常方便,特别是如果你有几个Cors。 有关更多信息, 请访问以下链接: http : //www.stroustrup.com/C++11FAQ.html#member-init

编辑之后:根据您的代码,您正在使用C ++ 11。 据我所知,关于新的可能性只有很less的良好实践的信息,但恕我直言,在类成员初始化非常方便集中初始化在一个地方,从而降低复杂性和打字

在头文件中进行初始化具有保持代码更加本地化和易于理解的主要优点。 它也保存了一些打字。

在我看来,主要缺点是需要包含更多的头部来访问构造函数。 简单的前向声明是不够的,编译需要更长的时间。