C++ 请解释为什么此代码打印02002而不是00022

C++ 请解释为什么此代码打印02002而不是00022,c++,inheritance,constructor,C++,Inheritance,Constructor,我不明白为什么这个代码打印的是02002而不是00022。据我所知,构造函数的顺序是:首先是基类,然后是成员对象(按照初始化列表的顺序),然后是实际类的构造函数。我这里出了什么错 #include <iostream> class A { public: A(int n = 0) : m_i(n) { std::cout << m_i; ++m_i; } protected: int m_

我不明白为什么这个代码打印的是02002而不是00022。据我所知,构造函数的顺序是:首先是基类,然后是成员对象(按照初始化列表的顺序),然后是实际类的构造函数。我这里出了什么错

#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;
}
#包括
甲级
{
公众:
A(int n=0)
:m_i(n)
{

std::cout成员变量的初始化顺序始终是声明顺序,而不是构造函数初始化列表顺序

这意味着
B::m_x
将首先初始化,因为它是在类中声明的第一个


有关详细信息,请参见示例。

成员变量的初始化顺序始终是声明顺序,而不是构造函数初始化列表顺序

这意味着
B::m_x
将首先初始化,因为它是在类中声明的第一个


有关详细信息,请参见,例如。

初始化顺序不基于初始化器列表中的顺序。每个
新A[2]中的
m_i
彼此不同,也不同于作为基础的
A
m_i
。初始化顺序不基于初始化器列表中的顺序。每个
新A[2]
中的
m_i
彼此不同,也不同于作为基础的
A
m_i