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


183

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

प्रोग्रामर अक्सर यह भ्रमित करते हैं कि "यह" एक पॉइंटर है, लेकिन एक संदर्भ नहीं है। एक और भ्रम यह है कि "हेलो" टाइप एसटीडी का क्यों नहीं है :: स्ट्रिंग लेकिन एक चार कांस्टेंस का मूल्यांकन करता है

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

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

क्या यह एक निरंतर संकेत है? - यशराज दिसम्बर २२'०१ ६:३५ बजे

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

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

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

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


कुछ और तर्क क्यों thisएक संदर्भ होने से समझ में आता है:

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

5
@paulm यह "हैक" वास्तव में क्या पूरा करेगा? thisहमेशा मूल्यांकन नहीं करता है true?
आइरिलिचट

6
@paulm मुझे नहीं लगता कि यह वास्तव में वैध C ++ है। किसी ऑब्जेक्ट पर अशक्त तरीके से अपरिभाषित व्यवहार के परिणामस्वरूप तरीकों को लागू करना।
antred

5
@ अंपुलम शायद यह कुछ मामलों में काम करता है, लेकिन कल्पना करें कि क्या विधि वायरल थी। बिना किसी ऑब्जेक्ट के वी-टेबल लुकअप कैसे किया जा सकता है?
जेसन Creighton

3
@paulm यदि आपने इसे उत्पादन कोड में देखा है, तो जहाज छोड़ दें! वह यूबी है।
ऐलिस

6
मैं बस इसे यहाँ छोड़ने जा रहा हूँ ... (MFC के afxwin2.inl से):_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
क्रिस्टोफर ऑल्स

जवाबों:


176

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

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


4
वैसे, किसी वस्तु का स्वयं के लिए संदर्भ प्राप्त करना भी अक्सर उपयोगी होता है। मैं कहूंगा कि यह एक अधिक सामान्य उपयोग है। वैसे भी, मुख्य कारण जैसा आपने कहा, संदर्भ तब मौजूद नहीं थे जब उन्होंने 'यह' सूचक बनाया।
jalf

20
और, अगर यह एक संदर्भ था, operator &तो कुछ भी उपयोगी करने के लिए अधिभार करना मुश्किल होगा । इस बात का पता लगाने के लिए कुछ विशेष वाक्यविन्यास करना होगा जो इससे नहीं गुजरेगा operator &
सर्वव्यापी

10
@conio - आप अगली बार जांचना चाहते हैं कि आप C ++ कंपाइलर के पास हैं! :) कुछ इस तरह से:int n = 5; int &r = n; int *p = &r; std::cout << *p;
डैनियल इयरविकर

14
@Omnifarious आप लिख सकता है &reinterpret_cast<char&>(this);अधिक भार के लिए वास्तविक पता पाने के लिए operator&(वास्तव में, इस तरह की क्या की है boost::addressofकरता है)।
जोहान्स स्काउब -

9
चूंकि यह वास्तव में thisअशक्त होने के लिए कोई मतलब नहीं है , यह मुझे लगता है कि एक संदर्भ वास्तव में अधिक उपयुक्त है।
3

114

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

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

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


2
हाँ, अन्य भाषाओं के साथ सुसंगतता के लिए स्वयं अच्छा होता, ओह अच्छी तरह से।
पायलट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.