C++中何时使用which数据成员初始化

When to use which data member initialization in C++

考虑这个程序:

#include <iostream>

class C
{
public:
    C(void): a(1)
    { a=2; }
    int a{3};
};

int main(void)
{
    C c{};
    std::cout << c.a; // 2
}

我可以看到三种形式的数据成员初始化:

  1. 使用成员初始化列表
  2. 使用构造函数
  3. 在 class 正文中使用声明

什么时候使用哪个?

1: Using a declaration in the class body

当成员总是用相同的值初始化时,你应该使用它,并且必须为每个构造函数显式编写它没有意义。

2: Using a member initializer list

对于缺少默认构造函数的成员来说,成员初始化列表显然是必需的,但除此之外,如果您要根据构造函数初始化成员,那么在这里这样做是有意义的。

3: Using the constructor body

构造函数主体对于无法在单个语句(在 init-list 中)中执行的逻辑更有用。但是,我认为在成员初始化器列表或构造函数体中初始化POD之间没有太大区别。

我的建议是使用:

int a{3};

无论 class.

中有多少个构造函数,这都会确保 a 被初始化为 3

我的第二个选择是使用成员初始化列表。

c(void) : a(1) {}

第三个选项,使用代码设置成员变量的值,应该避免。