C++ - 成员初始化和增量的顺序

Pti*_*seb 8 c++ constructor class

我正在寻找一些测试来提高我的C++知识.以下是其中一个练习:以下程序的输出是什么?

#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;
}
Run Code Online (Sandbox Code Playgroud)

好吧,我试过这个代码,答案是02002.我来这里有一些解释,因为我不明白为什么会有02002结果.我会解释我的推理,但有些人可以告诉我,我错在哪里吗?

我们将"str"称为要打印的当前字符串.当b对象被建立:

  1. A调用构造函数.str => 0,m_i=>1
  2. 建设m_a(new A[2]).str =>000
  3. 建设m_x(++m_i).str => 0002,m_i=>3
  4. str的最后更新(在B's构造函数中)=> str =>00023

这是我的问题:

  • 为什么最终值m_i 2不是3
  • 为什么建造m_x(++m_i)之前完成了m_a(new A[2])?我试图交换m_x和m_a初始化的位置,答案仍然是一样的:02002.

Log*_*uff 12

为什么最终值m_i 2不是3

因为new A[2]创建了两个与之无关的独立实例*this.m_i所述的b实例仅递增A::AB::B(两次).

如果m_i应该对同一个实例(例如m_i,作为引用)执行增量,则认为最终值m_i应该是更合理的4(数组中有两个对象 - 另外两个增量).

为什么建造m_x(++m_i)之前完成了m_a(new A[2])

因为初始化的顺序取决于数据成员的声明顺序,而不是在成员初始化列表中编写初始化的顺序.