2009-07-04 16 views
9

संभव डुप्लिकेट:
Difference between pointer variable and reference variable in C++C++ * बनाम और समारोह घोषणा में

जब मैं संकेत पारित कर-दर-संदर्भ वस्तुओं बनाम के रूप में मेरे चर घोषित करना चाहिए? वे असेंबली में एक ही चीज़ को संकलित करते हैं (कम से कम रन-टाइम एसिम्पेटिक रूप से) तो मुझे किस का उपयोग करना चाहिए? जब आप शासन से बाहर निकालने से 0.

हो सकता है पता चलता है कि मूल्य वैकल्पिक है चाहते हैं और इस तरह उपयोग *:

void foo(obj* param) 
void foo(obj& param) 
+2

http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-c के कई अन्य, कई अन्य –

उत्तर

12

मेरा नियम सरल है सब _obj_s आसपास कंटेनरों में जमा हो जाती है और आप डॉन ' टी foo(value); के बजाय हर जगह foo(*value); का उपयोग करके अपना कोड बदसूरत दिखाना चाहते हैं, तो यह दिखाने के लिए कि उस मान को assert(value); पर शुरू नहीं किया जा सकता है।

3

पॉइंटर्स का उपयोग करने का एक कारण यह है कि यदि यह NULL फ़ंक्शन में मान को पास करने के लिए समझ में आता है। एक सूचक के साथ, यह ऐसा करने में सक्षम होने की उम्मीद है। एक संदर्भ के साथ, ऐसा करने में सक्षम होने की उम्मीद नहीं है।

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

एक और परंपरा है कि अगर आप एक से पारित है एक फ़ंक्शन में पॉइंटर, फ़ंक्शन ऑब्जेक्ट का स्वामित्व लेने के लिए पॉइंटर का उपयोग कर सकता है (विशेष रूप से COM-like संदर्भ गिनती पर्यावरण में)। यदि आप कोई संदर्भ पास करते हैं, तो कॉल किया गया फ़ंक्शन फ़ंक्शन कॉल की अवधि के लिए ऑब्जेक्ट का उपयोग करने की अपेक्षा कर सकता है लेकिन बाद में उपयोग के लिए ऑब्जेक्ट को पॉइंटर नहीं रख सकता है।

6

मैं Google style guide standard का पालन करता हूं क्योंकि यह मुझे सबसे ज्यादा समझ में आता है। इसमें कहा गया है:

समारोह पैरामीटर के भीतर की गई सभी संदर्भ स्थिरांक होना चाहिए:

void Foo(const string &in, string *out); 

वास्तव में यह गूगल कोड में एक बहुत मजबूत सम्मेलन है कि इनपुट तर्क मूल्यों या स्थिरांक संदर्भ हैं, जबकि आउटपुट तर्क पॉइंटर्स हैं। इनपुट पैरामीटर कॉन्स्ट पॉइंटर्स हो सकते हैं, लेकिन हम गैर-कॉन्स्ट संदर्भ पैरामीटर को कभी भी अनुमति नहीं देते हैं।

ही एक मामला है जब आप एक इनपुट पैरामीटर एक स्थिरांक सूचक होने के लिए चाहते हो सकता है अगर आप पर जोर देना है कि तर्क कॉपी नहीं है चाहते है, इसलिए यह वस्तु के जीवन भर के लिए मौजूद होना चाहिए; टिप्पणियों में भी इसे दस्तावेज़ करना सबसे अच्छा होता है। bind2nd और mem_fun जैसे एसटीएल एडाप्टर संदर्भ पैरामीटर की अनुमति नहीं देते हैं, इसलिए आपको इन मामलों में पॉइंटर पैरामीटर के साथ फ़ंक्शन घोषित करना होगा।

+1

मैं इस बिंदु से सहमत नहीं हूं। यह भाषा में संदर्भ/सूचक अवधारणा का दुरुपयोग है। संदर्भ उनके संकलन-समय पर सुनिश्चित करने के लिए हैं कि एक मूल्य प्रारंभ किया गया है। यह एक बहुत ही मजबूत अनुबंध है जहां कोई कहता है कि फ़ंक्शन केवल प्रारंभिक मान स्वीकार करता है। जावा या सी # जैसी भाषाओं में कमी है, जो डेवलपर्स को अतिरिक्त रूप से जांचने के लिए मजबूर करता है कि क्या मूल्य पारित किया गया है नल (शून्य) या नहीं। मैं अनुबंध में प्रवर्तन नहीं देखता हूं कि मुझे केवल कॉन्स वैल्यू स्वीकार करने की अनुमति है। – ovanes

1

पॉइंटर्स और संदर्भों के बीच अन्य अंतर यह है कि यह निहित है कि आप किसी संदर्भ में नहीं रहेंगे, जब तक कि आप एक निर्माता को पास न करें। पासिंग पॉइंटर्स का मतलब यह हो सकता है कि एक ऑब्जेक्ट थोड़ी देर के लिए एक समग्र पैटर्न ऑब्जेक्ट की तरह हो सकता है।

0

एक अच्छा कारण है कि मैं पॉइंटर्स का उपयोग करता हूं और मेरे सी ++ अनुप्रयोगों में संदर्भ नहीं, पठनीयता है। एक सूचक का उपयोग करते समय आप देखते हैं कि वास्तव में क्या हो रहा है, और पॉइंटर्स का उपयोग करते समय वाक्यविन्यास आपको बताता है कि वास्तव में क्या हो रहा है।

वही "0" या "न्यूल" के लिए जाता है। मैं "शून्य" इस तरह से 3 महीने बाद का उपयोग कर पसंद करते हैं, जब मैं एक कोड ऐसा दिखता है जैसे देखें:

somevar_1 = 0; 
somevar_2 = NULL; 

मुझे पता है कि somevar_1 एक int (या float) और somevar_2 सूचक किसी तरह का है।

संबंधित मुद्दे