const
"शीर्ष स्तर" क्वालीफायर पर सी ++ में क्या मतलब है?शीर्ष-स्तरीय कॉन्स क्वालीफायर क्या हैं?
और अन्य स्तर क्या हैं?
उदाहरण के लिए:
int const *i;
int *const i;
int const *const i;
const
"शीर्ष स्तर" क्वालीफायर पर सी ++ में क्या मतलब है?शीर्ष-स्तरीय कॉन्स क्वालीफायर क्या हैं?
और अन्य स्तर क्या हैं?
उदाहरण के लिए:
int const *i;
int *const i;
int const *const i;
एक उच्च-स्तरीय स्थिरांक क्वालीफायर वस्तु ही प्रभावित करता है। अन्य केवल पॉइंटर्स और संदर्भों के साथ प्रासंगिक हैं। वे ऑब्जेक्ट कॉन्स नहीं बनाते हैं, और केवल पॉइंटर या संदर्भ का उपयोग करके पथ के माध्यम से संशोधन को रोकते हैं। इस प्रकार:
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;
इस मामले में, p
x
हमेशा के लिए की ओर इशारा करेगा; इस बदलने के लिए किसी भी प्रयास को अपरिभाषित व्यवहार है (और संकलक किसी अन्य कोड के केवल पढ़ने के लिए स्मृति में p
, रख सकते हैं या लगता है कि *p
x
को संदर्भित करता है, हो सकता है अथवा नहीं)।
बहुत स्पष्ट, धन्यवाद :) – Seb
एक अन्य बिंदु: जब लेखन लेखन तर्कों के शीर्ष-स्तरीय क्वालीफायरों को त्याग दिया जाता है। इसका मतलब है कि 'शून्य फू (चार कॉन्स)' और 'शून्य फू (चार)' एक ही कार्य हैं (और वास्तव में उन्हें अंतरण किया जा सकता है)। तर्क यह है कि चूंकि प्रतिलिपि द्वारा तर्क लिया जाता है, इसलिए कॉलर परवाह नहीं है कि प्रतिलिपि को संशोधित किया जा सकता है या नहीं, इसलिए यह उसके लिए पारदर्शी है। –
@MatthieuM। अच्छा बिंदु, हालांकि कहा गया बिल्कुल सही नहीं है। शीर्ष-स्तरीय क्वालिफ़ायर को घोषणा में और फ़ंक्शन के प्रकार में अनदेखा किया जाता है। परिभाषा में, हालांकि, वे अभी भी कार्य के भीतर सामान्य के रूप में व्यवहार करते हैं। (शीर्ष स्तर के क्वालीफायरों को 'टाइपिड' और टेम्पलेट पैरामीटर द्वारा अनदेखा किया जाता है, जब पकड़ने के अपवादों का मिलान होता है, और शायद कुछ अन्य मामलों में मैं भूल गया हूं। व्यावहारिक रूप से, उनके पास गैर-वर्ग प्रकार के रिटर्न मानों पर भी कोई प्रभाव नहीं पड़ता है।) –
int *const i
शीर्ष स्तर पर const
डालता है, जबकि int const *i
नहीं है।
पहला कहता है कि सूचक i
स्वयं अपरिवर्तनीय है, जबकि दूसरा कहता है कि पॉइंटर इंगित करने वाली स्मृति अपरिवर्तनीय है।
जब भी const
पहचानकर्ता के प्रकार से पहले या उसके बाद तुरंत दिखाई देता है, जिसे शीर्ष-स्तरीय क्वालीफायर माना जाता है।
उत्कृष्ट और स्पष्ट उत्तर। अनुलेख 'int const * i' 'int int * i' के बराबर है (सभी निम्न-स्तरीय कॉन्स हैं)। मैं 'const * const i' (शीर्ष-स्तर) से अक्सर अपने कॉन्स स्तर को अलग करने के लिए' const int * i' (निम्न-स्तर) का उपयोग करता हूं। – dotslash
जिस तरह से यह मुझे समझाया गया था, यह देखते हुए:
[const] TYPE * [const] VARIABLE
VARIABLE*
या के माध्यम से एक लाइन खींचें के माध्यम से *VARIABLE
डेटा प्रकार प्रकार की को इंगित करने के लिए किया जाता है एकाधिक *
एस
const
*
यह डेटा और डेटा बदला नहीं जा सकता पर लागू होता है की छोड़ दिया: *VARIABLE
, आवंटित नहीं किया जा सकता है प्रारंभ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
'const' बाईं ओर बांधता है। जब तक बाईं ओर कुछ भी नहीं है, तो यह दाईं ओर बांधता है – sp2danny
उदाहरण हैं, कृपया? – bmargulies
मुझे नहीं पता कि उदाहरणों से आपका क्या मतलब है लेकिन मैंने कुछ कॉन्स क्वालीफायर जोड़े जिन्हें मैं परिचित हूं। – user103214
यह भी देखें [सी ++ 11 मानक में 'शीर्ष-स्तर सीवी-क्वालीफायर' की परिभाषा कहां है? (Http://stackoverflow.com/q/24676824/1708801) –