दिलचस्प पोस्ट
स्पैमबोट्स से वेबसाइटों पर ईमेल को बचाने के कुछ तरीके क्या हैं? सबसे तेज़ संभव grep UIImageView – छवि का फ़ाइल नाम कैसे सौंपा गया है? FindViewById vsView धारक पैटर्न ListView एडाप्टर में कस्टम टेक्स्टव्यू कैसे बनाएं? एक गिट कमेटी खोजना जिससे कि किसी भी शाखा में एक स्ट्रिंग पेश की गई asio async_write को बढ़ावा दें: कैसे async_write कॉल interleaving नहीं? ब्लूटूथ कम ऊर्जा सक्षम डिवाइस के आरएसएसआई मूल्य से दूरी ढूँढना वेबव्यू में फ़ाइल डाउनलोड करें क्या एसक्यूएल सर्वर में एक डबल का प्रतिनिधित्व करता है? क्या एक फ़ंक्शन के लिए कई मूल्यों को वापस करने के लिए अजगर है? AngularJS में नियंत्रकों के बीच संवाद करने का सही तरीका क्या है? जावा में एक eval () फ़ंक्शन है? UITextField सीमा रंग जहां सत्रस्ट्रॉज और स्थानीयस्टॉरेज संग्रहित है?

क्यों यह 'एक सूचक है और एक संदर्भ नहीं है?

मैं सी + + पेशेवर और विपक्ष के इस सवाल का जवाब पढ़ रहा था और टिप्पणियों को पढ़ने के दौरान इस संदेह को मिला।

प्रोग्रामर अक्सर यह भ्रमित करते हैं कि "यह" एक संकेतक है, लेकिन संदर्भ नहीं है एक और भ्रम है कि "हैलो" प्रकार std :: string नहीं है, लेकिन एक चार const * (पॉइंटर) के लिए मूल्यांकन करता है (सूचक रूपांतरण के लिए एरे के बाद) – जोहान्स शाबा – लिटब दिसम्बर 22 '08 1:56 पर

यह केवल दिखाता है कि यह उसी परंपराओं का उपयोग अन्य (बाद में) भाषाओं के रूप में नहीं करता है – ले डर्फ़ियर दिसंबर 22 '08 पर 3:35

मैं "यह" चीज़ को बहुत तुच्छ मुद्दा कहता हूं, हालांकि। और ओह, अपरिभाषित व्यवहार के मेरे उदाहरणों में कुछ त्रुटियों को पकड़ने के लिए धन्यवाद। 🙂 हालांकि मुझे समझ में नहीं आ रहा है कि आकार के बारे में पहले के किसी भी चीज़ के साथ क्या करना है एक पॉइंटर को आवंटित मेमोरी के बाहर बिंदु करने की अनुमति नहीं है – 22 दिसंबर को 'आफ़्फ़ 4:18'

क्या यह एक स्थिर सूचक है? – हाँराज 22 दिसम्बर '08 बजे 6:35

यह निरंतर हो सकता है यदि विधि const getFoo () const; <- getFoo के दायरे में, "यह" स्थिर है, और इसलिए केवल पढ़ने के लिए है यह बग को रोकता है और कॉलर को कुछ स्तर की गारंटी प्रदान करता है कि ऑब्जेक्ट नहीं बदलेगा। – डौग टी। 22 '08 पर 16:42

आप "यह" पुन: निर्दिष्ट नहीं कर सकते अर्थात आप "यह = और अन्य" नहीं कर सकते हैं, क्योंकि यह एक रैवल्यू है लेकिन यह प्रकार T * है, प्रकार टी const नहीं यानी यह एक निरंतर सूचक है यदि आप एक const विधि में हैं, तो यह const के लिए एक सूचक है टी const लेकिन सूचक स्वयं ही गैर-सन्दर्भ है – जोहान्स शाबा – दिसंबर 22 '08 पर 17:53

इस तरह से "यह" सोचें: # इसे परिभाषित करें (यह_ + 0) जहां कंपाइलर वस्तु को सूचक के रूप में "this_" बनाता है और "यह" एक कीवर्ड बनाता है। आप "यह" असाइन नहीं कर सकते हैं क्योंकि (this_ + 0) एक रैवल्यू है बेशक यह कैसे नहीं है (ऐसा कोई मैक्रो नहीं है), लेकिन यह इसे समझने में मदद कर सकता है – जोहान्स शाबा – लिटब 22 दिसम्बर '08 बजे 17:55

मेरा प्रश्न यह है, क्यों this सूचक नहीं संदर्भ है? कोई संकेतक बनाने के लिए कोई विशेष कारण है?


कुछ और तर्क है कि this एक संदर्भ होने का कारण बन सकता है:

  • More Effective C++ से Item 1 पर विचार Item 1 : संदर्भों का उपयोग करें जब यह गारंटी दी जाती है कि हमारे पास एक वैध वस्तु है, अर्थात् नल (मेरी व्याख्या)।
  • इसके अलावा, संदर्भ पॉइंटर्स से सुरक्षित माना जाता है (क्योंकि हम एक आवारा सूचक के साथ स्मृति को पेंच नहीं कर सकते हैं)।
  • तीसरा, संदर्भों को एक्सेस करने के लिए वाक्यविन्यास ( . ) थोड़ा अधिक अच्छा और पॉइंटर्स ( -> या (*) तक पहुंचने से छोटा है)।

वेब के समाधान से एकत्रित समाधान "क्यों यह 'एक सूचक है और एक संदर्भ नहीं है?"

जब भाषा पहली बार विकसित हुई थी, असली उपयोगकर्ताओं के शुरुआती रिलीज में, कोई संदर्भ नहीं था, केवल संकेत थे संदर्भ जोड़ा गया जब ऑपरेटर ओवरलोडिंग जोड़ा गया था, क्योंकि इसके लिए लगातार काम करने के लिए संदर्भ आवश्यक हैं

इसका एक उपयोग ऑब्जेक्ट के लिए एक पॉइंटर को स्वयं प्राप्त करने के लिए है। यदि यह एक संदर्भ था, तो हमें लिखना होगा &this । दूसरी ओर, जब हम एक असाइनमेंट ऑपरेटर लिखते हैं, तो हमें return *this पड़ता है, जो इस पर return this आसान होता है। इसलिए यदि आपके पास एक रिक्त स्लेट था, तो आप इसे किसी भी तरह से बहस कर सकते हैं। लेकिन सी ++ उपयोगकर्ताओं के एक समुदाय (सबसे सफल चीजों की तरह) की प्रतिक्रिया के जवाब में धीरे-धीरे विकसित हुए। पिछड़े संगतता का मूल्य this संदर्भ या एक संकेतक से उत्पन्न होने वाले नाबालिग फायदे / नुकसान को पूरी तरह से डूबता है

पार्टी के लिए थोड़ी देर देर हो गई … घोड़े के मुंह से सीधे, यहां स्टुपस्ट्रुप को क्या कहना है (जो कि "सी ++ डिज़ाइन और विकास के सी + +" पुस्तक में अनिवार्य रूप से दोहराया जाता है या लिया जाता है):

"यह" संदर्भ क्यों नहीं है?

क्योंकि सन्दर्भ जोड़े जाने से पहले "यह" सी ++ (वास्तव में क्लासेस के साथ सी में) में पेश किया गया था। इसके अलावा, मैंने "स्वयं" के स्मालटाक उपयोग (बाद में) के बजाय, सिमुला उपयोग का पालन करने के लिए "यह" चुना।

सी ++ मानक बताता है कि

9.3.2 / 1

एक नॉनस्टेटिक (9.3) सदस्य फ़ंक्शन के शरीर में, कीवर्ड यह एक गैर-लावल्यू अभिव्यक्ति है जिसका मूल्य ऑब्जेक्ट का पता है जिसके लिए फ़ंक्शन को कहा जाता है। इस प्रकार का एक वर्ग X के सदस्य फ़ंक्शन में X * है यदि सदस्य फ़ंक्शन को कॉन्स्ट घोषित किया जाता है, तो इस प्रकार का प्रकार एक्स * है, अगर सदस्य फ़ंक्शन को वाष्पशील घोषित किया जाता है, तो इसका प्रकार वाष्पशील एक्स * होता है, और यदि सदस्य फ़ंक्शन को ज्वालामुखी में घोषित किया जाता है, तो इस प्रकार का कॉन्स्ट अस्थिर एक्स *

लेकिन अन्य संदर्भों में, यह कुछ और पाया गया था .. इसलिए किसी ने पहल की और श्री स्ट्रवस्ट्रुप को मेल कराया । इसके बाद के वार्तालाप को यहां पाया जा सकता है

चाहे हम यहां कैसे आए, मुझे लगता है कि यह भाग्यशाली है कि यह एक सूचक है और एक संदर्भ नहीं है क्योंकि इससे इसे "समझ" में मदद मिलती है जिसे आप इसे हटा सकते हैं:

 void A::f () { delete &this; } 

मुझे लगता है कि यह एक ऐसा मामला है जहां बिना जरूरी डिज़ाइन किया जा रहा है, सी ++ उतना अच्छा है जितना कि यह है।