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对象被建立:
A调用构造函数.str => 0,m_i=>1m_a(new A[2]).str =>000m_x(++m_i).str => 0002,m_i=>3B'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_i2不是3?
因为new A[2]创建了两个与之无关的独立实例*this.m_i所述的b实例仅递增A::A和B::B(两次).
如果m_i应该对同一个实例(例如m_i,作为引用)执行增量,则认为最终值m_i应该是更合理的4(数组中有两个对象 - 另外两个增量).
为什么建造
m_x(++m_i)之前完成了m_a(new A[2])?
因为初始化的顺序取决于数据成员的声明顺序,而不是在成员初始化列表中编写初始化的顺序.