2014-10-11 21 views
5

Mam następujący kod:Dlaczego destruktor jest wywoływany dwa razy?

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

Wyjście to pokazuje:

60 70 
60 70 
10 20 

Kod działa prawie jak oczekiwano. Problem polega na dwukrotnym wypisywaniu wartości obiektu a2 ... co oznacza, że ​​destruktor jest wywoływany dwa razy ... ale dlaczego jest wywoływany dwa razy?

+7

Zapomniałeś, że 'temp' jest również obiektem. –

+1

@OliverCharlesworth Cóż, to prawdopodobnie RVO. Ale tymczasowy stworzony przez 'a1 + 50' nie może zostać usunięty. –

Odpowiedz

11

Podczas przydzielania a2=a1+50 przydzielany jest obiekt tymczasowy zawierający a1+50.

Ten obiekt jest niszczony natychmiast po skopiowaniu do a2.

7

Ponieważ zdefiniowany przez użytkownika operator+ zwraca obiekt tymczasowy, który jest następnie przypisywany do a2. Zarówno tymczasowe, jak i zostają zniszczone (tymczasowy na końcu instrukcji, a2 pod koniec main), drukując ich wartości.

2

Wymień

a2=a1+50; 

tylko z

a1+50; 

a zobaczysz dlaczego.