虽然这样做我的编程作业,我似乎被绊倒基本C ++概念。 我发现在我的程序的bug,它是由运行更多的时间比我预期的析构函数引起的。 下面是一个代码示例演示什么,我做错了,到最基本的要素。
#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);
分配堆栈空间上为A
命名对象foo
和调用构造,传递7
。 它分配7
至number
和打印输出指示的构造运行。 现在B bar(foo);
堆栈对于上分配空间B
对象命名bar
和调用构造,传递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.
是什么原因造成额外的破坏?