【问题标题】:Scope of Variable and object creation变量和对象创建的范围
【发布时间】:2015-05-24 03:12:43
【问题描述】:

以下代码来自在线 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 区域 -- step 3 执行输出 2

输出 -

步骤 1 --- 0 1 步骤 1 --- 2 3 步骤 1 --- 0 1 步骤 1 --- 0 1 第三步----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 步等吗?顺便说一句 - 您忘记了需要先构建基础的继承
  • B 构造函数首先构造它的基类A,然后继续构造它的成员,按照它们在类定义中出现的顺序——首先是m_x,然后是m_a。在m_a 的初始化器中构造了另外两个A 实例。最后,B构造函数的主体被执行。
  • 啊,所以你的意思是 - 这将类似于步骤 0 - b 的构造函数 - 到达基类 - 执行步骤 -1 即 0 并将其递增到值 1 - 现在创建 m_x 递增到2输出到2等等..我想我现在明白了..!!!谢谢

标签: c++ inheritance constructor


【解决方案1】:

你主要是在构建一个 B

但是 B 继承了 A

所以先这样做。所以m_i 被初始化并且std::cout &lt;&lt; "step 1 --- " &lt;&lt; m_i &lt;&lt; endl; 被执行。

继续处理 B 构造函数。

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

对于m_xA 构造函数被 new 运算符调用两次。紧随其后的是 m_a - 即 3 x ``std::cout

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

【讨论】:

  • 好的,我想我明白了 - 大容器,即对象 b 有自己的 m_i 值 - 感谢您的解释
  • 该程序创建了四个A 实例,因此有四个独立的m_i 副本。即b.A::m_ib.m_x.m_i; b.m_a[0].m_i;和b.m_a[1].m_i - 按此顺序构建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2020-12-21
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
相关资源
最近更新 更多