2011-10-27 13 views
38

const "शीर्ष स्तर" क्वालीफायर पर सी ++ में क्या मतलब है?शीर्ष-स्तरीय कॉन्स क्वालीफायर क्या हैं?

और अन्य स्तर क्या हैं?

उदाहरण के लिए:

int const *i; 
int *const i; 
int const *const i; 
+3

उदाहरण हैं, कृपया? – bmargulies

+0

मुझे नहीं पता कि उदाहरणों से आपका क्या मतलब है लेकिन मैंने कुछ कॉन्स क्वालीफायर जोड़े जिन्हें मैं परिचित हूं। – user103214

+3

यह भी देखें [सी ++ 11 मानक में 'शीर्ष-स्तर सीवी-क्वालीफायर' की परिभाषा कहां है? (Http://stackoverflow.com/q/24676824/1708801) –

उत्तर

49

एक उच्च-स्तरीय स्थिरांक क्वालीफायर वस्तु ही प्रभावित करता है। अन्य केवल पॉइंटर्स और संदर्भों के साथ प्रासंगिक हैं। वे ऑब्जेक्ट कॉन्स नहीं बनाते हैं, और केवल पॉइंटर या संदर्भ का उपयोग करके पथ के माध्यम से संशोधन को रोकते हैं। इस प्रकार:

char x; 
char const* p = &x; 

यह शीर्ष-स्तरीय आधार नहीं है, और कोई भी वस्तु अपरिवर्तनीय नहीं है। अभिव्यक्ति *p का उपयोग x को संशोधित करने के लिए नहीं किया जा सकता है, लेकिन अन्य अभिव्यक्ति हो सकती है; x आधार नहीं है। उस मामले के लिए

*const_cast<char*>(p) = 't' 

कानूनी और अच्छी तरह से परिभाषित है।

लेकिन

char const x = 't'; 
char const* p = &x; 

इस बार, वहाँ x पर एक शीर्ष स्तर स्थिरांक है, इसलिए x अपरिवर्तनीय है। नहीं अभिव्यक्ति को बदलने की अनुमति है (भले ही const_cast उपयोग किया गया हो)। कंपाइलर केवल पढ़ने योग्य स्मृति में x डाल सकता है, और यह मान सकता है कि x का मान कभी भी नहीं बदलता है, भले ही अन्य कोड क्या कर सकता है।

सूचक उच्च-स्तरीय const देने के लिए, आप लिखते हैं:

char x = 't'; 
char *const p = &x; 

इस मामले में, px हमेशा के लिए की ओर इशारा करेगा; इस बदलने के लिए किसी भी प्रयास को अपरिभाषित व्यवहार है (और संकलक किसी अन्य कोड के केवल पढ़ने के लिए स्मृति में p, रख सकते हैं या लगता है कि *px को संदर्भित करता है, हो सकता है अथवा नहीं)।

+3

बहुत स्पष्ट, धन्यवाद :) – Seb

+6

एक अन्य बिंदु: जब लेखन लेखन तर्कों के शीर्ष-स्तरीय क्वालीफायरों को त्याग दिया जाता है। इसका मतलब है कि 'शून्य फू (चार कॉन्स)' और 'शून्य फू (चार)' एक ही कार्य हैं (और वास्तव में उन्हें अंतरण किया जा सकता है)। तर्क यह है कि चूंकि प्रतिलिपि द्वारा तर्क लिया जाता है, इसलिए कॉलर परवाह नहीं है कि प्रतिलिपि को संशोधित किया जा सकता है या नहीं, इसलिए यह उसके लिए पारदर्शी है। –

+7

@MatthieuM। अच्छा बिंदु, हालांकि कहा गया बिल्कुल सही नहीं है। शीर्ष-स्तरीय क्वालिफ़ायर को घोषणा में और फ़ंक्शन के प्रकार में अनदेखा किया जाता है। परिभाषा में, हालांकि, वे अभी भी कार्य के भीतर सामान्य के रूप में व्यवहार करते हैं। (शीर्ष स्तर के क्वालीफायरों को 'टाइपिड' और टेम्पलेट पैरामीटर द्वारा अनदेखा किया जाता है, जब पकड़ने के अपवादों का मिलान होता है, और शायद कुछ अन्य मामलों में मैं भूल गया हूं। व्यावहारिक रूप से, उनके पास गैर-वर्ग प्रकार के रिटर्न मानों पर भी कोई प्रभाव नहीं पड़ता है।) –

10

int *const i शीर्ष स्तर पर const डालता है, जबकि int const *i नहीं है।

पहला कहता है कि सूचक i स्वयं अपरिवर्तनीय है, जबकि दूसरा कहता है कि पॉइंटर इंगित करने वाली स्मृति अपरिवर्तनीय है।

जब भी const पहचानकर्ता के प्रकार से पहले या उसके बाद तुरंत दिखाई देता है, जिसे शीर्ष-स्तरीय क्वालीफायर माना जाता है।

+0

उत्कृष्ट और स्पष्ट उत्तर। अनुलेख 'int const * i' 'int int * i' के बराबर है (सभी निम्न-स्तरीय कॉन्स हैं)। मैं 'const * const i' (शीर्ष-स्तर) से अक्सर अपने कॉन्स स्तर को अलग करने के लिए' const int * i' (निम्न-स्तर) का उपयोग करता हूं। – dotslash

5

जिस तरह से यह मुझे समझाया गया था, यह देखते हुए:

[const] TYPE * [const] VARIABLE 

VARIABLE* या के माध्यम से एक लाइन खींचें के माध्यम से *VARIABLE

डेटा प्रकार प्रकार की को इंगित करने के लिए किया जाता है एकाधिक * एस

  1. यदि वहाँ एक को const* यह डेटा और डेटा बदला नहीं जा सकता पर लागू होता है की छोड़ दिया: *VARIABLE, आवंटित नहीं किया जा सकता है प्रारंभ
  2. पर छोड़कर यदि वहाँ करने के लिए एक constसही * यह VARIABLE और क्या VARIABLE अंक बदल करने के लिए नहीं किया जा सकता पर लागू होता है की: VARIABLE नहीं सौंपा जा सकता है, initiali पर छोड़कर zation

तो:

  |    left right 
int  *  i1; 
      |    no no  can change *i1 and i1 

int const *  i2;  
      |    yes no  cannot change *i2 but can change i2 

int  * const i3; 
      |    no yes can change *i3 but i3 cannot be changed 

int const * const i4; 
      |    yes yes cannot change *i4 or i4 
+0

'const' बाईं ओर बांधता है। जब तक बाईं ओर कुछ भी नहीं है, तो यह दाईं ओर बांधता है – sp2danny

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