5

输入:

#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 次。

构造函数只被调用了两次!!!!

4

7 回答 7

11

析构函数被调用了三次,aforlolb
在您的情况下,ab使用default constructor. 但是请注意,lol使用copy constructor

于 2013-11-12T06:05:51.457 回答
6

因为恰好创建了 3 个 SimpleClass 类的对象,但是您的构造函数只被调用了 2 次:

  • 第一个对象是a,调用你的构造函数;
  • 第二个是,它是通过通过隐式定义的复制构造函数从alol复制来初始化的 (从而绕过你的构造函数);
  • 第三是b,调用你的构造函数。

请注意,这lol2只是一个指向 b 的指针,因此不会进行额外的调用。

正确的名称是“析构函数”,而不是“解构函数”;)

于 2013-11-12T06:07:11.047 回答
5

您有 3 个对象alolb。您没有跟踪由编译器生成的复制构造函数(这个由 调用 lol),所以这就是为什么只有两个构造函数。

于 2013-11-12T06:05:43.650 回答
3

a对于,lol和 ,分别调用一次b

为了确认这一点,您可以在类中添加一个字段,并为每个人分配一个名称/ID,您可以在析构函数中打印出来。您还可以打印出 的值this,它是指向对象的指针。

于 2013-11-12T06:05:29.433 回答
2
  SimpleClass lol = a;    //calls the default copy constructor which you have not defined

覆盖复制构造函数,然后您可能会看到一个新的构造函数被调用。

于 2013-11-12T06:14:24.097 回答
0

你有a和。lolb

也许你可以main()在构造函数和析构函数中打印它们的地址,然后你会看到它。

于 2013-11-12T06:05:43.580 回答
0

因为析构函数对所有对象都是一样的。

于 2013-11-25T15:28:52.880 回答