为什么析构函数被调用两次?

时间:2014-10-11 13:27:10

标签: c++ class object destructor

我有以下代码:

#include <cstdio>
#include <iostream>
using namespace std;

class A
{
    int a, b;
public:
    A() : A(5, 7) {}
    A(int i, int j)
    {
        a = i;
        b = j;
    }
    A operator+(int x)
    {
        A temp;
        temp.a = a + x;
        temp.b = b + x;
        return temp;
    }
    ~A() { cout << a << " " << b << endl; }
};

int main()
{
    A a1(10, 20), a2;
    a2 = a1 + 50;
}

输出显示:

60 70
60 70
10 20

代码几乎按预期工作。问题是它打印对象a2的值两次......这意味着析构函数被调用两次......但为什么它被调用两次?

3 个答案:

答案 0 :(得分:11)

在分配a2=a1+50期间,分配了一个包含a1+50的临时对象。

此对象在复制到a2后立即销毁。

答案 1 :(得分:7)

因为您定义的operator+返回一个随后分配给a2的临时对象。临时和a2都被销毁(语句末尾的临时,a2末尾的main),打印它们的值。

答案 2 :(得分:2)

替换

a2=a1+50;

只是

a1+50;

你会明白为什么。