2013-06-17 5 views
33
struct Foo 
{ 
void f() 
{ 
// (*) 
} 
}; 

(*) के साथ चिह्नित रेखा में "यह" किस प्रकार का है?सी ++ में "यह" का प्रकार?

क्या यह कॉन्स फू * या Foo * है?

+5

है यह शायद 'फू * const' –

+6

@TomKnapen कोई यह नहीं है: http://stackoverflow.com/questions/16102143/c-the-this-pointer-is-always-const/ –

+1

यदि यह 'कॉन्स फू * था, तो इसका मतलब यह होगा कि आप सदस्य को बदल नहीं सकते हैं वस्तु में दंगे (स्पष्ट रूप से बताए गए 'यह->' होने वाली सभी पहुंचों की कल्पना करें।यह तब तक इरादा नहीं है जब तक कि आप सदस्य कार्य को स्वयं 'कॉन्स्ट' घोषित न करें। – Steve314

उत्तर

71

n3376 9.3.2/1

एक गैर स्थैतिक के शरीर में (9.3) के सदस्य समारोह, कीवर्ड यह एक prvalue अभिव्यक्ति जिसका मूल्य के लिए वस्तु का पता है जो समारोह कहा जाता है।

के सदस्य फ़ंक्शन में इसका प्रकार एक्स क्लास एक्स * है। यदि सदस्य फ़ंक्शन को कॉन्स घोषित किया जाता है, तो इसका प्रकार कॉन्स एक्स * है, यदि सदस्य फ़ंक्शन अस्थिर घोषित किया गया है, तो इसका प्रकार अस्थिर एक्स * है, और यदि सदस्य फ़ंक्शन कॉन्स्ट अस्थिर घोषित किया गया है, तो इसका प्रकार कॉन्स अस्थिर एक्स * है।

+2

इससे मुझे आश्चर्य होता है कि उन्होंने 'यह' एक कॉन्स्ट पॉइंटर क्यों नहीं बनाया ... कोई विशेष कारण? –

+17

@TomKnapen 'यह' एक आर-वैल्यू है, इसलिए आप इसे किसी भी तरह संशोधित नहीं कर सकते हैं। अधिकांश उद्देश्यों और उद्देश्यों के लिए, यह 'एक्स * कॉन्स' के रूप में व्यवहार करता है। लेकिन आप इसका पता नहीं ले सकते, उदाहरण के लिए। – Angew

+3

@TomKnapen: नहीं। अंतराल में, यह एक संदर्भ होना चाहिए, सूचक नहीं होना चाहिए। लेकिन 'यह' संदर्भों की भविष्यवाणी करता है, और मौजूदा कोड को तोड़ने की सी ++ परंपरा वास्तव में पुरानी नहीं है। – MSalters

-5

this वर्तमान वस्तु को संदर्भित करता है। सी ++ में this का प्रकार Foo *const है।

5

f अंदर, this टाइप Foo * क्योंकि f एक const सदस्य समारोह नहीं है।

आप ऑब्जेक्ट पर f पर कॉल नहीं कर सकते हैं। निम्नलिखित गलत है:

const Foo obj; 
obj.f(); 

इसका कारण यह है अंदर Foo::f ठीक है, this सूचक Foo * बजाय const Foo * है, और इसलिए समारोह कॉल एक सूचक रूपांतरण जो एक क्वालीफायर को छोड़ देता है मांग करती है।

this पॉइंटर स्वयं एक चर नहीं है। यह असाइन करने योग्य नहीं है, लेकिन const क्वालीफायर की वजह से नहीं। Foo *const this जैसे दायरे में कोई घोषणा नहीं है। एक this अभिव्यक्ति भाषा के नियम के रूप में बस एक आभासी नहीं है।

this पॉइंटर &obj से बहुत अलग नहीं है।

+1

पर नोट देखें मानकों के उद्धरण की तुलना में एक अच्छा, अधिक शैक्षणिक स्पष्टीकरण। +1 – StellarVortex

2

इसका प्रकार सदस्य फ़ंक्शन पर निर्भर करता है।

एक दसवीं कक्षा के लिए उदाहरण के लिए, यदि सदस्य कार्यों

1) स्थिरांक है, तो इस प्रकार के स्थिरांक एक्स *

2) अस्थिर है, तो यह है अस्थिर एक्स * आदि की है

अन्यथा यह एक्स *

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