2012-05-23 9 views
6

के बीच अंतर मैं सी ++ में फ़ंक्शन घोषणा पर विभिन्न स्थानों के बीच अंतर के चारों ओर अपने सिर को पाने के लिए संघर्ष कर रहा हूं।सी ++ कॉन्स पोजीशनिंग

क्या शुरुआत में स्थिरांक के बीच अंतर है: की तरह अंत में

const int MyClass::showName(string id){ 
... 
} 

और स्थिरांक:

int MyClass::showName(string id) const{ 
... 
} 

इसके अलावा, दोनों शुरुआत में और कम से स्थिरांक होने का नतीजा क्या है इस तरह अंत:

const int MyClass::showName(string id) const{ 
... 
} 
+0

संबंधित प्रश्न [यहां] (http://stackoverflow.com/questions/10368294/const-at-the-end-of-function-declaration-in-c/) – juanchopanza

उत्तर

18

const int MyClass::showName(string id) रिटर्न एक const int वस्तु। तो कॉलिंग कोड लौटा int बदल नहीं सकता है। यदि कॉलिंग कोड const int a = m.showName("id"); a = 10; जैसा है तो इसे एक कंपाइलर त्रुटि के रूप में चिह्नित किया जाएगा। हालांकि, जैसा कि नीचे @ डेविड हेफरनन द्वारा नोट किया गया है, क्योंकि पूर्णांक प्रतिलिपि द्वारा प्रतिलिपि वापस लौटाया जाता है, कॉलिंग कोड const int का उपयोग करने के लिए बाध्य नहीं है। यह int को रिटर्न प्रकार के रूप में बहुत अच्छी तरह से घोषित कर सकता है और इसे संशोधित कर सकता है। चूंकि ऑब्जेक्ट प्रतिलिपि द्वारा वापस किया जाता है, इसलिए रिटर्न प्रकार को const int के रूप में घोषित करने के लिए यह अधिक समझ में नहीं आता है।

int MyClass::showName(string id) const बताता है कि विधि showName एक const सदस्य फ़ंक्शन है। एक कॉन्स सदस्य फ़ंक्शन वह है जो कक्षा के किसी भी सदस्य चर को संशोधित नहीं करता है (जब तक उन्हें mutable के रूप में चिह्नित नहीं किया जाता है)। तो यदि आपके पास MyClass वर्ग में सदस्य चर int m_a है और यदि आप showName के अंदर करने का प्रयास करते हैं तो आपको एक कंपाइलर त्रुटि मिल जाएगी।

तीसरा उपरोक्त दो मामलों का संयोजन है।

+0

आपके स्पष्टीकरण के लिए बहुत बहुत धन्यवाद :) मैं इसे अब समझता हूं! – user1055650

+3

पहला पैराग्राफ स्पॉट पर काफी हिट नहीं करता है। एक कॉन्स रिटर्न वैल्यू आपको अपने वैरिएबल को घोषित करने के लिए मजबूर नहीं करता है जिसे रिटर्न वैल्यू को कॉन्स के रूप में असाइन किया जाता है। आप समान रूप से 'int a = m.showName (..) लिख सकते हैं; '। और फिर आप खुशी से 'ए' संशोधित कर सकते हैं। –

10
  1. टी वह वापसी मूल्य से जुड़ा const वापसी मूल्य पर लागू होता है। चूंकि वापसी मूल्य की प्रतिलिपि बनाई गई है, यह एक निर्बाध घोषणा है और इससे कोई फर्क नहीं पड़ता कि आप इसे शामिल करते हैं या नहीं।
  2. पैरामीटर सूची के बाद const का अर्थ है कि फ़ंक्शन उस ऑब्जेक्ट की किसी भी स्थिति को संशोधित नहीं करता है जिसे म्यूटेबल के रूप में चिह्नित नहीं किया गया है। यह एक कॉन्स सदस्य फ़ंक्शन है और यदि आपके पास कोई कॉन्स्ट ऑब्जेक्ट है तो कंपाइलर आपको कॉन्स्ट ऑब्जेक्ट पर गैर-कॉन्स्ट सदस्य फ़ंक्शन कॉल करने की अनुमति नहीं देगा।

const के इन दो का उपयोग करता है के बीच कोई बातचीत नहीं है - वे पूरी तरह से स्वतंत्र निर्माणों हैं

+0

धन्यवाद, मैं प्राप्त करने की कोशिश कर रहा हूं थोड़ी देर के लिए मेरे सिर मेरे चारों ओर! – user1055650

4

अंतर यह है कि const विभिन्न चीजों पर लागू होता है।

यह कहता है कि showName स्थिर int मान देता है - जो अपरिवर्तनीय है। बेशक int मूल्य से वापस आ गया है const की उपस्थिति यहां कोई भूमिका निभाती नहीं है।

const int MyClass::showName(string id) 

और यह कहा गया है कि showNameMyClass के प्रत्यक्ष राज्य को संशोधित नहीं करता है (तकनीकी रूप से: यह किसी भी सदस्य है कि mutable घोषित नहीं किया गया है संशोधित नहीं करता है), और इसलिए आप प्रकार const MyClass के एक मूल्य पर कॉल करने के लिए अनुमति दी जाती है ।

int MyClass::showName(string id) const 

यदि आप const एस दोनों का उपयोग करते हैं तो दोनों उपर्युक्त लागू होते हैं।

0

इस तरह के प्रश्न डैन सैक्स की सलाह का पालन करने के मेरे संकल्प को मजबूत करते हैं जैसा कि "गुरु के साथ बातचीत" लेख में उल्लिखित है: http://www.drdobbs.com/conversationsa-midsummer-nights-madness/184403835

विशेष रूप से यह इस बात से संबंधित है कि कॉन्स्ट प्लेसमेंट चीजों को कैसे बदलता है। (*) मुझे एहसास है कि मुझे const int ... से int const ... पर लिखने से किसी को भी परिवर्तित करने की संभावना नहीं है, लेकिन कहा जाता है कि, बाद में ऐसा करने का एक कारण है।

(*) एक नोट को शामिल करते हुए कि शुरूआत में प्रकार की घोषणा के साथ कॉन्स को स्वैप करना एक ऐसा परिवर्तन है जिसका कोई प्रभाव नहीं पड़ता है।

यह बहुत आसान पठनीयता के लिए बनाता है, क्योंकि const शब्द के किसी भी उदाहरण के लिए, इसके बाईं ओर सबकुछ उस प्रकार का है जो कि स्थिर है, और दाईं ओर सबकुछ वास्तव में है।

की तरह एक घोषणा पर विचार करें:

int const * * const pointerToPointer; 

पहले const कहा गया है कि सूचक श्रृंखला के अंत में पूर्णांक स्थिरांक हैं, और वे * * const pointerToPointer में पाया जा रहे हैं। इस बीच दूसरा एक कहता है कि टाइप पॉइंटर का पॉइंटर को कॉन्स्ट int में भी इंगित करना है और यह ऑब्जेक्ट pointerToPointer है।

ओपी के मामले में:

int const MyClass::showName(string id){ 
... 
} 

क्या स्थिरांक पूर्णांक है, और क्या स्थिरांक है समारोह से वापसी मान है के प्रकार।

इस बीच:

int MyClass::showName(string id) const { 
... 
} 

यहाँ स्थिरांक है के प्रकार के समारोह (स्ट्रिंग) लौटने पूर्णांक है, और क्या स्थिरांक है समारोह में ही है, यानी समारोह निकाय है।