【问题标题】:Best practice in writing in-class default values?编写课堂默认值的最佳实践?
【发布时间】:2016-08-08 04:00:12
【问题描述】:

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

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

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

对于变量(相对于类数据成员),“用于初始化的参数”与“保存该值”之间的区别通常以 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 视为“与此不同”,并且一般适用于需要多个构造函数参数的情况。但现在我发现这与我在常规初始化定义中使用该语法的方式完全相反:它通常指定 value,如果类将这两种形式与向量区分开来,它实际上会从我的意思说错了。

那么,目前编写类内默认值的最佳实践的智慧是什么?除了自我文档和清晰度问题之外,还有什么需要了解的实际语义问题? This answer 是关于是否应该 将初始化程序放入具有特定成员的类中,我同意这一点,因为当它始终相同且不依赖于任何参数时,这样做是件好事。我问的是选择使用哪种语法。

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

【问题讨论】:

    标签: c++11


    【解决方案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
    };
    

    【讨论】:

    • 这是一个例子,但它并没有解决我的任何观点:总是对带有构造函数的类型使用大括号并不能区分参数的值与配置使用,或者某些类区分的事实两个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多