我正在寻找一些测试来提高我的C++知识.以下是其中一个练习:以下程序的输出是什么?
#includeclass 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
's构造函数中)=> str =>00023
这是我的问题:
为什么最终值m_i
2
不是3
?
为什么建造m_x(++m_i)
之前完成了m_a(new A[2])
?我试图交换m_x和m_a初始化的位置,答案仍然是一样的:02002
.
LogicStuff.. 12
为什么最终值
m_i
2
不是3
?
因为new A[2]
创建了两个与之无关的独立实例*this
.m_i
所述的b
实例仅递增A::A
和B::B
(两次).
如果m_i
应该对同一个实例(例如m_i
,作为引用)执行增量,则认为最终值m_i
应该是更合理的4
(数组中有两个对象 - 另外两个增量).
为什么建造
m_x(++m_i)
之前完成了m_a(new A[2])
?
因为初始化的顺序取决于数据成员的声明顺序,而不是在成员初始化列表中编写初始化的顺序.
为什么最终值
m_i
2
不是3
?
因为new A[2]
创建了两个与之无关的独立实例*this
.m_i
所述的b
实例仅递增A::A
和B::B
(两次).
如果m_i
应该对同一个实例(例如m_i
,作为引用)执行增量,则认为最终值m_i
应该是更合理的4
(数组中有两个对象 - 另外两个增量).
为什么建造
m_x(++m_i)
之前完成了m_a(new A[2])
?
因为初始化的顺序取决于数据成员的声明顺序,而不是在成员初始化列表中编写初始化的顺序.