数组初始化

数组初始化

问题描述:

我很确定内置类型的数组是单位化的,而UDT数组是默认初始化的。数组初始化

int foo[5]; // will contain junk
Foo foo[5]; // will contain 5 Foo objects that are default initialized

这不管阵列是否被堆栈或堆上分配发生。

但是,我发现很难找到这方面的权威来源。 Bjarne表示:

“数组和结构的成员是默认初始化或不是取决于数组或结构是静态的”,这并没有真正地告诉我太多。

我也试过在标准中找到一些东西,但到目前为止没有任何结果。

有谁知道权威来源确认上述?

+2

你用'Foo'取决于什么是例如' Foo' - 如果它是一个POD结构(例如'struct Foo {int x;}'),它将不会被默认初始化。 – 2009-10-27 02:08:08

ISO C++ 03大约是权威性,因为它得到:

甲POD结构是具有式非POD结构的没有非静态数据成员的聚合类,非-POD-union(或这种类型的数组)或引用,并且没有用户定义的拷贝赋值操作符,也没有用户定义的析构函数。同样,POD-union是一个聚合联合,它没有类型非POD-struct,非POD-union(或这种类型的数组)或非引用的非静态数据成员,也没有用户定义的复制赋值运算符并没有用户定义的析构函数。 POD类是一个POD结构或POD结合的类。

算术类型(3.9.1),枚举类型,指针类型和成员类型指针(3.9.2)以及这些类型的cv限定版本(3.9.3)统称为标量类型。标量类型,POD结构类型,POD联合类型(第9章),这些类型的数组和这些类型的cv合格版本(3.9.3)统称为POD类型。

要零初始化类型T的对象是指:

  • 如果T是转换到T的标量类型(3.9),所述对象被设置为0(零)的值;
  • 如果T是非联合类类型,则将每个非静态数据成员和每个基类子对象初始化为零;
  • 如果T是联合类型,则该对象的第一个命名数据成员是零初始化的;
  • 如果T是一个数组类型,则每个元素都是零初始化的;
  • 如果T是引用类型,则不执行初始化。

为默认初始化类型T的对象是指:

  • 如果T是一个非POD类型(第9节),T的默认构造函数被调用(以及初始化病如果T没有可访问的默认构造函数,则形成);
  • 如果T是一个数组类型,则每个元素都是默认初始化的;
  • 否则,该对象被零初始化。

要值初始化类型T的对象是指:

  • 如果T是一个类类型(第9节)与用户声明的构造(12.1),然后对T中的默认的构造是调用(如果T没有可访问的默认构造函数,则初始化不合格);
  • 如果T是一个没有用户声明构造函数的非联合类类型,那么T中的每个非静态数据成员和基类组件都进行了值初始化;
  • 如果T是一个数组类型,则每个元素都进行了值初始化;
  • 否则,对象初始化为零

静态存储的每个对象应在程序启动时初始化为零的任何其他初始化发生之前。 [注:在某些情况下,稍后会进行额外的初始化。]

对象的初始值设定项是一组空括号,即(),应进行值初始化。

如果没有为某个对象指定初始值设定项,并且该对象是(可能是cv-qualified)非POD类类型(或其数组),则该对象应该被默认初始化;如果该对象属于const限定类型,则基础类类型应具有用户声明的默认构造函数。否则,如果没有为非静态对象指定初始化方法,则该对象及其子对象(如果有的话)具有不确定的初始值)。如果该对象或其任何子对象属于const限定类型,则该程序不合格。

对于你的榜样,int绝对是一个POD类型(这是一个算术类型),因此,本地或外地int型的,在没有初始化的,将有一个不确定的值。对于Foo,这取决于它是如何定义的 - 粗略地说,如果它没有构造函数,并且它的所有成员都是POD类型,那么它本身就是POD类型,并且也不会进行初始化。否则,将调用默认的构造函数。即使如此,这并不意味着成员被初始化 - 规则是递归的,所以非POD类型的POD成员将不会被初始化,除非该类型的构造函数明确地(在其初始化器列表中)这样做。

静态变量和字段在所有情况下都将被初始化为零。请注意,这也适用于非POD - 也就是说,类类型的静态变量保证在其构造函数运行之前递归地将所有字段设置为(T)0

一个得心应手的把戏默认初始化任何集合POD类型是在初始使用{} - 请注意,它的工作原理与结构以及数组:

char s[10] = {}; // all elements default-initialized 
Foo foo = {}; // all fields recursively default-initialized 

“数组和结构的成员是默认初始化或不依赖于阵列或结构是否是静态的”

这是有权威的,虽然也可以更清楚:

  • 阵列并声明为static的结构被初始化为零。
  • 未初始化本地数组和内置类型的结构(,即没有构造函数的类型)。
+0

“本地数组和结构未初始化。” - 这是不正确的。 POD类型的本地(和成员!)变量未初始化。非POD类型的本地变量和成员变量是默认初始化的。 – 2009-10-27 01:55:46

+0

@Pavel Minaev:我会说“太笼统”而不是“不正确” - 尽管如此,更新以反映您的评论。谢谢! – 2009-10-27 02:00:14

它说在C++标准,在8.5.9:

如果为 对象没有指定初始化,并且该对象是(可能 CV修饰)非POD类的类型(或其中的 ),则该对象应为 默认初始化;如果对象为const限定类型的 ,则基础类类型应具有用户声明的默认构造函数 。 否则,如果没有为非静态对象指定初始化程序 ,则 对象及其子对象(如果有) 具有不确定的初始值。