成员变量的顺序在派生类(构造函数)中初始化基类

时间:2017-02-26 21:34:01

标签: c++ inheritance initialization

我是否正确理解了初始化是如何工作的?我将说明步骤:

  1. 调用基类构造函数。我们输出 0并增加m_i = 1;
  2. 因为m_x在基类的成员变量中位于m_a之前,我们正在递增m_i。我们输出 2,我们会增加m_i
  3. 我们正在为m_a[0]我们输出 0创建A类型的动态对象数组,并增加m_i;对于m_a [1],我们输出 0,我们增加m_im_i的{​​{1}}等于m_a[0]1的{​​{1}}等于m_i
  4. 最后我们移动到派生类的构造函数的主体,我们输出 m_a[1]
  5.   

    输出为:02002

    当我们进入基础构造函数的主体时,我真的不明白为什么1的输出等于2?在第2步之后,m_i = 2.不应该等于m_i吗?

    源代码

    m_i

1 个答案:

答案 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.这就是它输出的内容。