2014-10-11 13 views
5

Ich habe den folgenden Code:Warum Destruktor wird zweimal aufgerufen?

#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; 
} 

Ausgabe zeigt es:

60 70 
60 70 
10 20 

Der Code funktioniert fast wie erwartet. Das Problem ist, es druckt die Werte des Objekts a2 zweimal ... das heißt der Destruktor wird zweimal aufgerufen ... aber warum es zweimal aufgerufen wird?

+7

Sie haben vergessen, dass 'temp' auch ein Objekt ist. –

+1

@OliverCharlesworth Nun, das ist wahrscheinlich RVO'd. Aber das von 'a1 + 50' erstellte temporäre Element kann nicht entfernt werden. –

Antwort

11

Während der Zuweisung a2=a1+50 wird ein temporäres Objekt mit a1+50 zugewiesen.

Dieses Objekt wird sofort zerstört, nachdem es in a2 kopiert wurde.

7

Da die von Ihnen definierte operator+ ein temporäres Objekt zurückgibt, das anschließend a2 zugewiesen wird. Sowohl die temporäre und a2 werden zerstört (die temporäre am Ende der Anweisung, a2 am Ende main), Drucken ihrer Werte. Ersetzen

2

a2=a1+50; 

mit nur

a1+50; 

und Sie werden sehen, warum.

Verwandte Themen