"overcrowding" 成员初始值设定项列表是一回事吗?

Is "overcrowding" a member initializer list a thing?

假设我有一个 class,它有许多成员确实定义了默认构造函数,因此不需要在初始化列表中初始化它们(如下例所示)。

有没有一点,初始化列表变得“过于拥挤”,以至于阅读起来有点尴尬,为了可读性,最好在构造函数的主体中分配东西?

class Foo {
public:
    Foo(const std::vector<Thing>& things) :
        m_Vec1(1.0f, 1.0f, 1.0f), m_Vec2(1.0f, 1.0f, 1.0f), m_Vec3(1.0f, 1.0f, 1.0f),
        m_Vec4(1.0f, 1.0f, 1.0f), m_SomeFile("some/path/to/file.txt"), m_Model("some/path/to/model.obj"),
        m_AnotherVec(1.0f, 1.0f, 1.0f), m_Things(things), m_Size(things.size())
    {}

private:
    vec3f m_Vec1;
    vec3f m_Vec2;
    vec3f m_Vec3;
    vec3f m_Vec4;

    FileClass m_SomeFile;
    Model m_Model;

    vec3f m_AnotherVec;

    std::vector<Thing> m_Things;
    uint32_t m_Size;
};

如果您有在编译时已知的固定值,您可以使用内联初始化,例如:

vec3f m_Vec1 = { 1.0f, 1.0f, 1.0f };
vec3f m_Vec2 = { 1.0f, 1.0f, 1.0f };
// etc.

您可以使用空格使“过度拥挤”的代码更具可读性。示例:

Foo(const std::vector<Thing>& things) :
        m_Vec1(1.0f, 1.0f, 1.0f),
        m_Vec2(1.0f, 1.0f, 1.0f),
        m_Vec3(1.0f, 1.0f, 1.0f),
        m_Vec4(1.0f, 1.0f, 1.0f),
        m_SomeFile("some/path/to/file.txt"),
        m_Model("some/path/to/model.obj"),
        m_AnotherVec(1.0f, 1.0f, 1.0f),
        m_Things(things)
    {}

我不认为在初始化后使用构造函数体来分配成员可以提高可读性。


可以通过对重复初始化器使用常量和默认成员初始化器而不是成员初始化列表来进一步简化该示例:

class Foo {
public:
    Foo(const std::vector<Thing>& things) :
        m_Things(things) {}

private:
    constexpr inline static vec3f default_vec{1.0f, 1.0f, 1.0f};
    vec3f m_Vec1 {default_vec};
    vec3f m_Vec2 {default_vec};
    vec3f m_Vec3 {default_vec};
    vec3f m_Vec4 {default_vec};

    FileClass m_SomeFile {"some/path/to/file.txt"};
    Model m_Model {"some/path/to/model.obj"};

    vec3f m_AnotherVec {default_vec};

    std::vector<Thing> m_Things;
};

请注意,我已经删除了 m_Size 成员。它完全是多余的,因为向量的大小存储在向量中。