【发布时间】:2014-07-31 17:50:20
【问题描述】:
使用 C++11,我们现在可以在头声明中初始化类成员:
class aClass
{
private:
int mInt{100};
public:
aClass();
~aClass();
};
所以我有点困惑。传统上,构造函数中的初始化列表已用于成员初始化:
aClass::aClass()
: mInt(100)
{
...
}
声明时新的 C++11 成员初始化功能是否使初始化列表过时?如果不是,那么一个比另一个有什么优势?什么情况会使声明时的初始化有利,或者初始化列表有利?什么时候应该使用一个而不是另一个?
【问题讨论】:
-
显然不是。考虑构造函数参数。
-
@RobKennedy-IMO 不完全正确:AFAIK,如果您有一个带参数的构造函数,那么您在初始化列表中对其参数所做的任何事情也可以在具有相同成员的构造函数的主体中完成(尽管通常需要更多代码)。在初始化列表中使用构造函数的参数并不是很有用——它似乎没有多大意义:您将参数传递给构造函数,就像其他函数一样:您将在 正文中使用它们 的功能。初始化列表用于初始化:设置默认值、常量等
-
这不是真的。 const 成员变量不能在构造函数体中初始化;它必须在初始化列表中进行初始化。此外,“初始化”的概念并没有排除使用运行时值,例如来自参数的值。我的构造函数主体经常是empty,因为我使用参数直接初始化成员。此外,如果您关于为什么初始化列表已过时的论点是我们可以改用构造函数主体,那么它们在 在 C++11 之前也已过时,并且您的问题的前提不成立。跨度>
-
@RobKennedy - const 成员是一个很好的例子,同意。 如果你的论点为什么初始化列表已经过时...... - 不完全是:初始化列表允许你使用带有参数的构造函数来初始化你的值,但在正文中你必须调用一个方法
setValue(T)- 传递参数时,该成员已使用默认构造函数初始化。但您也可以在标头中进行初始化,就像在初始化列表中一样。 -
投反对票 - 请解释。无法解释的反对票不是很有建设性......这个问题的部分答案是相当明显的,真实的 - 其他部分,不是那么多......
标签: c++ c++11 constructor initialization declaration