2009-08-25 8 views
8

मैं वर्तमान में सी ++ में अपना पहला वास्तविक प्रोजेक्ट कर रहा हूं और इसलिए, पॉइंटर्स के लिए बिल्कुल नया है। मुझे पता है कि वे क्या हैं और कुछ बुनियादी उपयोग नियम पढ़ चुके हैं। शायद पर्याप्त नहीं है क्योंकि मैं अभी भी वास्तव में समझ नहीं पा रहा हूं कि उनका उपयोग कब किया जाए, और कब नहीं।पॉइंटर्स का उपयोग कब करें, और जब उनका उपयोग न करें

समस्या यह है कि ज्यादातर जगहों का उल्लेख है कि ज्यादातर लोग या तो उन्हें अधिक उपयोग करते हैं या उनका उपयोग करते हैं। मेरा सवाल है, जब उनका उपयोग करना है, और कब नहीं?

वर्तमान में, कई मामलों में मैं खुद से पूछ रहा हूं, क्या मुझे यहां एक पॉइंटर का उपयोग करना चाहिए या केवल चर को फ़ंक्शन पर पास करना चाहिए।

उदाहरण के लिए, मुझे पता है कि आप एक फ़ंक्शन में पॉइंटर भेज सकते हैं ताकि फ़ंक्शन वास्तव में इसकी प्रतिलिपि के बजाय चर बदल सकता है। लेकिन जब आपको केवल ऑब्जेक्ट की कुछ जानकारी प्राप्त करने की आवश्यकता होती है (उदाहरण के लिए विधि को getValue() कुछ चाहिए), तो उस मामले में पॉइंटर्स उपयोगी हैं?

मुझे या तो प्रतिक्रियाएं देखना पसंद आएगा, लेकिन लिंक भी सहायक हो सकते हैं। चूंकि यह पहली बार सी ++ का उपयोग कर रहा है, मेरे पास अभी तक एक अच्छी सी ++ पुस्तक नहीं है (अगर मैं सी ++ का उपयोग करता हूं तो मैं एक खरीदने के बारे में सोच रहा था)।

+6

एक पुस्तक बिल्कुल जरूरी है (वास्तव में एक से अधिक है) - आप अकेले SO उत्तरों से सी ++ नहीं सीखेंगे। और कोनेग और मू द्वारा प्राप्त पुस्तक को त्वरित सी ++ है। –

+0

मैंने http: // stackoverflow पढ़ने के बाद ऐसा भविष्यवाणी की।कॉम/प्रश्न/388242/द-निश्चित-सी-बुक-गाइड-एंड-लिस्ट इस दिन की शुरुआत में: डी – bastijn

उत्तर

18

करते के लिए और न सी के ++ का:

प्रभावी सी ++ और अधिक प्रभावी सी ++ स्कॉट Meyers द्वारा।

संकेत (और संदर्भ) के लिए: मूल्य द्वारा

  • उपयोग पास अगर प्रकार 4 बाइट्स में फिट बैठता है और यह कॉल की वापसी के बाद बदलवाने के लिए नहीं करना चाहती।
  • टाइप का बड़ा होने पर कॉन्स के संदर्भ में पास का उपयोग करें और आप कॉल की वापसी के बाद इसे बदलना नहीं चाहते हैं।
  • संदर्भ द्वारा पास का उपयोग करें यदि पैरामीटर न्यूल
  • अन्यथा कोई संकेतक का उपयोग नहीं कर सकता है।

dont't कच्चे संकेत उपयोग करें यदि आप की जरूरत नहीं है। अधिकांश समय, एक स्मार्ट सूचक (Boost देखें) बेहतर विकल्प है।

+0

64 बिट आर्किटेक्चर पर उन 4 बाइट्स के साथ क्या है? पहले नियम के लिए – sbi

+0

मैं कहूंगा "आकार (टी)> आकार (int) के मूल्य से पास का उपयोग करें ...." –

+0

बड़े प्रकार के लिए पास-बाय-रेफरेंस चीज के लिए, http: // cpp-next। कॉम/संग्रह/200 9/08/इच्छित-गति-पास-दर-मूल्य/पढ़ने योग्य है। – jalf

2

जब भी आप आवंटित स्मृति से निपट रहे हों या किसी विधि के संदर्भ में तर्क पारित कर रहे हों; मुझे नहीं लगता कि पॉइंटर्स का उपयोग न करने का नियम है।

+0

यह सी ++ है, इसलिए आप पॉइंटर्स को वरीयताओं में संदर्भ का उपयोग करेंगे – frankster

4

1) मैं वर्ग के साथ स्केल किए गए सदस्य चर का उपयोग करता हूं। वे कक्षा के प्रारंभकर्ता में बनाए जाते हैं, और मुझे पॉइंटर्स के बारे में चिंता करने की आवश्यकता नहीं है।

2) आप किसी फ़ंक्शन के संदर्भ में पास कर सकते हैं, और पॉइंटर्स पास करने के बारे में चिंता न करें। यह प्रभावी ढंग से विधि/फ़ंक्शन पर एक पॉइंटर पास करेगा जिसका उपयोग आप कक्षा को पारित करने के लिए किया जा सकता है, लेकिन कक्षा को कॉपी करने के ऊपरी हिस्से के बिना।

3) अगर मुझे किसी ऐसे ऑब्जेक्ट के जीवनकाल को नियंत्रित करने की आवश्यकता है जो मेरे मुख्य अनुप्रयोग आर्किटेक्चर के वर्गों से स्वतंत्र है ... तो मैं एसईएल से स्वचालित रूप से पॉइंटर के विनाश को संभालने के लिए एक auto_ptr का उपयोग करूंगा जब कोई भी इसका संदर्भ नहीं देता है। इसे देखें - यह जाने का रास्ता है।

0

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

जब आप स्मृति के गतिशील आवंटन करना चाहते हैं तो पॉइंटर्स की आवश्यकता होती है; जब आपको किसी अज्ञात राशि से निपटने की आवश्यकता होती है जिसे बाद में निर्दिष्ट किया जाएगा। इस मामले में स्मृति तक पहुंचने के लिए इंटरफेस new और delete के माध्यम से है जो पॉइंटर्स में सौदा करता है।

0

मेरा दर्शन हमेशा मूल्य से गुजरना है, जब तक आपको ऑब्जेक्ट को पारित करने या प्रतिलिपि बनाने वाले चर को संशोधित करने की आवश्यकता न हो। इन दोनों मामलों में, पहले पॉइंटर के बजाय संदर्भ का उपयोग करने पर विचार करें: यदि आपको उस ऑब्जेक्ट को बदलने की आवश्यकता नहीं है जिसे आप संदर्भित कर रहे हैं, और न ही आपको संभावित चरम मूल्य (पूर्ण सूचक) की आवश्यकता है, तो आप संदर्भ का उपयोग कर सकते हैं।

या तो इटरेटर के बारे में मत भूलना।

0

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

0
  1. कक्षा विशेषता: सूचक
  2. चर तरीकों में घोषणा की: कोई संकेत है, तो हम मेमोरी लीक से बचें।

इस तरह, स्मृति लीक को नियंत्रित करें और विशेषता की स्थिरता को नियंत्रित करें।

सालू 2।

1

अंगूठे का मेरा नियम:

  1. हमेशा स्थिरांक संदर्भ के रूप में समारोह पैरामीटर भेजने,
  2. जब तक कि वे निर्मित प्रकार कर रहे हैं, जो मामले में वे कॉपी कर रहे हैं (और स्थिरांक/गैर-स्थिरांक एक प्रश्न बन जाता है स्टाइल के रूप में कॉलर प्रभावित नहीं होता है) या
  3. जब तक कि वे फ़ंक्शन के अंदर परिवर्तित नहीं होते हैं, ताकि कॉलर पर परिवर्तन प्रतिबिंबित हो जाएं, इस मामले में वे गैर-कॉन्स्ट संदर्भ या
  4. द्वारा पारित किए जाते हैं जब तक कि फ़ंक्शन को कॉल करने योग्य होना चाहिए भले ही कॉलर्स के पास ओबी न हो पारित करने के लिए अस्वीकृत है, तो वे संकेत के रूप में पारित कर रहे हैं, ताकि कॉल करने के बजाय NULL संकेत में पारित कर सकते हैं

स्ट्रीम हमेशा आस पास किया जाना चाहिए (प्रति const T* या T* प्रति पारित करने के लिए तय करने के लिए # 1 और # 3 लागू) गैर-कॉन्स संदर्भ के रूप में।

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