2012-05-29 25 views
7

मैं निम्नलिखित वर्ग है:संदर्भ और ग में नाशक ++

class A 
{ 
public: 
    B& getB() {return b;}  
private: 
    B b; 
}; 

class B 
{ 
    ~B() {cout<<"destructor B is called";} 
... 

}; 

void func() 
{ 
    A *a = new a; 
    B b = a->getB(); 
    ..... 
} 

क्यों वर्ग बी के नाशक जब समारोह समारोह से बाहर निकलते समय कहा जाता है करता है? क्या कार्य प्राप्त होता है बी वस्तु ऑब्जेक्ट को संदर्भ देता है? यदि वर्ग ए अभी भी फ़ंक्शन func के अंत में मौजूद है, तो बी के विनाशक को क्यों कहा जाता है?

+0

आपकी बी ऑब्जेक्ट फ़ंक्शन के लिए अभी भी स्थानीय है। –

उत्तर

6

नहीं बनाएगा जब आपके पास बुलाया जाएगा:

B b = a->getB(); 

प्रकार B की एक नई वस्तु बनाई गई है B (B&) के मौजूदा उदाहरण के संदर्भ से। यह B::operator= नहीं है जिसे यहां कहा जाता है लेकिन कॉपी कन्स्ट्रक्टर

प्रत्येक वर्ग में एक प्रतिलिपि है (यदि आप इसे स्पष्ट रूप से नहीं जोड़ते हैं, तो संकलक आपके लिए एक प्रदान करेगा)। यह एक एकल तर्क स्वीकार करता है जो एक ही कक्षा का संदर्भ है। आप उपरोक्त इसलिए मुझे लगता है कि संकलक आप के लिए एक उत्पन्न किया है कोड में प्रतिलिपि निर्माता नहीं डाल दिया है:

class B 
{ 
public: 
    B(B& other) 
    { 
     // memberwise copy (shallow copy) 
    }; 
}; 

तो A::getB() सदस्य A::b के लिए एक संदर्भ लौट आए और इस संदर्भ B::B(B&) लिए एक तर्क के रूप पारित किया गया था।

void func() 
{ 
    A *a = new A(); // Instance of A is created on the heap; 
        // (pointer a is a local variable and is on the stack though!) 
        // A::b is object of type B and it is on the heap as well 

    B b = a->getB(); // Instance of class B is created on the stack (local variable) 
    ..... 
    delete a;  // deleting A from the heap: 
        // A::~A is called which calls B::~B (of its member b) 
} // a and b go out of the scope; b is an object => B::~B is called      
+0

तो यदि कोई नई ऑब्जेक्ट बनाई गई है तो फ़ंक्शन से संदर्भ द्वारा लौटने का क्या उपयोग होता है? – Shay

+0

@Shay: ऑब्जेक्ट संदर्भ द्वारा वापस किया जाता है, इसलिए यह ऑब्जेक्ट की प्रतिलिपि को मूल्य के अनुसार लौटने के दौरान छोड़ देता है, लेकिन इस लौटा संदर्भ को उस स्टैक पर एक नई ऑब्जेक्ट बनाने के लिए कॉपी किया जाता है जिसे बाद में संदर्भित संदर्भ का उपयोग करके प्रारंभ किया जाता है। –

20
B b = a->getB(); 

प्रतिलिपि निर्माता B(const& B) बुला लिया जाएगा ताकि आप ढेर पर एक नई वस्तु पैदा कर रहे ऑब्जेक्ट संदर्भ द्वारा दिया की एक प्रति है के साथ। बजाय उपयोग:

B& b = a->getB(); 

और कोई नाशक के बाद से आप एक नया बी वस्तु

+0

संदर्भ की एक प्रति का अर्थ बी के पते की एक प्रति है? – Shay

+0

@chaiy ऐसा नहीं सोचते हैं, तो आप कॉपी कॉपी निर्माता – lezebulon

+2

@Shay no को कॉल करेंगे, यह उत्तर भ्रामक है। इसका मतलब है * ऑब्जेक्ट * की एक प्रति। –