输入:
#include <iostream>
using namespace std;
class SimpleClass
{
public:
SimpleClass()
{
cout<<"SimpleClass Constructor\n";
}
virtual ~SimpleClass()
{
cout<<"SimpleClass destructor\n";
}
};
int main()
{
SimpleClass a;
SimpleClass lol = a;
SimpleClass b;
SimpleClass * lol2 = &b;
}
输出:
SimpleClass Constructor
SimpleClass Constructor
SimpleClass destructor
SimpleClass destructor
SimpleClass destructor
我很困惑为什么析构函数被调用了3次。
答案 0 :(得分:11)
对于a
,lol
和b
,析构函数被调用三次。
在您的情况下,a
和b
使用default constructor
进行实例化。但请注意lol
使用copy constructor
答案 1 :(得分:6)
因为正好创建了3个SimpleClass类对象,但是你的构造函数只被调用了2次:
a
,调用你的构造函数; lol
,通过 a 通过隐式定义的复制构造函数进行初始化(从而绕过构造函数); b
,调用您的构造函数。请注意,lol2
只是指向b的指针,因此不会进行额外的调用。
正确的名称是“析构函数”,而不是“解构函数”;)
答案 2 :(得分:5)
您有3个对象a
,lol
和b
。您没有跟踪由编译器生成的复制构造函数(这个由lol
调用),因此这就是为什么只有两个构造函数。
答案 3 :(得分:3)
a
,lol
和b
每次调用一次。
要确认这一点,您可以在类中添加一个字段,并为每个字段分配一个名称/ ID,您可以在析构函数中打印出来。您还可以打印出this
的值,这是指向对象的指针。
答案 4 :(得分:2)
SimpleClass lol = a; //calls the default copy constructor which you have not defined
覆盖复制构造函数,然后您可能会看到一个名为。
的新构造函数答案 5 :(得分:0)
您有a
,lol
和b
。
也许你可以在main()
以及构造函数和析构函数中打印他们的地址,然后你会看到它。
答案 6 :(得分:0)
因为析构函数对于所有对象都是相同的。