这是一个简单的问题,但我似乎无法找到明确的答案。
如果我们有以下课程:
class Test
{
...
char testArray[10];
...
};
当我们创建一个Test实例时,testArray [1]的默认值是什么?
如果它是一个本地数组,它将是未初始化的 如果它是静态数组,则将其初始化为0.
当数组是类成员时它会怎么做?
答案 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)
我相信如果你在声明它时没有初始化它,它可以设置为任何东西。有时它是一个地址或随机看的值。
最佳做法是在声明后进行初始化。