使用继承时派生结构中结构成员的初始化是否不确定?
在这个例子中:
struct A {
double x0[2], x1[2];
};
struct B : A {
double x2[2], x3[2];
};
struct C {
A a;
B b;
C(): a(), b() {
printf("a.x0[0]=%f, a.x1[0]=%f\n", a.x0[0], a.x1[0]);
printf("b.x2[0]=%f, b.x3[0]=%f\n", b.x2[0], b.x3[0]);
}
};
int main() {
C c;
}
b.x2[0]
, b.x3[0]
并不总是空的,我的问题是为什么会这样?
Nr 两个问题:
a.x0[0]
,a.x1[0]
总是空的?
编译器生成的类类型的默认构造函数将默认初始化该类的所有成员。在这里,由于您的
C()
构造函数调用了 A
和 B
的那些默认构造函数,所以这就是发生的情况。
当您在成员初始化列表中使用
()
显式初始化成员时,会导致 value-initialization,其效果取决于该成员是什么。当成员是非类类型时,它会导致它被*零初始化`,但在这个例子中它是一个类类型,所以是default-initialized
当数组类型的对象是default-initialized时,数组的每个元素都是default-initialized。当非类类型(如
double
)和非静态存储持续时间为default-initialized的对象时,没有初始化发生
所以在这种情况下,数组的元素(在
c.a
和c.b
中)未初始化并且具有未定义的值。
如果您想明确地将这些数组归零(在
A
和B
中),您需要在A
和B
的构造函数中初始化它们。