我可以在默认初始化和值初始化之间进行选择,也可以选择数组的全部或部分

Can I choose between default-initalisation and value-initialisaion or all or part of an array?

本文关键字:初始化 选择 数组 也可以 全部 行选 默认 之间 我可以      更新时间:2023-10-16

自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不同,会发生什么

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

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

--如果T是一个(可能是cv限定的)类类型(第9条),具有用户提供的构造函数(12.1),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化形式不正确);

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

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

从这个意义上讲,您可以使用成员初始值设定项列表中的f()对自C++1998以来的数组成员进行值初始化。如果你想使用特定的值,你需要使用C++2011和初始化器列表,例如f({ 1, 2, 3 })。如果参数的数量少于元素的数量,则对其余元素进行值初始化。实际上,是从一个空的初始化器列表中初始化的(8.5.1[dcl.init.agr]第7段):

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

根据8.5.4[dcl.init.list]第3段,项目符号7:

  • 否则,如果初始值设定项列表没有元素,则对象被值初始化