如何正确初始化 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 将初始化类中的其他成员数据