为什么要调用析构函数

时间:2017-12-10 20:32:45

标签: c++ class constructor destructor

这是我一直试图了解其工作原理的代码。

#include <iostream>

using namespace std;

class A
{
public:
    int variable;

    A()
    {
        cout << "Default Constructor\n";
    }

    A(int variable_)
    {
        cout << "Overloaded Constructor\n";
        variable = variable_;
    }

    A(A& Object)
    {
        cout << "Copy Constructor\n";
        variable = Object.variable;
    }

    ~A()
    {
        cout << "Destructor\n";
    }
};

void main()
{
    {
        A* PA1 = new A(1);

        cout << "\n";

        A* PA2 = &(A(*(PA1)));

        cout << "Second\n\n";

        A* PA3 = &(A(1));

        cout << "\n";

        A* PA4 = new A(*(PA3));
    }



    cout << "\n";
    system("pause");
}

为什么在PA2初始化后调用析构函数?这是什么意思 - &(A(*(PA1))) and &(A(1))

这是此代码的输出:

enter image description here

3 个答案:

答案 0 :(得分:0)

因为它们是临时对象,当它们超出范围时会被杀死。

&amp;(A(*(PA1)))表示A对象的地址,它由复制构造函数构成,其输入变量由PA1指向。

&amp;(A(1))表示A对象的地址,它由带有输入变量1的复制构造函数构成。

在这两种情况下,这些对象都是临时的。

答案 1 :(得分:0)

&(A(*(PA1)))调用A(*(PA1))并返回指向变量的指针。因为这是一个构造函数,所以它返回一个A类型的变量,因为你传递的是一个类型为A的变量,它会调用复制构造函数。这不是好代码,因为返回是在临时内存中。这种行为是未定义的,所以在编写代码时不应该使用它。

&(A(1))执行与上面相同的操作,但调用带有int的构造函数,因为这是您传递给它的内容。

调用析构函数的原因是因为C ++会自动销毁未使用/其范围到期的变量。因此,当您在不使用new关键字的情况下调用构造函数时,会创建对象,但您不会将其存储在任何位置;你存储它的地址,如上所述是未定义的行为。因此构造函数返回的值(因此称为临时值)会立即销毁。

答案 2 :(得分:0)

您的语句A* PA3 = &(A(1))会创建一个临时对象,该对象将在语句后立即销毁。因此,此时将调用析构函数,即在语句之后。

看起来好像你在PA3仍然指向(被破坏的)临时对象的地址这一事实。

请注意,在C ++中,销毁对象不会更改/重置指向此对象的任何指针。只是定义了通过这样的指针访问已删除的对象会调用未定义的行为。因此,PA3指向与临时对象的this相同的地址并不奇怪。但是,取消引用此指针将产生未定义的行为。