如何正确初始化 C++11 中的数据成员?

Posted

技术标签:

【中文标题】如何正确初始化 C++11 中的数据成员?【英文标题】:How to properly initialize the data members in 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++ 风格的检查器的角度来看,不鼓励传统方式(后者)吗?

【问题讨论】:

【参考方案1】:

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

例子

struct A

    int n = 7;

    A()   // n will be initialized to 7
    A(int n_): nn_   // Initialize n to something else
;

【讨论】:

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

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

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

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

【讨论】:

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

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

【讨论】:

以上是关于如何正确初始化 C++11 中的数据成员?的主要内容,如果未能解决你的问题,请参考以下文章

C++ std::shared_ptr 将初始化类中的其他成员数据

C++《8. C++11 做了什么让成员的初始化变简单了?》- 知识点目录

C++11 必须使用初始化列表的场合

11.6 C++构造函数重载

11.6 C++构造函数重载

c语言如何对结构体某一成员初始化