2014-10-11 17 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

@ ओलिवर चार्ल्सवर्थ वेल, शायद यह आरवीओड है। लेकिन 'ए 1 + 50' द्वारा निर्मित अस्थायी नहीं किया जा सकता है। –

उत्तर

11

असाइनमेंट a2=a1+50 के दौरान, एक अस्थायी वस्तु a1+50 आवंटित की जाती है।

यह ऑब्जेक्ट a2 में कॉपी होने के तुरंत बाद नष्ट हो गया है।

7

क्योंकि operator+ आपने परिभाषित एक अस्थायी वस्तु लौटा दी है जिसे बाद में a2 पर असाइन किया गया है। main के अंत में अस्थायी और a2 दोनों नष्ट हो गए हैं (कथन के अंत में अस्थायी, a2), उनके मूल्यों को प्रिंट करना।

2

सिर्फ

a1+50; 

के साथ बदलें

a2=a1+50; 

और तुम क्यों देखेंगे।

संबंधित मुद्दे