2012-06-30 2 views
5

this question का जवाब देते हुए मुझे थोड़ा उलझन मिला। हम सभी जानते हैं कि यह सी ++ प्रति सेमेन्टिक्स के कारण ठीक काम करता है:ढेर और संदर्भों पर ऑब्जेक्ट्स

int *some_obj = new int(42); 
int a_copy = *some_obj; 

delete some_obj; 

printf("The answer is %d\n", a_copy); 

लेकिन इसके बारे में क्या?

int *some_obj = new int(42); 
int& a_ref = *some_obj; 

delete some_obj; 

printf("The answer is %d\n", a_ref); 

क्या यह हटाई गई मेमोरी एक्सेस कर रहा है?

संभावित रूप से विभिन्न रूपों में विभिन्न बार पूछा जाता है, लेकिन यह बहुत Google अनुकूल नहीं है। नरक, मैं एक सभ्य खिताब नहीं बना सका।

उत्तर

4

हाँ, यह है। तो इसकी अनुमति नहीं है। (आप यह सुनिश्चित कर सकते हैं कि आप एक विनाशक के साथ कक्षा का उपयोग कर अंतर देखें जो मूल्य को बदलता है।)

+0

अब जब मैं उस पर विकिपीडिया पेज का एक हिस्सा पढ़ता हूं, तो यह [इस खंड] के अंतिम पैराग्राफ में स्पष्ट रूप से बताता है (http://en.wikipedia.org/wiki/Reference_ (सी% 2 बी% 2 बी) #Relationship_to_pointers)। अस्थायी संदर्भों को वापस करने के बारे में क्या (ए कुछ यादृच्छिक वर्ग है) 'ए और func() {वापसी ए(); } '? – orlp

+0

यह वही समस्या है। आप उस ऑब्जेक्ट का संदर्भ लौट रहे हैं जो कॉलर को प्राप्त होने पर मौजूद नहीं है। –

+0

ठीक है, समझाए जाने के लिए धन्यवाद। – orlp

1

बिल्कुल। दूसरा उदाहरण जारी स्मृति का उपयोग करता है। संदर्भों का कार्यान्वयन पॉइंटर्स है। बहुत आसान। संदर्भ एक सूचक है जिसे बदला नहीं जा सकता है और इसमें एक्सेस ऑपरेटर की अलग-अलग टिप्पणियां हैं। उनके बीच कोई और अंतर नहीं है।