इसका क्या अर्थ व्यावहारिक रूप से है?
इसका मतलब है कि दूसरी विधि मूल्य-दर-मूल्य देता है, यानी यह सरणी-आइटम/डबल की एक प्रति बनाता है और कॉलर को प्रतिलिपि देता है। पहली विधि संदर्भ द्वारा लौटाती है, यानी यह दोहरी प्रतिलिपि नहीं बनाता है, बल्कि मूल/इन-द-एरे डबल के स्थान का संदर्भ देता है, जिसे कॉलिंग कोड का उपयोग सीधे इन- सरणी डबल, अगर यह चाहता है। (अगर यह मदद करता है, लौटे संदर्भ के अविवेक अर्थ विज्ञान कुछ हद तक सूचक अर्थ विज्ञान की तरह, कर रहे हैं एक वाक्य रचना कि अधिक परंपरागत C/C++ दर-मूल्य कार्यक्षमता के समान है के साथ छोड़कर)
जब मैं एक का उपयोग होता है और मैं दूसरे का उपयोग कब करूंगा?
बाय-वैल्यू विधि सुरक्षित है, क्योंकि अपरिभाषित व्यवहार का आह्वान करने का कम मौका है; बाय-रेफरेंस विधि आपको कुछ और लचीलापन देता है (यानी कॉलर सरणी में आइटम को रिटर्न वैल्यू के रूप में प्राप्त संदर्भ में लिखकर अपडेट कर सकता है) और यह कुछ स्थितियों में अधिक कुशल हो सकता है (उदाहरण के लिए एक संदर्भ लौटने से संदर्भ ऑब्जेक्ट की प्रतिलिपि बनाने की आवश्यकता है, यदि वस्तु बड़ी या जटिल है तो एक महंगा ऑपरेशन हो सकता है)। एक छोटी वस्तु के लिए एक डबल की तरह, प्रति-मूल्य लौटने से संदर्भ द्वारा लौटने की अपेक्षा अधिक कुशलता है।
क्या [द्वारा संदर्भ विधि] किसी भी तरह से खतरनाक है?
:, उदाहरण के लिए, यदि आप उस अपरिभाषित व्यवहार का कारण होता है एक स्वत:/ढेर चर के लिए एक संदर्भ, वापस आना था के बाद से चर नष्ट हो जाएगा बुला कोड इसका इस्तेमाल कर सकते से पहले -
यह हो सकता है
double & dont_ever_do_this()
{
double x = 5.0; // x will be destroyed as this method returns!
return x; // so returning a reference to x is a silly thing to do
}
इसी प्रकार, आपके माइक्लास उदाहरण में, यदि कॉलर लौटा संदर्भ पर रहता है और फिर इसे मैरायर हटा दिए जाने के बाद इसका उपयोग करने का प्रयास करता है, तो कॉलर एक मेमोरी लोकेशन (या लिखना) से पढ़ रहा है जो नहीं है अब मान्य है, और इससे अपरिभाषित व्यवहार (पढ़ना: खराब चीजें) होने का कारण बनेंगे।
और निश्चित रूप से एक गैर-कॉन्स्टेंस संदर्भ लौटने का अर्थ है कि कॉलर में आपके वर्ग के बारे में जागरूक किए बिना लौटाए गए सरणी आइटम की सामग्री को बदलने की क्षमता है, जो शायद कुछ ऐसा नहीं हो सकता है जिसे आप अनुमति देना चाहते हैं।
स्रोत
2016-04-28 15:35:28
क्या आप सुनिश्चित हैं कि जब आप 'डबल ऑपरेटर() (const int n) देखते हैं, तो आप वास्तव में' डबल ऑपरेटर() (const int n) cont' नहीं देख रहे हैं? – NathanOliver
कुछ शब्दों में: पहला व्यक्ति लेखन का समर्थन करता है; दूसरा ऑब्जेक्ट उपलब्ध है यदि ऑब्जेक्ट स्थिर है। –
संभावित डुप्लिकेट [पॉइंटर वैरिएबल और सी ++ में संदर्भ चर के बीच अंतर क्या हैं?] (Http://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable- और---संदर्भ-चर-इन) – piyushj