c++ - समाजशास्त्र पेपर 2018




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

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

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

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

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

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

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

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

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

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

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

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

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

कुछ और तर्क this क्यों एक संदर्भ होने का अर्थ होगा:

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

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

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


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

9.3.2 / 1

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

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






c++-faq