2010-07-14 16 views
45

उदाहरण के लिए,const int = int const?

int const x = 3; 

मान्य कोड है?

यदि हां, तो यह

const int x = 3; 

रूप में एक ही मतलब है?

+0

कम से कम MSVC – Andrey

+1

में क्या संकलक कहता है? –

+12

@ हैमिश: कुछ कंपाइलर्स अमान्य कोड के सभी प्रकार स्वीकार करते हैं; यह सुनिश्चित करने का एकमात्र तरीका है कि कुछ मान्य है मानक में देखना, या पूछना। –

उत्तर

87

वे दोनों वैध कोड हैं और वे दोनों समकक्ष हैं। एक सूचक प्रकार के लिए हालांकि वे दोनों वैध कोड हैं लेकिन समकक्ष नहीं हैं।

की घोषणा: 2 ints जो लगातार कर रहे हैं:

const int *p = &someInt; 

एक सूचक है जो कुछ और करने के लिए बात करने के लिए नहीं बदला जा सकता घोषित करती है:

int const x1 = 3; 
const int x2 = 3; 

एक सूचक जिसका डेटा सूचक के माध्यम से बदला नहीं जा सकता घोषित करती है:

int * const p = &someInt; 
+2

और 'const int * const p = और someInt; 'आपको एक सूचक मिलेगा जिसे उस मान में बदला नहीं जा सकता जिसे बदला नहीं जा सकता है, अगर मुझे गलत नहीं लगता है। – JAB

+0

@JAB: हां यह आपको एक पॉइंटर देगा जो उस पॉइंटर के माध्यम से पॉइंटर के अंदर नहीं बदला जा सकता डेटा रखने के अलावा बदला नहीं जा सकता है। –

+58

यहां पैटर्न स्पष्ट हो जाता है यदि परिभाषा ** रिवर्स ** में पढ़ी जाती है। उदाहरण के लिए: '[const int *]' = एक सूचक ('*') 'int' पर 'const' है। 'int [int * const]' = '' const 'सूचक ('*') को' int 'पर। – stakx

15

हाँ, यह वही है। हालांकि, पॉइंटर्स में अंतर है। मेरा मतलब है:

int a; 

// these two are the same: pointed value mustn't be changed 
// i.e. pointer to const value 
const int * p1 = &a; 
int const * p2 = &a; 

// something else -- pointed value may be modified, but pointer cannot point 
// anywhere else i.e. const pointer to value 
int * const p3 = &a; 

// ...and combination of the two above 
// i.e. const pointer to const value 
const int * const p4 = &a; 
+1

यह सबसे पूरा उत्तर है। – anthropomorphic

3

यह अर्थ और वैधता में समान है।

जहां तक ​​मुझे पता है, जब भी पॉइंटर शामिल होता है तो केवल जटिल हो जाता है।

int const * x; 
int * const x; 

अलग हैं।

int const * x; 
const int * x; 

समान हैं।

28

हां, वे वही हैं। सी ++ में नियम अनिवार्य रूप से है कि const इसके बाईं ओर दिए गए प्रकार पर लागू होता है। हालांकि, एक अपवाद है कि यदि आप इसे घोषणा के चरम बाईं ओर रखते हैं, तो यह प्रकार के पहले भाग पर लागू होता है।

उदाहरण के लिए int const * में आपके पास निरंतर पूर्णांक के लिए सूचक है। int * const में आपके पास एक पूर्णांक के लिए निरंतर सूचक है। आप पॉइंटर्स को पॉइंटर पर एक्सट्रापोलेट कर सकते हैं, और अंग्रेजी भ्रमित हो सकती है लेकिन सिद्धांत समान है।

दूसरे पर एक करने की योग्यता पर एक और डिक्यूशन के लिए, इस विषय पर my question देखें। यदि आप उत्सुक हैं कि अधिकांश लोग अपवाद का उपयोग क्यों करते हैं, तो स्ट्रॉस्ट्रप के this FAQ entry सहायक हो सकते हैं।

+3

बिल्कुल मैं क्या सोच रहा था। 'const int x' असाधारण रूप है। 'int const x' 'int * const x' के समान पैटर्न को फिट करता है। यदि आपको लगातार int के लिए निरंतर सूचक की आवश्यकता है, तो मैं आमतौर पर 'const int * const' की बजाय स्थिरता के लिए 'int const * const' के रूप में लिखता हूं। – Cogwheel

+0

@ कोगव्हील - निश्चित रूप से। एक बार जब आप चरम बाएं को 'const' डालने का "सामान्य" रूप महसूस करते हैं तो वास्तव में एक असाधारण मामले का उपयोग कर रहा है, सवाल उठता है कि वास्तव में लंबे समय तक कोड को स्पष्ट रूप से किस तरह से स्पष्ट करता है। इसलिए मेरा प्रश्न http://stackoverflow.com/questions/988069/in-c-is-const-after-type-id- अस्वीकार्य –

+0

@ टी.ई.डी. ** सी ++ में नियम अनिवार्य रूप से है कि कॉन्स इसके बायीं ओर प्रकार पर लागू होता है। ** क्या ज्ञात प्रोग्रामिंग गुरु या सिर्फ समझा जाने वाली चीज़ के द्वारा इसका कोई उद्धरण है। "कॉन्स int * पी 1" में भी। कॉन्स के बाईं ओर कुछ भी नहीं है। इस परिदृश्य में नियम कैसे लागू करें। –

7

से "प्रभावी सी ++" आइटम 21

char *p    = "data"; //non-const pointer, non-const data 
const char *p  = "data"; //non-const pointer, const data 
char * const p  = "data"; //const pointer, non-const data 
const char * const p = "data"; //const pointer, const data 
+0

आपके दूसरे आइटम पर टिप्पणी गलत है, इसे गैर-कॉन्स्ट पॉइंटर, कॉन्स्ट डेटा पढ़ना चाहिए। – Thomas

+0

@ थॉमस बहुत धीमा। ;) ठीक कर दिया। यह देखते हुए कि यह पुस्तक से एक सटीक उद्धरण है, यह ठीक होना चाहिए। – Bart

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