结构体初始化与继承

问题描述 投票:0回答:1

使用继承时派生结构中结构成员的初始化是否不确定?

在这个例子中:

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++ inheritance initialization
1个回答
-1
投票

编译器生成的类类型的默认构造函数默认初始化该类的所有成员。在这里,由于您的

C()
构造函数调用了
A
B
的那些默认构造函数,所以这就是发生的情况。

当您在成员初始化列表中使用

()
显式初始化成员时,会导致 value-initialization,其效果取决于该成员是什么。当成员是非类类型时,它会导致它被*零初始化`,但在这个例子中它是一个类类型,所以是default-initialized

当数组类型的对象是default-initialized时,数组的每个元素都是default-initialized。当非类类型(如

double
)和非静态存储持续时间为default-initialized的对象时,没有初始化发生

所以在这种情况下,数组的元素(在

c.a
c.b
中)未初始化并且具有未定义的值。

如果您想明确地将这些数组归零(在

A
B
中),您需要在
A
B
的构造函数中初始化它们。

© www.soinside.com 2019 - 2024. All rights reserved.