来自在线c ++测验部分的以下代码 http://www.interqiew.com/ask?ta=tqcpp02&qn=3 - 我无法找到答案 - 我已添加了打印声明 -
这是我理解的
步骤A - 对象B创建从B的构造函数开始,用于参数m_x - 我们到达基类A - 步骤1执行输出0 - 并将m_i递增到1
步骤B - 代码现在变为m_x(2) - 步骤1执行输出2并将m_i递增到3 创建m_x完成
步骤C - 代码到达A [2](因此下面的两个对象会发生) - 步骤1执行输出0并将m_i递增到1 创建A [0]和A [1]完成
我用3个容器m_x,A [0]和A [1]可视化对象b,每个容器的值为m_i
我不明白下面的输出 - 我们如何获得输出2 - 使用m_i的哪个值?
步骤D-进入step3区域 - 步骤3执行输出2
输出 -
步骤1 --- 0 1 第1步--- 2 3 第1步--- 0 1 第1步--- 0 1 第3步---- 2
class A
{
public:
A(int n = 0)
: m_i(n)
{
std::cout << "step 1 --- " << m_i << endl;
++m_i;
std::cout << m_i << endl;
}
protected:
int m_i;
};
class B
: public A
{
public:
B(int n = 5) : m_a(new A[2]), m_x(++m_i)
{
std::cout << "step 3 ----" << m_i << endl;
}
~B() { delete [] m_a; }
private:
A m_x;
A *m_a;
};
int main()
{
B b;
std::cout << std::endl;
return 0;
}
答案 0 :(得分:1)
主要是你正在构建一个B
但是B继承了A
首先这样做。因此m_i
被初始化并执行std::cout << "step 1 --- " << m_i << endl;
。
继续处理B构造函数。
然后m_x
后跟m_a
将被初始化 - 而不是编译器重新排列这里的东西!
对于m_x
,A
构造函数从new运算符调用两次。跟随m_a
一次 - 即3 x``std :: cout&lt;&lt; &#34;步骤1 ---&#34; &LT;&LT; m_i&lt;&lt; endl;`被执行。
然后跟随构造函数的其余部分,即执行td::cout << "step 3 ----" << m_i << endl;
。第2步发生的事情是个谜。