【发布时间】:2012-02-07 08:50:58
【问题描述】:
自 C++2003 以来,我们有值初始化和默认初始化。意思是:
struct Foo {
int i;
std :: string s;
};
Foo f1; // f1.s is default-constructed, f1.i is uninitialised
Foo f2 = Foo (); // f1.s is default-constructed, f1.i is zero
对吗?
现在假设我有这门课
class Bar : public Foo {
int n;
Foo f [SIZE];
public:
Bar ();
};
当我为Bar 编写构造函数时,我可能希望对父类或f[] 成员进行默认或值初始化。我认为初始化父母的选择很简单:
Bar :: Bar () : Foo (), n (-1) {} // Parent is value-initialised (Foo::i is zero)
Bar :: Bar () : n (-1) {} // Parent is default-initialised (Foo::i is undefined)
但是f[] 成员呢?
- 如何默认初始化所有成员?
- 如何对所有成员进行值初始化?
- 如果我使用 C++11 初始化列表,如果初始化列表的大小与
SIZE不同,会发生什么情况?
【问题讨论】:
-
请避免
::周围有空格。 -
为什么?我喜欢它,它更容易阅读。
-
@spraff 而你却使用 PascalCaseWhereWordsRunTogether?
-
对于类型,是的,对于变量,不,我不给他们 LongNamesWhichSufferReadibilityProblems。但是,我们不要在 cmets 中进行风格大战。
-
在第一个示例中,i 在默认初始化和从复制初始化中都将保持未初始化,不同之处在于在从复制初始化中 i将使用来自临时 Foo 的成员 i 的垃圾进行初始化。您使用它的方式从副本初始化通常较慢,因为它可能会导致临时对象创建(尽管大多数编译器不会创建额外的副本)。