2009-12-02 26 views
6

होमवर्क के रूप में लेबल किया गया क्योंकि यह मध्यस्थ पर एक प्रश्न था, मैंने लिखा था कि मुझे इसका जवाब समझ में नहीं आया है। मैं निम्नलिखित बयान में प्रत्येक स्थिरांक के प्रयोजन की व्याख्या करने के लिए कहा गया था:कॉन्स शुद्धता: कॉन्स चार कॉन्स * कॉन्स गेटनाम कॉन्स (// सामान);

const char const * const GetName() const { return m_name; }; 

तो, इन consts से प्रत्येक के लिए विवरण क्या है?

+3

कोड शायद अलग था, जैसा कि आपने पोस्ट किया है वह गलत है। यह शायद 'कक्षा X {const char * const getName() const {return m_name; की रेखा में कुछ था; } ... ' –

+0

रुको, क्या आपने मिडटरम लिखा था? – tster

+2

'कॉन्स चार कॉन्स 'में डबल कॉन्स सी 99 में मान्य है, लेकिन यह सी ++ में मान्य नहीं है। केवल एक कॉन्स की अनुमति है, लेकिन जिसे आप हटाते हैं, इससे कोई फर्क नहीं पड़ता। –

उत्तर

6

उन्हें दाएं से ले जाएं। ; से पहले एक ग्राहक को बताता है कि यह एक डिज़ाइन स्तर का आधार है यानी यह वस्तु की स्थिति को परिवर्तित नहीं करता है। (केवल पढ़ने के लिए विधि के रूप में इस के बारे में सोचो।)

ठीक है, अब वापसी मान:

const char const *const 

यह ठीक करने के लिए एक निरंतर सूचक है ... यहाँ हम बूम जाना! आपके पास एक अतिरिक्त const है - एक वाक्यविन्यास त्रुटि। निम्नलिखित समकक्ष हैं: const T या T const। यदि आप const निकालते हैं तो आपको निरंतर वर्णों के लिए निरंतर सूचक मिलता है। क्या उससे मदद हुई?

+0

स्पष्टीकरण के लिए, आपके उदाहरण में टी char है, char * नहीं। तो इसे एक साथ रखना: कॉन्स char * const char const const * const के बराबर है। – Marcin

+0

यह फ्लैट आउट काम नहीं करेगा? मेरा प्रोफेसर एक स्नीकी आदमी है, जाहिर है .. –

+0

लगातार characeterS या चरित्र के लिए निरंतर सूचक? –

2

आपके पास वाक्य रचनात्मक रूप से अनुमत होने की तुलना में एक और कॉन्स है, वह कोड संकलित नहीं होगा। "Char" के बाद और "*" से पहले "const" को हटा दें। इसके अलावा, अंतिम कॉन्स फंक्शन बॉडी से पहले आना चाहिए। यह इस तरह की चीजों को दाएं से बाएं पढ़ने में मदद करता है।

const char * const GetName() const { return m_name; }; 

आप एक स्थिरांक समारोह (यानी, वे समारोह वर्ग की स्थिति में परिवर्तन नहीं करता है।) है, जो एक स्थिरांक चार करने के लिए एक स्थिरांक सूचक रिटर्न दिया है।

+0

अंतिम कॉन्स को विधि निकाय के समक्ष भी स्थानांतरित किया जाना चाहिए, और सटीक होना चाहिए कि यह एक कार्य नहीं हो सकता है, बल्कि एक विधि हो सकता है। –

+0

@dribeas, यह एक समारोह है। विधि C++ में मौजूद नहीं है। –

+0

हां, आप शरीर के बारे में सही हैं, लेकिन विधि बनाम फ़ंक्शन कथन के बारे में नहीं। –

0

पिछले स्थिरांक: एक निरंतर सूचक

  • यह (यानी जगह यह:

    • समारोह वर्ग

    एक की साधारण सैनिक बदल नहीं करता है पिछले स्थिरांक के बाद अंक स्थिर है)

दूसरा कॉन्स:

  • फ़ंक्शन एक कॉन्स char (यानी।

    • कोई विचार: चार की सामग्री

    पहले स्थिर है)?

तो पूरा होने के लिए: समारोह एक निरंतर चार (हमेशा एक ही सामग्री) के लिए एक निरंतर सूचक (हमेशा एक ही स्थान) देता है और समारोह वर्ग की राज्य संशोधित नहीं करता है।

+0

एक कॉन्स विधि कक्षा के किसी भी सदस्य को नहीं बदल सकती है, न ही किसी भी गैर-कॉन्स्टेंस विधियों को कॉल कर सकती है। – quamrana

+0

@quamrana: एक कॉन्स विधि स्थिर या परिवर्तनीय डेटा सदस्यों को बदल सकती है। –

+0

@ जेरी: आप सही हैं। मुझे फिर से वाक्यांश दें: एक कॉन्स विधि किसी भी सार्वजनिक, संरक्षित या निजी सदस्यों को तब तक नहीं बदल सकती जब तक कि वे स्थिर या परिवर्तनीय न हों। – quamrana

0

कॉन्स (1) चार कॉन्स (2) * कॉन्स GetName() {वापसी m_name; } कॉन्स (3);

कॉन्स char * const परिणाम = aaa।GetName();

3 - कॉन्स्ट विधि, सदस्यों को बदलने की अनुमति नहीं है और न ही किसी गैर-कॉन्स्टी विधियों को कॉल करें।

1 - सूचक के अंदर संशोधित करने के लिए, की अनुमति नहीं है यानी * परिणाम = ..

2 - अर्थात परिणाम सूचक को स्थानांतरित करने की अनुमति नहीं है = शून्य

2

(1) स्थिरांक चार (2) कॉन्स * (3) कॉन्स GetName() {वापसी m_name; } (4) कॉन्स;

  1. चार सरणी की सामग्री स्थिर है। जब आप ऑब्जेक्ट सदस्य के सूचक को वापस करते हैं तो यह अच्छा होता है। चूंकि आप तीसरे पक्ष के लिए अपने सदस्य को पॉइंटर देते हैं, इसलिए आप इसे बाहर से बदलना चाहते हैं।
  2. इस फ़ॉर्म का उपयोग अक्सर और अनिवार्य रूप से नहीं किया जाता है (1)
  3. हमारे सूचक को चार सरणी का आधार है, इसलिए आप पॉइंटर पॉइंट्स को भी बदल नहीं सकते हैं।
  4. यह GetName() को अपने आप में अर्हता प्राप्त करता है, जिसका अर्थ है कि विधि इस प्रकार कक्षा को भी परिवर्तित नहीं करती है। इस प्रकार इसे केवल इस प्रकार के कॉन्स ऑब्जेक्ट के लिए बुलाया जा सकता है। यह फ़ॉर्म आमतौर पर GetName (...) const के रूप में उपयोग किया जाता है।

जैसा कि पहले ही करने के लिए "याद" यह यह सही से पढ़ा छोड़ दिया करने के लिए चाल एक और जवाब में बताया गया:

  • स्थिरांक टी * - सूचक const करने के लिए टी
  • टी * स्थिरांक - करने के लिए स्थिरांक सूचक टी
+1

गलत: (1) और (2) बराबर हैं। यही है, 'कॉन्स टी' और 'टी कॉन्स' वही हैं। दूसरी तरफ 'टी कॉन्स *' और 'टी * कॉन्स' अलग हैं, एक टी को स्थिर के रूप में चिह्नित करता है, दूसरा पॉइंटर स्थिर के रूप में चिह्नित करता है। –

+0

अप्स, आप सही हैं, लौटे पॉइंटर को अप्रचलित बनाने की अर्थहीनता को इंगित करने के लिए – dimba

1

संपादित करें: ऐसा लगता है कि मैंने कोड को गलत तरीके से चिपकाया है, या इसे सही होने के मूल उत्तर में संपादित किया गया था। किसी भी मामले में मैं नीचे दिए गए उत्तर को संरक्षित कर रहा हूं जैसे कि कोड गलत था।

"ComeauTest.c", line 4: error: type qualifier specified more than once
const char const * const GetName() { return m_name; } const; ^

"ComeauTest.c", line 4: warning: type qualifier on return type is meaningless const char const * const GetName() { return m_name; } const; ^

"ComeauTest.c", line 4: error: declaration does not declare anything const char const * const GetName() { return m_name; } const;

क्या इसका मतलब यह है कि आपके बयान विकृत है है:

Comeau ऑनलाइन संकलक इन परिणाम देता है।

const char const * const GetName() { return m_name; } const; 

पहला और दूसरा आधार एक ही चीज़ का मतलब है। आप एक ही क्वालीफायर को एक से अधिक बार निर्दिष्ट नहीं कर सकते हैं इसलिए कोड में संकलन के लिए इनमें से एक को हटा देना होगा। इन consts दोनों कि मूल्यों, करने के लिए द्वारा getName द्वारा दिया सूचक बदला नहीं जा सकता इशारा किया इस अमान्य तरह कोड बनाने निर्दिष्ट करें:

const char* name = c.GetName(); 
name[0] = 'a'; 

तीसरे स्थिरांक निर्दिष्ट करता है कि सूचक getName द्वारा दिया() ही बदला नहीं जा सकता, लेकिन जैसा कि कमौ बताते हैं, यह वापसी मूल्य पर कुछ भी पूरा नहीं करता है क्योंकि वापसी मूल्य पॉइंटर की बजाय सूचक की एक प्रति है, और इसे गैर-कॉन्स्ट पॉइंटर को असाइन किया जा सकता है।

चौथे स्थिरांक गलत स्थान पर है, तो वह ऐसा getName और समारोह शरीर के बीच होना चाहिए:

const char* GetName() const { return m.name; } 

यह स्थिरांक निर्दिष्ट करता है कि वर्ग का कोई भी सदस्य getName के निष्पादन के दौरान संशोधित किया जाएगा।यह मानते हुए कि getName वर्ग व्यक्ति के एक सदस्य, इस कोड को अनुमति दी जाएगी:

const Person& p; 
p.GetName(); 

इस स्थिरांक के बिना, ऊपर कोड विफल हो जाएगा।

+0

+1 को सही किया गया है। जीसीसी भी इसके बारे में चेतावनी देता है (यदि आप चेतावनियों को त्रुटियों के रूप में देखते हैं तो कोड अभी भी संकलित नहीं होगा :))। यह जानना महत्वपूर्ण है कि इन का मतलब क्या है, लेकिन एक समारोह का रिटर्न प्रकार प्रदर्शन के लिए एक दुर्भाग्यपूर्ण विकल्प प्रतीत होता है। – UncleBens

0

को देखते हुए:

const char const * const GetName() const { return m_name; }; 

पहले और दूसरे स्थिरांक के बराबर हैं, लेकिन उनमें से केवल एक ही अनुमति दी है - यानी आप से पहले या प्रकार (char इस मामले में) के बाद const रख सकते हैं, लेकिन केवल एक या दूसरा, दोनों नहीं। हालांकि, हालांकि, कहता है कि सूचक द्वारा इंगित वर्णों को लिखा नहीं जा सकता है।

'*' के बाद const का अर्थ है कि फ़ंक्शन द्वारा लौटाए गए पॉइंटर को स्वयं संशोधित नहीं किया जा सकता है। यह किसी भी प्रकार के रिटर्न प्रकार पर शायद ही कभी देखा जाता है - जो आप लौट रहे हैं वह एक मान है, जिसे किसी भी मामले में संशोधित नहीं किया जा सकता है (यह आमतौर पर कुछ चर के लिए असाइन किया जाता है)। हालांकि, यह अन्य संदर्भों में सार्थक हो सकता है।

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

1

यह संभव है कि आप दूसरे कॉन्स कीवर्ड से पहले "*" प्रतीक चूक गए।

const char * const * const GetName() const { return m_name; }; 

तो इसका मतलब है कि फ़ंक्शन निरंतर वर्णक को लगातार सूचक के लिए निरंतर सूचक देता है।

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