具有初始化列表的构造函数中的这种重复是否真的有必要?

Is this duplication in constructors with initializer lists really necessary?

我在 class 中是否正确使用了初始化列表?似乎有很多代码重复。如果我需要另一个变量,我必须在三个地方添加它。

class MyClass {
public:
    MyClass(
        anotherClass _a,
        std::string _b,
        std::string _c,
        float _d
        )
        : a(_a),
        b(_b),
        c(_c),
        d(_d)
    { }
private:
    anotherClass a;
    std::string b;
    std::string c;
    float d;
};

初始化列表的使用是正确的,但是这个 class 的意义是非常可疑的。您可以让所有成员 public 然后使用聚合或统一初始化来初始化每个成员。如果您确实需要未显示的复杂语义,那么使用 init 列表没有任何问题。

如果你最终得到 class,那
1)有一个构造函数发送它的所有数据,
2) 为所有成员提供吸气剂并且
3) 为所有成员设置二传手,
您可能应该选择没有私有成员的结构。

然后你可以使用 'uniform initialization' 比如:
MyX x{"hello",5.5}; 无需编写构造函数。

如果不是这种情况(你的 class 实际上有一个不变量)那么
是的,添加成员时必须在3个地方添加一个东西。

请注意,由于范围规则,以下工作:

class A {
    int mem;
public:
    A(int mem) : mem(mem) {}
};

不需要下划线。