C++ FAQ का कहना है:क्या यह वास्तव में सभी स्थितियों में पॉइंटर्स के सी ++ संदर्भों को प्राथमिकता देने का सबसे अच्छा अभ्यास है?
"उपयोग संदर्भ जब आप कर सकते हैं, और संकेत आप के लिए है जब।"
मुझे लगता है यह जितना आसान ऊपर कहा गया है नहीं है। पॉइंटर्स के संदर्भ सामान्य रूप से बेहतर क्यों हैं, इस पर विचार-विमर्श किया गया है। तो मैं उन विशेष मामलों पर चर्चा करना चाहूंगा जहां संदर्भ समझ में आते हैं लेकिन वे बहुत ही असामान्य हैं और केवल सही महसूस नहीं करते हैं:
मेरे लिए सबसे स्पष्ट मामला सामान्य डेटा संरचनाओं में उनका उपयोग पेड़ या लिंक- सूची। उनके इंटरफेस निश्चित रूप से संदर्भों का उपयोग और सुरक्षित महसूस लागू किया जा सकता है, लेकिन मैं एक ही कार्यान्वयन कि संदर्भ का लाभ ले जाएगा नहीं देखा है जैसे:
Node *parent = n.parent(); // parent might be unset -> pointer
Node &child = n.child(5); // child is always valid -> reference
हालांकि यह आकर्षक लग सकता है, यह इस तरह से कोड करने के लिए ले जाता है:
if(parent == &child) ... // weird, unusual at least?
मुझे आश्चर्य है, क्या यह शुद्ध सी ++ के लिए खड़ा है?
हर बार जब मैं आँख बंद करके संदर्भ का उपयोग करने के लिए जहाँ कहीं भी यह संभव है की कोशिश की है, मैं इसी तरह की विसंगतियों के सभी प्रकार का सामना करना पड़ा और मिश्रण संकेत और विभिन्न तरीकों से बदसूरत संदर्भ समाप्त हो गया है।
निष्कर्ष निकालने के लिए, ऑपरेटर नया पहली जगह में सूचक के बजाय एक नए उदाहरण का संदर्भ नहीं देता है? (और त्रुटि के मामले में फेंकता):
Node &n = new Node;
delete &n;
यह एक बेतुका उदाहरण है, लेकिन वह क्या "शुद्ध सी ++" होगा नहीं है?
आप बिंदु खो रहे हैं। उद्धरण के बारे में सोचें "जब आप कर सकते हैं स्वचालित संग्रहण का उपयोग करें, और गतिशील भंडारण (' new') जब आपको करना होगा। " – ildjarn
जो भी समझ में आता है उसका प्रयोग करें। आमतौर पर, इसका अर्थ है कंटेनर के कार्यान्वयन में पॉइंटर्स, और क्लाइंट कोड में संदर्भ। इसके अलावा, कोई भी हास्यास्पद कोड लिखने से किसी को भी रोक नहीं सकता है, इसलिए यदि कोई कहता है कि 'हटाएं और एक्स;', तो आप ऐसा नहीं कर सकते हैं। आपको यह मानना है कि आपके ग्राहक * सही कार्यक्रम लिखना चाहते हैं। आपको बस उनके लिए इसे आसान बनाना है। –
संदर्भों को ऑब्जेक्ट पास करने के दौरान संदर्भों को प्राथमिकता दी जाती है क्योंकि कोई कॉपी कन्स्ट्रक्टर नहीं होने के कारण यह तेज़ होता है। – chris