这是一个简单的问题,但我似乎无法找到明确的答案.
如果我们有以下课程:
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,当每个元素被默认初始化时,不执行初始化.内容保留任意值.
当然,除非它是类的实例的成员,并且实例具有静态存储持续时间.然后在执行开始之前,整个实例被零初始化,数组成员和所有实例.
这取决于您忘记提及的可能因素。
如果您Test没有用户定义的构造函数或您的用户定义的构造函数不努力初始化数组,并且您将类型的对象声明Test为
Test test; // no initializer supplied
Run Code Online (Sandbox Code Playgroud)
那么它的行为方式将与您上面描述的完全相同。对于自动(本地)对象,数组的内容将保持不可预测。对于静态对象,内容保证为零。
如果你的类有一个用户定义的构造函数,那么这一切都取决于构造函数的作用。再次记住,在任何构造函数有机会做任何事情之前,静态对象总是被零初始化。
如果您的类是聚合,则内容可能取决于您在对象声明中提供的聚合初始值设定项。例如
Test test = {};
Run Code Online (Sandbox Code Playgroud)
即使对于自动(本地)对象,也会对数组进行零初始化。
| 归档时间: |
|
| 查看次数: |
17217 次 |
| 最近记录: |