【问题标题】:When to use which data member initialization in C++何时在 C++ 中使用哪个数据成员初始化
【发布时间】:2016-02-25 04:46:56
【问题描述】:

考虑到这个程序:

#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. 在类主体中使用声明

什么时候用哪个?

【问题讨论】:

  • 不,你有初始化列表、构造函数和 default 值。 int a{3} 仅在您为给定构造函数指定初始化程序时适用。由于您指定了: a(1)(也可以写成: a{1}),因此默认值被1而不是3覆盖。

标签: c++ class initialization data-members


【解决方案1】:

1:在类体中使用声明

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

2:使用成员初始化列表

对于缺少默认构造函数的成员来说,成员初始化器列表显然是必需的,但除此之外,如果您基于构造函数初始化成员,则在此处执行此操作是有意义的。

3:使用构造函数体

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

【讨论】:

    【解决方案2】:

    我的建议是使用:

    int a{3};
    

    这确保a 初始化为3,无论您在类中有多少构造函数。

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

    c(void) : a(1) {}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      相关资源
      最近更新 更多