c++ - 默认成员值最佳实践

标签 c++ constructor c++11 header-files default-value

编写 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,可以在三个不同的构造函数中进行不同的初始化,因此它们在构造函数的初始化列表中被初始化。

A curiosum:请注意,提供内联初始化程序会阻止您的类拥有平凡的默认构造函数

关于c++ - 默认成员值最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594846/

相关文章:

c++ - 当通过 boost::program_options 使用多个源时,使用最后一个而不是第一个存储值

c++ - glGenVertexArrays 和 glGenBuffers 参数

c++ - "string.h"在为 iOS 构建 qt 应用程序时未找到消息

perl - 我如何需要一个不是属性的 Moose 构造函数参数?

c++ - 为什么 C++ lambda 不支持 move 捕获?

c++ - 编写用于识别 void 类型的完全特化的问题

c++ - 将 lambda 与 Boost Beast 一起使用而不是绑定(bind)

c++ - 关于 C++ Copy Constructor 调用的问题

java - 模板构造函数,并在主类中创建一个对象

c++ - 解释器的良好优化