दिलचस्प पोस्ट
जावा में एक मूल स्वैप फ़ंक्शन कैसे लिखें रेल 4 प्रामाणिकता टोकन सरल Jasperreport jrxml के साथ भी खाली पीडीएफ शुरुआत के लिए @classmethod और @staticmethod का अर्थ है? पायथन में सिवाय / सिवाय: आप अपवादों को ठीक से कैसे अनदेखा कर सकते हैं? मैं सभी छवियों को जेपीजी कैसे परिवर्तित कर सकता हूं? सशर्त अभिव्यक्ति का प्रकार निर्धारित नहीं किया जा सकता क्योंकि 'string' और 'System.DBNull' के बीच कोई अंतर्निहित रूपांतरण नहीं है एक ही मेज पर दो बार शामिल होने का सबसे अच्छा तरीका क्या है? क्या ऑनलाइन दलाल एपीआई प्रदान करते हैं? Winforms अनुप्रयोग में पासवर्ड कैसे स्टोर करें? Mysql / फजी खोज के लिए लेवेन्सशेटिन दूरी का कार्यान्वयन? ओपनसीवी में बीफ़डेड इमेज को बदलना जब भी मैं कोई नया प्रोजेक्ट तैयार करता हूं, तो एक्लिप्स स्वचालित रूप से ऐपकामपेट v7 लाइब्रेरी समर्थन क्यों जोड़ता है? / Proc / self / exe बिना वर्तमान निष्पादन योग्य पथ का पता लगाना Android वेबदृश्य एंकर लिंक (कूद लिंक) काम नहीं कर रहा है

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

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

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

Solutions Collecting From Web of "क्यों यह 'एक सूचक है और एक संदर्भ नहीं है?"

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

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

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

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

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

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

9.3.2 / 1

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

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

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

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

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