变量和对象创建的范围

Scope of Variable and object creation

本文关键字:范围 创建 对象 变量      更新时间:2023-10-16

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

这是我的理解

步骤A -对象B的创建从参数m_x的构造函数B开始-我们到达基类A——step 1执行输出0 -并将m_i增加到1

步骤B -代码现在变成m_x(2)——step 1执行输出2,并将m_i增加到3创建m_x done

步骤C -代码到达A[2](所以下面两个对象会发生)——step 1执行输出0并将m_i增加到1A[0]和A[1]的创建完成

我将对象b可视化为3个容器m_x, A[0]和A[1],每个容器的值为m_i

我不明白下面的输出-我们如何得到输出2 - m_i的哪个值被使用?

stepd -进入step3区域——step 3执行输出2

输出-

步骤1—01步骤1 - 23.步骤1—01步骤1—01步骤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,从new操作符调用A构造函数两次。然后是一次m_a -即3 x ' ' std::cout <<"第一步——"<<m_i & lt; & lt;

Then紧随构造函数的其余部分,即执行td::cout << "step 3 ----" << m_i << endl;