यह कोड स्निपेट:
int& func1()
{
int i;
i = 1;
return i;
}
इसलिए काम नहीं करेगा क्योंकि आप एक एलियास (एक संदर्भ) को फ़ंक्शन कॉल के दायरे तक सीमित जीवनकाल के साथ एक वस्तु पर लौटा रहे हैं। इसका मतलब है कि एक बार func1()लौटता है, int iमर जाता है, जिससे संदर्भ समारोह से बेकार हो जाता है क्योंकि यह अब एक ऐसी वस्तु को संदर्भित करता है जो मौजूद नहीं है।
int main()
{
int& p = func1();
/* p is garbage */
}
दूसरा संस्करण काम करता है क्योंकि चर को मुफ्त स्टोर पर आवंटित किया गया है, जो फ़ंक्शन कॉल के जीवनकाल के लिए बाध्य नहीं है। हालांकि, आप deleteआवंटित आईएनजी के लिए जिम्मेदार हैं int।
int* func2()
{
int* p;
p = new int;
*p = 1;
return p;
}
int main()
{
int* p = func2();
/* pointee still exists */
delete p; // get rid of it
}
आमतौर पर आप कुछ RAII क्लास और / या फैक्ट्री फंक्शन में पॉइंटर को लपेटते हैं ताकि आपको deleteयह खुद न करना पड़े ।
या तो मामले में, आप केवल मूल्य खुद ही वापस कर सकते हैं (हालांकि मुझे आपके द्वारा प्रदान किए गए उदाहरण का एहसास है कि शायद आप वंचित थे):
int func3()
{
return 1;
}
int main()
{
int v = func3();
// do whatever you want with the returned value
}
ध्यान दें कि बड़ी वस्तुओं को वापस करने के लिए यह बिल्कुल ठीक है कि जिस तरह से func3()आदिम मूल्यों को लौटाता है क्योंकि आजकल हर कंपाइलर के बारे में रिटर्न वैल्यू ऑप्टिमाइजेशन के कुछ फॉर्म लागू होते हैं :
class big_object
{
public:
big_object(/* constructor arguments */);
~big_object();
big_object(const big_object& rhs);
big_object& operator=(const big_object& rhs);
/* public methods */
private:
/* data members */
};
big_object func4()
{
return big_object(/* constructor arguments */);
}
int main()
{
// no copy is actually made, if your compiler supports RVO
big_object o = func4();
}
दिलचस्प है, एक अस्थायी को एक कास्ट संदर्भ में बांधना पूरी तरह से कानूनी सी ++ है ।
int main()
{
// This works! The returned temporary will last as long as the reference exists
const big_object& o = func4();
// This does *not* work! It's not legal C++ because reference is not const.
// big_object& o = func4();
}
int& i = * new int;