变量和对象创建的范围

时间:2015-05-23 18:59:10

标签: c++ inheritance constructor

来自在线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;
}

1 个答案:

答案 0 :(得分:1)

主要是你正在构建一个B

但是B继承了A

首先这样做。因此m_i被初始化并执行std::cout << "step 1 --- " << m_i << endl;

继续处理B构造函数。

然后m_x后跟m_a将被初始化 - 而不是编译器重新排列这里的东西!

对于m_xA构造函数从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步发生的事情是个谜。