变量和对象创建的范围

Scope of Variable and object creation

以下代码来自在线 C++ 测验部分 http://www.interqiew.com/ask?ta=tqcpp02&qn=3 - 我无法找出答案 - 我添加了打印语句 -

这是我的理解

步骤 A - 对象 B 创建从 B 的构造函数开始,参数 m_x - 我们到达基础 Class 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 的哪个值?

Step 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;
}

主要是你在构造一个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 << "step 1 --- " << m_i << endl;` 被执行。

然后是构造函数的其余部分,即 td::cout << "step 3 ----" << m_i << endl; 被执行。第 2 步发生了什么是个谜。