2010-10-31 23 views
17

सी ++ में लिखे गए ट्यूटोरियल और कोड को पढ़ने पर, मैं अक्सर const कीवर्ड पर ठोकर खा जाता हूं।सी ++ "कॉन्स" कीवर्ड स्पष्टीकरण

मुझे लगता है कि वह ऐसा प्रयोग किया जाता है:

const int x = 5; 

मैं जानता हूँ कि इसका मतलब है कि कि x एक निरंतर परिवर्तनशील है और शायद केवल पढ़ने के लिए स्मृति में संग्रहीत।

लेकिन

void myfunc(const char x); 

और

int myfunc() const; 

क्या हैं?

+9

"स्थिर चर": यह कुछ हद तक विरोधाभासी है! ;) – Flinsch

+3

Obligatory C++ अक्सर पूछे जाने वाले प्रश्न लिंक: http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.10 –

+0

संभावित डुप्लिकेट [कैसे कॉन्स कीवर्ड सी में काम करता है] (http: // stackoverflow.com/questions/2812875/how-const-keyword-works-in-c) –

उत्तर

29
void myfunc(const char x); 

इसका मतलब है कि पैरामीटर x एक चार्ट है जिसका मूल्य फ़ंक्शन के अंदर बदला नहीं जा सकता है।

void myfunc(const char x) 
{ 
    char y = x; // OK 
    x = y;  // failure - x is `const` 
} 

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

int myfunc() const; 

यह गैर कानूनी है जब तक कि यह एक वर्ग घोषणा के अंदर है - const nonmember कार्यों के लिए इस्तेमाल नहीं किया जा सकता है - const सदस्य कार्यों में किसी भी वर्ग के सदस्य के संशोधन को रोकने के।

int myclass::myfunc() const 
{ 
    // do stuff that leaves members unchanged 
} 

आप विशिष्ट वर्ग के सदस्यों const सदस्य कार्यों में परिवर्तनीय होने की जरूरत है, तो आप उन्हें mutable घोषणा कर सकते हैं: इस मामले में परिभाषा की तरह कुछ होगा। एक उदाहरण lock_guard सदस्य होगा जो वर्ग के const और गैर-const सदस्य फ़ंक्शन थ्रेडसेफ बनाता है, लेकिन अपने आंतरिक ऑपरेशन के दौरान बदलना चाहिए।

+0

@ चार्ल्स, धन्यवाद - मैं संपादन कर रहा था जैसा कि आपने टिप्पणी की थी ... –

+0

इसका पूरा बिंदु कॉन्स्ट विधियों के उपयोग को सक्षम करने के लिए नहीं है, लेकिन किसी कॉन्स्ट ऑब्जेक्ट पर किसी भी तरीके को कॉल करने में सक्षम होने के लिए ... इसलिए उत्परिवर्तनीय सदस्य एक सदस्य नहीं है जो एक कॉन्स्ट विधि में बदल सकता है, यह एक ऐसा सदस्य है जिसे अन्यथा कॉन्स्ट ऑब्जेक्ट पर बदलने की अनुमति है। – nus

+0

@ufotds - सही - सामग्री को 'mutable'' न करें क्योंकि आपका कोड सदस्य कार्यों पर 'const' के अर्थ की गलतफहमी के माध्यम से संकलित नहीं होगा। –

0

दोनों के बीच का अंतर यह है कि पहले void(char) टाइप किया गया है और दूसरे में टाइप int()const है।

अंत में const के साथ ऐसा कोई फ़ंक्शन केवल एक वर्ग का सदस्य कार्य हो सकता है, और इसका मतलब है कि सदस्य फ़ंक्शन कक्षा मान (जो this संदर्भित करता है) को बाहर नहीं दिखाता है जैसा कि बाहर से देखा गया है कक्षा। कंपाइलर उस डिग्री की जांच करेगा, और एक कॉन्स सदस्य फ़ंक्शन में किसी क्लास सदस्य को सीधे लिखने के लिए संकलन समय त्रुटि में परिणाम देगा, और फ़ंक्शन सीधे केवल कॉन्स्ट सदस्य फ़ंक्शन को कॉल कर सकता है (विशेष निर्देश मौजूद हैं ताकि आप बता सकें कंपाइलर कि एक सदस्य लिखने से कक्षा के मूल्य को बाहर से नहीं बदला जाएगा। यह mutable कीवर्ड द्वारा किया जाता है)।

आपके द्वारा प्रस्तुत किए गए कार्यों में, एक प्रकार का पैरामीटर char const था। इस तरह के पैरामीटर को इसके फ़ंक्शन के अंदर बदला नहीं जा सकता है। हालांकि फ़ंक्शन के प्रकार पर इसका कोई प्रभाव नहीं पड़ता है, और फ़ंक्शन के कॉलर्स को कोई प्रभाव नहीं पड़ता है।

+0

हालांकि वे प्रकार निश्चित रूप से सही हैं, वे _very_ संभवतः नए शौक के लिए बेबले हैं। – sbi

1

यह:

void myfunc(const char x); 

आप मतलब है कि आप समारोह के अंदर x नहीं बदल सकते, यानी इस गैर कानूनी है:

void myfunc(const char x) { 
    x = ...; 
} 

जबकि:

int myfunc() const; 

केवल समझ में आता है, तो myfunc () एक वर्ग के अंदर एक विधि है; इसका मूल रूप से अर्थ यह है कि विधि क्लास इंस्टेंस को संशोधित नहीं कर सकती है (यानी example.myfunc() कॉल करने से पहले और बाद में उदाहरण की स्थिति समान होगी)।

0

शून्य myfunc(const char x) आपके उदाहरण में const int x = 5 के समान ही है: यह myfunc फ़ंक्शन के भीतर स्थानीय रूप से उपलब्ध स्थिर रूप से घोषित करता है। चूंकि यह स्थिर है क्योंकि इसका मूल्य बदला नहीं जा सकता है।

int myfunc() const कक्षा का सदस्य कार्य है। const इंगित करता है कि फ़ंक्शन उस वर्ग के उदाहरण को नहीं बदलेगा जिस पर फ़ंक्शन निष्पादित किया गया है। तो, फ़ंक्शन के भीतर, आप this->foo = 7 जैसे कुछ नहीं कर सकते हैं या अन्य फ़ंक्शन को कॉल नहीं कर सकते हैं।

5

पहला फ़ंक्शन उदाहरण अधिक या कम अर्थहीन है। अधिक दिलचस्प एक होगा:

void myfunc(const char *x); 

इस संकलक कि सामग्री *x की संशोधित नहीं किया जा जाएगा बताता है। यही कारण है कि myfunc() भीतर आप की तरह कुछ नहीं कर सकते, यह है:

strcpy(x, "foo"); 

दूसरे उदाहरण, एक सी ++ सदस्य समारोह पर, इसका मतलब है कि ऑब्जेक्ट की सामग्री कॉल द्वारा बदला नहीं जाएगा।

तो दिया:

class { 
    int x; 
    void myfunc() const; 
} 

someobj.myfunc() की तरह कुछ भी संशोधित करने की अनुमति नहीं है: एक चर पहचानकर्ता से पहले

x = 3; 
+0

पहला उदाहरण वास्तव में अधिक इष्टतम कोड उत्पन्न करने वाले कंपाइलर की सहायता कर सकता है, हालांकि अधिकांश आधुनिक कंपाइलर्स संभावित रूप से संशोधित होने पर उन्हें स्वयं को समझते हैं। –

+1

पहला उदाहरण भी आकस्मिक संशोधन को रोकता है। हालांकि यह कॉलर के परिप्रेक्ष्य से अप्रासंगिक है, लेकिन कभी-कभी हर पैरामीटर और स्थानीय चर 'कॉन्स्ट' घोषित करने में काफी मददगार होता है क्योंकि उन्हें संशोधित करने से गलतियों या खराब डिज़ाइन को इंगित किया जा सकता है। – Philipp

+0

भले ही यह अर्थहीन था (जो कि यह बिल्कुल नहीं है, मैं इस पर @ फिलिप के साथ हूं), आपको कम से कम _why_ समझाया जाना चाहिए। (लेकिन जब आपको बताया गया है कि यह गलत है तो इसे अभी परेशान न करें।) – sbi

1

, const इंगित करता है कि चर प्रारंभ किया जा सकता है और उसके बाद संशोधित नहीं किया।

कक्षा विधि नाम के बाद, const इंगित करता है कि विधि कक्षा के देखने योग्य राज्य को संशोधित नहीं करेगी। mutable कीवर्ड आंतरिक डेटा को संशोधित करने की अनुमति देता है।

पॉइंटर या संदर्भ चर से पहले, const इंगित करता है कि पहचानकर्ता का संदर्भ संदर्भित डेटा को संशोधित करने के लिए नहीं किया जाएगा, हालांकि इसे अन्य माध्यमों से बदला जा सकता है।

int * const pInt = &x; 
1

मैं एक बहुत अच्छा स्पष्टीकरण मिल गया है: http://duramecho.com/ComputerInformation/WhyHowCppConst.html

मूल रूप से सब भ्रम में निहित है

const int *pInt = &x; 

कॉन्स्ट भी संकेत मिलता है कि सूचक ही बदला नहीं जा सकता इस्तेमाल किया जा सकता कीवर्ड const के लिए अलग-अलग उपयोग केस। आप const कहां रखते हैं इसके आधार पर आप बताते हैं कि कुछ अपरिवर्तनीय होना चाहिए या कुछ और कुछ बदलने में सक्षम नहीं होना चाहिए। 'कुछ' एक चर या पॉइंटर या फ़ंक्शन/विधि हो सकता है, जिसे आप नहीं चाहते हैं कि यह ऑब्जेक्ट के कार्यों या सदस्य चर में पारित चर के मान को बदलने में सक्षम हो।

+1

यह सिर्फ Google शीर्ष खोज परिणाम है। – Yash

0

const क्वालीफायर का अर्थ है कि const के रूप में परिभाषित एक परिवर्तनीय/सूचक आपके प्रोग्राम द्वारा बदला नहीं जा सकता है और इसे या तो एक स्पष्ट प्रारंभिकरण या हार्डवेयर-निर्भर साधनों से इसका मान प्राप्त होगा।

पैरामीटर घोषणाओं में const के रूप में परिभाषित एक पॉइंटर, फ़ंक्शन कोड जो इंगित करता है उसे संशोधित नहीं करेगा। असल में, आप पॉइंटर का उपयोग कर सकते हैं और यह "केवल पढ़ने के लिए" के रूप में बहुत अधिक कार्य करता है।

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

void foo(const char *x) 
{ 
    while(*x) 
    { 
     if(*x==' ') cout << '-'; //printing - when a space is encountered 
     else cout << *x; 
     x++; 
    } 
} 

ऊपर समारोह ठीक है और किसी भी त्रुटि नहीं दिखाया जाएगा। लेकिन अगर foo में कोई चीज थी जो पारित स्ट्रिंग को बदल सकती है। एक समारोह कहें जो $ के साथ रिक्त स्थान को प्रतिस्थापित करता है। $ प्रिंट नहीं करें लेकिन इसे $ में बदल रहा है। कुछ इस तरह: -

void foo(const char *x) 
{ 
    while(*x) 
    { 
     if(*x==' ') *x = '$'; //printing - when a space is encountered 
     else cout << *x; 
     x++; 
    } 
} 

तो यह केवल पढ़ने के लिए स्मृति स्थान को अर्थात एक काम त्रुटि संकलन नहीं होगा।

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