在完成我的编程作业时,我似乎在基本的C++概念上遇到了困难。我发现我的程序中有一个错误,这个错误是由我的析构函数运行次数超过预期引起的。以下是演示我犯错的代码示例,只保留最基本的部分。
#include <iostream>
using namespace std;
class A
{
public:
A(int num)
{
number = num;
cout << "A constructed with number " << number << ".\n";
}
~A()
{
cout << "A destructed with number " << number << ".\n";
}
private:
int number;
};
class B
{
public:
B(A pa)
: a(pa)
{
cout << "B constructor run.\n";
}
~B()
{
cout << "B destructor run.\n";
}
private:
A a;
};
int main()
{
A foo(7);
{
B bar(foo);
}
//Pause the program.
system("pause");
}
我期望发生的是,
A foo(7);
为名为 foo
的 A
对象在堆栈上分配空间并调用构造函数,将 7
传递给构造函数。它将 7
赋值给 number
并打印输出表明构造函数已运行。现在,B bar(foo);
为名为 bar
的 B
对象在堆栈上分配空间并调用构造函数,通过值传递 foo
,这只是一个包含 int
的容器。构造函数将传递给它的 A
参数赋值给自己的私有数据成员 a
,并在屏幕上打印输出。
现在,当 bar
在闭合大括号处超出范围时,我期望调用 bar
的析构函数,该函数将在屏幕上打印输出,然后调用其数据成员的析构函数,即 A a
。该析构函数将在屏幕上打印输出,并丢弃其所包含的 int number
。
我期望输出应该是:
A constructed with number 7.
B constructor run.
B destructor run.
A destructed with number 7.
//Destructors should be called in the reverse order of their construction right?
实际输出:
A constructed with number 7.
B constructor run.
A destructed with number 7. //This is unexpected.
B destructor run.
A destructed with number 7.
是什么导致了这额外的破坏?