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

时间:2011-10-13 20:53:24

标签: c++

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

如果我们有以下课程:

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

...
}; 

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

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

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

3 个答案:

答案 0 :(得分:22)

从标准第8.5节[dcl.init]

开始
  

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

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

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

  •   
  • 否则,不执行初始化。

  •   

还有第12.6.2节T

  

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

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

因为元素类型是[class.base.init],当每个元素默认初始化时,不执行初始化。内容保留任意值。

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

答案 1 :(得分:4)

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

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

Test test; // no initializer supplied

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

如果你的类有一个用户定义的构造函数,那么它将取决于构造函数的作用。同样,请记住,在任何构造函数有机会执行任何操作之前,静态对象始终为零初始化。

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

Test test = {};
即使对于自动(本地)对象,

也会对数组进行零初始化。

答案 2 :(得分:0)

我相信如果你在声明它时没有初始化它,它可以设置为任何东西。有时它是一个地址或随机看的值。

最佳做法是在声明后进行初始化。