3

从 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
4

1 回答 1

1

实际上,根据标准值初始化似乎是调用任何形式的用户定义的默认构造函数或零初始化没有默认构造函数的对象的过程(参见 8.5 [decl.init] 第 7 段:

对 T 类型的对象进行值初始化意味着:

— 如果 T 是具有用户提供的构造函数(12.1)的(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是非良构的);

— 如果 T 是(可能是 cv 限定的)非联合类类型,没有用户提供的构造函数,则该对象为零初始化,并且如果 T 的隐式声明的默认构造函数不平凡,则调用该构造函数。

— 如果 T 是一个数组类型,那么每个元素都是值初始化的;— 否则,对象被零初始化。

f()从这个意义上说,您可以在成员初始化器列表中使用自 C++1998 以来的值初始化您的数组成员。如果要使用特定值,则需要使用带有初始化列表的 C++2011,例如f({ 1, 2, 3 }). 如果参数的数量少于元素的数量,则剩余的元素将被初始化。实际上,它们是从一个空的初始化列表初始化的(8.5.1 [dcl.init.aggr] 第 7 段):

如果列表中的初始化子句少于聚合中的成员,则每个未显式初始化的成员都应从空的初始化器列表中初始化。

...并且根据 8.5.4 [dcl.init.list] 第 3 段,第 7 条,从空初始化程序列表进行的初始化意味着:

  • 否则,如果初始化列表没有元素,则对象被值初始化。
于 2012-02-07T09:29:36.843 回答