C++成员数组的默认初始化?

Luc*_*ano 20 c++

这是一个简单的问题,但我似乎无法找到明确的答案.

如果我们有以下课程:

class Test
{
...
  char testArray[10];

...
}; 
Run Code Online (Sandbox Code Playgroud)

当我们创建一个Test实例时,testArray [1]的默认值是什么?

如果它是一个本地数组,它将是未初始化的.
如果它是一个静态数组,它将被初始化为0.

当数组是类成员时它会怎么做?

Ben*_*igt 22

从标准,第8.5节[dcl.init]:

默认初始化类型对象T意味着:

  • 如果T是(可能是cv限定的)类类型(第9节),T则调用默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);

  • 如果T是数组类型,则每个元素都是默认初始化的 ;

  • 否则,不执行初始化.

第12.6.2节[class.base.init]:

在非委托构造函数中,如果给定的非静态数据成员或基类未由mem-initializer-id指定(包括没有mem-initializer-list的情况,因为构造函数没有ctor-initializer)然后,实体不是抽象类(10.4)的虚基类

  • 如果实体是具有大括号或等于初始值的非静态数据成员,则按照8.5中的规定初始化该实体;
  • 否则,如果实体是变体成员(9.5),则不执行初始化;
  • 否则,实体默认初始化(8.5).

因此,因为元素类型是char,当每个元素被默认初始化时,不执行初始化.内容保留任意值.

当然,除非它是类的实例的成员,并且实例具有静态存储持续时间.然后在执行开始之前,整个实例被零初始化,数组成员和所有实例.

  • @Luciano:不,如果构造函数没有为其指定初始化程序(包括启用聚合初始化的隐式构造函数),它将被默认初始化。`char[]` 的默认初始化是一个空操作。如果实例具有静态存储持续时间,那么之前有零,因此在无操作之后,它仍然为零。在其他情况下,内存中剩余的内容将决定该值。 (2认同)

AnT*_*AnT 7

这取决于您忘记提及的可能因素。

如果您Test没有用户定义的构造函数或您的用户定义的构造函数不努力初始化数组,并且您将类型的对象声明Test

Test test; // no initializer supplied
Run Code Online (Sandbox Code Playgroud)

那么它的行为方式将与您上面描述的完全相同。对于自动(本地)对象,数组的内容将保持不可预测。对于静态对象,内容保证为零。

如果你的类有一个用户定义的构造函数,那么这一切都取决于构造函数的作用。再次记住,在任何构造函数有机会做任何事情之前,静态对象总是被零初始化。

如果您的类是聚合,则内容可能取决于您在对象声明中提供的聚合初始值设定项。例如

Test test = {};
Run Code Online (Sandbox Code Playgroud)

即使对于自动(本地)对象,也会对数组进行零初始化。

  • @Ben Voigt:这个问题显然误用了“默认初始化”这个词。当人们认为如果他们什么都不做那么某种“默认初始化”就会发生时,这种情况经常发生。实际上,C++ 中的“默认初始化”意味着不同的东西。这就是为什么我不将答案限制为“默认初始化”。 (4认同)
  • 如果在构造函数初始化列表中调用`testArray()`,则数组中的每个元素都将进行值初始化(这意味着在这种特殊情况下设置为 0) (3认同)