结构体继承场景下成员初始化不确定性及相关问题咨询
C++结构体继承与初始化问题解答
问题一:使用继承时,派生结构体的成员初始化是否存在不确定性?为何b.x2[0]、b.x3[0]的值不总是零?
不存在“继承导致的初始化不确定性”,问题根源是不同C++标准对聚合类型的定义差异,以及对应的值初始化行为不同:
- 代码中的
B是继承自A的结构体:- 在C++17之前,聚合类型的定义不包含带基类的结构体,因此
B不属于聚合类型。此时对B进行值初始化(b())会调用编译器自动生成的默认构造函数,该构造函数只会初始化基类A(将A的成员零初始化),但不会初始化B自身的内置类型数组x2、x3,这些成员会保留内存中的垃圾值,所以输出结果不一定为零。 - 在C++17及之后,标准允许带public基类的结构体成为聚合类型,此时对
B的值初始化会递归零初始化所有成员(包括x2、x3),输出结果会是零。
- 在C++17之前,聚合类型的定义不包含带基类的结构体,因此
这种版本差异导致了b.x2[0]、b.x3[0]的值不固定,和继承机制本身无关。
问题二:a.x0[0]、a.x1[0]的值是否始终为零?
是的,始终为零。A是无用户自定义构造函数的结构体,属于聚合类型。无论哪个C++版本,对聚合类型进行值初始化(a())时,都会对所有非静态成员进行零初始化。x0、x1作为A的数组成员,会被逐个元素零初始化,因此a.x0[0]、a.x1[0]的结果必然是零。
内容的提问来源于stack exchange,提问作者Caty
相关产品推荐
相关产品推荐

