c++ - 变量和对象创建的范围

标签 c++ inheritance constructor

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

这是我的理解

步骤 A - 对象 B 的创建从参数 m_x 的 B 的构造函数开始 - 我们到达基类 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_x A constructor 被 new 运算符调用了两次。其次是一次为m_a - 即 3 x ``std::cout << "step 1 --- "<< m_i << endl;` 被执行。

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

关于c++ - 变量和对象创建的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30416485/

相关文章:

c# - 继承构造函数?

c++ - 如何在 Windows 上使用 gzip 和 bzip2 支持构建 boost iostreams

java - 为什么重写的函数首先被调用?

php - Symfony 包继承 - 如何覆盖/扩展服务类

java - 是否可以从我的代码中重构另一个包中的 Java 接口(interface)?

c++ - 使用构造函数进行引用初始化

C++ 使用参数委托(delegate) ctor 和父 ctor

c++ - 当我在运行程序之外的任何地方单击时,Qt 所有的绘图都消失了

c# - Verifone Vx670 POS 可以用 C# 编程吗?

c++ - 与c++中枚举相关的问题。这已经是一个已知问题了吗?