编写课堂默认值的最佳做法是什么?

时间:2016-04-16 03:07:54

标签: c++11

鉴于某些类具有一些具有有意义的默认初始值设定项的数据成员,

class C {
    int m1 = 42;
    C2 m2 = 99;
    C2 m3 = { 99 };
    ⋮
};

C2有一个构造函数,它接受1个参数,并且可能不是本地的对象的结果值,也不是容器式的东西,我给它的一个东西就是它保持。

对于变量(与类数据成员相对),"用于初始化中的某些参数的参数之间的差异" vs"持有这个值"通常以std :: vector的情况为例。

std::vector<int> t1 (5);  // 5 is specific to initialization in some manner, not the resulting value.
std::vector<int> t2 { 5 };  // 5 is (one of) the values contained in t2.

现在在类内成员语法中,m2看起来像m1并且似​​乎传达m2将保持相当于99的值。但是,情况并非如此:构造函数参数可能是选择一种模式,或者具有与m2的任何典型属性的get / set不同的域。

因此,我将m3视为“与此不同”,并将其视为需要多个构造函数参数的情况。但是现在我看到这与我在常规初始化定义中使用该语法的方式正好相反:它通常指定,如果类将这两个形式与向量区分开来,它实际上就是从我的意思中说错了。

那么,编写课堂默认值的最佳实践目前的智慧是什么?除了自我记录和清晰度问题之外,还要了解实际语义中的任何问题? This answer是关于一个是否将初始化者与特定成员放在同一个班级中,并且我同意这一点,因为当它总是存在时,它会很有用。相同而且不依赖于任何论点。我询问选择使用哪种语法。

(PS同样的事情出现在函数调用的返回类型和参数值中,我不想手动提及类型:return {5};优于return C2(5);,因为它避免了类型名称,但它强制使用这种形式的初始化语法,这可能与我在定义的情况下为了清晰或甚至正确而使用的形​​式相反。)

1 个答案:

答案 0 :(得分:1)

Stroustrup使用=表示基本类型,{}表示复杂类型。

http://www.stroustrup.com/C++11FAQ.html#member-init

class A {
public:
    A() {}
    A(int a_val) : a(a_val) {}
    A(D d) : b(g(d)) {}
    int a = 7;
    int b = 5;  
private:
    HashingFunction hash_algorithm{"MD5"};  // Cryptographic hash to be applied to all A instances
    std::string s{"Constructor run"};       // String indicating state in object lifecycle
};