【发布时间】:2015-12-23 16:15:17
【问题描述】:
我正在寻找一些测试来提高我的 C++ 知识。这是其中的一个练习:以下程序的输出是什么?
#include <iostream>
class A
{
public:
A(int n = 0) : m_i(n)
{
std::cout << m_i;
++m_i;
}
protected:
int m_i;
};
class B : public A
{
public:
B(int n = 5) : m_a(new A[2]), m_x(++m_i) { std::cout << m_i; }
~B() { delete [] m_a; }
private:
A m_x;
A *m_a;
};
int main()
{
B b;
std::cout << std::endl;
return 0;
}
嗯,我试过这段代码,答案是02002。我来这里是为了解释一下,因为我不明白为什么02002 是结果。
我会解释我的推理,但请有人告诉我我哪里错了?
让我们调用“str”来打印当前字符串。构建b 对象时:
-
A的构造函数被调用。 str =>0,m_i=>1 -
m_a(new A[2])的构造。 str =>000 -
m_x(++m_i)的构造。 str =>0002,m_i=>3 - str 的最后更新(在
B的构造函数中)=> str =>00023
这是我的问题:
- 为什么最终值是
m_i2而不是3? - 为什么
m_x(++m_i)的构造在m_a(new A[2])之前完成?我尝试交换 m_x 和 m_a 的初始化位置,结果还是一样:02002。
【问题讨论】:
-
由于
m_x在B类中被声明为之前m_a,B(int n = 5) : m_a(new A[2]), m_x(++m_i)格式错误,应该是B(int n = 5) : m_x(++m_i), m_a(new A[2])。 -
@YSC 是正确的,至少,使用 gcc 编译时会收到大量警告(我不确定其他人)
-
@YSC
B(int n = 5) : m_a(new A[2]), m_x(++m_i)不是格式错误的。也许它应该是不合格式的,但不幸的是它不是。 -
你是对的,我收到警告:“test.cpp:27: warning: ‘B::m_a’ will be initialized after”
标签: c++ class constructor