以下代码来自在线 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/