繁体   English   中英

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

[英]Order of member variables initialization of the base class in the derived class (constructor)

我是否正确了解初始化在这里的工作方式? 我将说明步骤:

  1. 基类的构造函数被调用。 我们输出 0 ,增量m_i = 1
  2. 因为在基类的成员变量中m_xm_a之前,并且我们u在预递增m_i 我们输出 2然后递增m_i
  3. 我们正在创建类型为A的对象的动态数组。对于m_a[0]我们输出 0然后递增m_i 对于m_a [1],我们输出 0然后递增m_i m_im_a[0]等于1m_im_a[1]等于1
  4. 最后,我们移到派生类的构造函数的主体,然后输出 m_i = 2.

输出为:02002

当我们进入基本构造函数的主体时,我真的不明白为什么m_i的输出等于2? 步骤2之后, m_i是否等于3


源代码

   #include <iostream>

class A
{
public:
    A(int n = 0)
        : m_i(n)
    {
        std::cout << m_i;
        ++m_i;
    }

protected:
     int m_i;
};

class B
    : public A
{
public:
    B(int n = 5) : m_a(new A[2]), m_x(++m_i){ std::cout << m_i; }

    ~B() { delete [] m_a;}

private:
    A m_x;
    A *m_a;

};

int main()
{
    B b;
    std::cout << std::endl;

    return 0;
}

在解释问题之前,我先说一下:如果您的对象的初始化非常复杂,以至于需要我将要涉及的详细知识,请修复该问题 过于复杂的初始化对任何人都没有好处。

现在,让我们看一下通过调用其默认构造函数构造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。 因此,在为B::m_x调用A(int)之前, B::A::m_i取值2。

B::m_x通过对A(int)的值2的调用进行初始化。它将该值存储在B::m_x.m_i ,输出该值,并将其递增1。

接下来,我们初始化B::m_a 成员初始化器通过调用new A[2]对其进行初始化,这将默认构造A 2个实例。 这些都与您的问题完全无关,因为它们与B::A::m_i毫无关系。 但是它确实输出两个零。

初始化B::m_a ,我们输入B的默认构造函数本身,在那里它仅输出B::A::m_i的值。 如果您还记得的话,最后设置为2。这就是它的输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM