【问题标题】:How to properly initialize the data members in C++11?如何正确初始化 C++11 中的数据成员?
【发布时间】:2016-11-25 08:29:38
【问题描述】:

在 C++11 中,我们有两种方法来初始化类/结构的数据成员,如下例所示:

struct A
{
    int n = 7;
};

struct B
{
    int n;

    B() : n(7) {}
};

问题 1:

哪种方式更好?

问题 2:

从现代 C++ 风格的检查器的角度来看,不鼓励传统方式(后者)吗?

【问题讨论】:

    标签: c++ c++11 constructor initialization styles


    【解决方案1】:

    你实际上可以混合这两种风格。如果您有多个构造函数,这很有用,但变量仅由一个或几个构造函数专门初始化。

    例子

    struct A
    {
        int n = 7;
    
        A() {}  // n will be initialized to 7
        A(int n_): n{n_} {}  // Initialize n to something else
    };
    

    【讨论】:

    • 我不确定 n{n_} 是否有误?是否也可以在构造函数中使用初始化符号?
    • 还有一件事,如果我是对的,在使用 Initializer list 时可能会导致一些开销。如果您必须处理有限的资源,我会避免使用。
    • 你在这里少了一个冒号:A(int n_) : n{_n} {}
    【解决方案2】:

    我不确定,但我认为第一种情况仅适用于 C++ 原始类型。在大多数书籍中,尤其是在 Scott Meyers 所著的《改进 C++ 代码的 55 种方法》一书中,建议使用第一种方式,所以我会坚持下去。 :-)

    不要忘记,评估和初始化的顺序取决于类中成员的排序方式。

    我更喜欢第二种初始化方式。

    【讨论】:

    • 那本书是2005年写的,比2011年早了6年。所以作者不知道新的初始化方法。
    • 嗯,他们制作了新版本。我不是说,它是 100% 准确的,但是有一些 C++11 元素,14 完全没有。 :-) 尽管它很旧,但很多概念仍然有效。
    • 糟糕,我不知道。完全错过了你的答案。原谅我。
    • 其实这里的第一种方法叫做“统一初始化”,并不局限于原语;您可以使用此方法构建任何您想要的对象。
    【解决方案3】:

    这两种方法都不是更好,但是,新的统一初始化具有与其他语言相似的优点,并且总体上更易于理解。统一初始化不仅适用于结构成员,还适用于初始化列表和构造函数参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      相关资源
      最近更新 更多