具有初始值设定项列表的构造函数中的这种重复是否真的必要

Is this duplication in constructors with initializer lists really necessary?

本文关键字:是否 真的 构造函数 列表      更新时间:2023-10-16

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

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;
};

初始值设定项列表的用法是正确的,但对于这个类的意义是什么,这是非常可疑的。您可以只将所有成员设为公共,然后使用聚合或统一初始化来初始化每个成员。如果你真的需要没有显示的复杂语义,那么使用 init 列表并没有错。

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

然后,您可以使用"统一初始化",例如:
MyX x{"hello",5.5};无需编写构造函数。

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

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

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

无需下划线。