2014-10-11 4 views
5

나는 다음과 같은 코드가 있습니다 :소멸자가 두 번 호출되는 이유는 무엇입니까?

#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의 값을 두 번 인쇄합니다 ... 즉 소멸자가 두 번 호출된다는 것을 의미하지만 두 번 호출되는 이유는 무엇입니까?

+7

'temp'도 객체라는 사실을 잊어 버렸습니다. –

+1

@OliverCharlesworth 글쎄, 그건 아마 RVO거야. 그러나 'a1 + 50'에 의해 임시로 생성 된 것은 생략 할 수 없습니다. –

답변

11

a2=a1+50 할당 중에 a1+50을 포함하는 임시 개체가 할당됩니다.

이 개체는 a2에 복사 된 직후 파괴됩니다.

7

정의한 operator+은 임시 개체를 반환하기 때문에 나중에 a2에 할당됩니다. 임시 파일과 a2이 모두 파괴되어 (진술 끝에있는 a2의 끝에 임시적으로 main 끝에 있음) 해당 값이 인쇄됩니다.

2

단지

a1+50; 

a2=a1+50; 

를 교체하고 그 이유를 볼 수 있습니다.

관련 문제