我是否正确理解了初始化是如何工作的?我将说明步骤:
0
并增加m_i = 1
; m_x
在基类的成员变量中位于m_a
之前,我们正在递增m_i
。我们输出 2
,我们会增加m_i
。m_a[0]
我们输出 0
创建A类型的动态对象数组,并增加m_i
;对于m_a [1],我们输出 0
,我们增加m_i
。 m_i
的{{1}}等于m_a[0]
而1
的{{1}}等于m_i
。m_a[1]
输出为:02002
当我们进入基础构造函数的主体时,我真的不明白为什么1
的输出等于2?在第2步之后,m_i = 2.
不应该等于m_i
吗?
m_i
答案 0 :(得分:2)
在我解释这个问题之前,让我这样说:如果你的对象的初始化非常复杂,需要我将要涉及的详细知识,那么修复那个。过度复杂的初始化对任何人都没有好处。
现在,让我们看一下通过调用默认构造函数构造B
类型的对象时会发生什么。
由于成员初始值设定项列表中未提及B::A
,因此将默认初始化它。这将调用A(int)
,其默认值为0.结果是使用值0初始化B::A::m_i
,然后输出该值,然后将B::A::m_i
递增到值1
现在,我们初始化B
的成员。要初始化的第一个成员是B::m_x
。用于此的成员初始值设定项读取并递增B::A::m_i
的值,该值是在此操作之前恰好为1的有效初始化值。因此,在为A(int)
致电B::m_x
之前,B::A::m_i
的值为2。
B::m_x
通过调用A(int)
来初始化,值为2.它将该值存储在B::m_x.m_i
中,输出它,并将其递增1。
接下来,我们初始化B::m_a
。成员初始化程序通过调用new A[2]
对其进行初始化,A
将默认构造B::A::m_i
的2个实例。这些都与您的问题完全无关,因为它们与B::m_a
无关。但它输出两个零。
初始化B
后,我们输入B::A::m_i
的默认构造函数。它只输出{{1}}的值。如果你还记得,最后设置为2.这就是它输出的内容。