我有:
class SomeObject {
public:
SomeObject() { ... }
// Other fields and methods
};
class anOtherObject {
private:
SomeObject array[SOME_FIXED_SIZE];
public:
anOtherObject() : ... { ... }
};
我的问题是 - 在调用构造函数的时间和之后数组包含什么?我应该使用for循环自己初始化它还是编译器为每个数组调用默认构造函数[i],0<=i<SOME_FIXED_SIZE
?
答案 0 :(得分:6)
数组是默认初始化,这意味着它的元素是默认初始化逐个。由于您的数组包含用户定义的类型,这意味着将调用它们的默认构造函数。如果您的数组包含内置类型或POD,则必须是显式的并且 value-initialize 它,因为默认初始化意味着不对元素执行初始化:
anOtherObject() : array() {}
// ^^^^^^^ value-initialize array
答案 1 :(得分:0)
您不需要初始化它们。创建一个数组子对象将默认构造。除非您明确省略默认构造函数。
当一个类对象数组被初始化(显式或隐式)并且元素由构造函数初始化时,应该按照下标顺序为数组的每个元素调用构造函数; [§12.6/ 3]
答案 2 :(得分:0)
创建anOtherObject类型的对象时: anOtherObject a; 由于对象a具有SomeObject类型的私有数组,因此应为数组的每个元素调用SomeObject类的默认构造函数。 在调用构造函数之前,数组应包含“垃圾”,因为它在堆栈上静态分配。 调用构造函数后,内存应包含您在默认构造函数中设置的内容;例如,将所有内容初始化为0