我在一次 C++ 测试中发现了这段代码:
#include <iostream>
class A
{
public:
A(int n = 2) : m_i(n) { }
~A() { std::cout << m_i; }
protected:
int m_i;
};
class B
: public A
{
public:
B(int n) : m_x(m_i + 1) , m_a(n) { }
public:
~B()
{
std::cout << m_i;
--m_i;
}
private:
A m_x;
A m_a;
};
int main()
{
{ B b(5); }
std::cout << std::endl;
system("PAUSE");
return 0;
}
答案是:2531。但据我了解,这里只是调用了两个析构函数: 首先是B,输入2; 第二个为A,输入1; 我们如何得到数字 5 和 3?感谢任何帮助。
最佳答案
B
也有两个类型为 A
的数据成员,以及这些对象的析构函数(首先是 m_a
,m_x
second, in reverse declaration order) 在 B
的析构函数之后调用。
所以这里发生的事情是:
- 构造
b
时,首先调用其A
基础子对象的构造函数,这是默认构造的,因为B的初始化列表
的构造函数没有为A
指定任何参数。这意味着b.m_i
将是2
; b
的m_x
和m_a
子对象的构造函数将按声明顺序调用,并传递指定的参数。这意味着b.m_x.m_i
将为3
(b.m_i + 1
),并且b.m_a.m_i
code> 将是5
(n
);b
的B
的构造函数主体被执行(这里没有什么可做的);B
的析构函数被执行,输出2
并递减b.m_i
(即变为1
);m_a
的析构函数被执行(它以相反的声明顺序首先出现),它将打印5
;- 执行
m_x
的析构函数,打印3
; - 执行
b
的A
子对象的析构函数,打印b.m_i
,即现在的1
。
关于c++ 缺少一些输出结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16523474/