c++ - एक सी++ विधि घोषणा में आखिरी "कॉन्स" का अर्थ?




const declaration (5)

इन तरह की घोषणाओं में const का अर्थ क्या है? कॉन्स मुझे भ्रमित करता है।

class foobar
{
  public:
     operator int () const;
     const char* foo() const;
};

इन const का मतलब है कि संकलक 'त्रुटि के साथ' विधि आंतरिक डेटा बदलता है अगर संकलक त्रुटि होगी।

class A
{
public:
    A():member_()
    {
    }

    int hashGetter() const
    {
        state_ = 1;
        return member_;
    }
    int goodGetter() const
    {
        return member_;
    }
    int getter() const
    {
        //member_ = 2; // error
        return member_;
    }
    int badGetter()
    {
        return member_;
    }
private:
    mutable int state_;
    int member_;
};

कसौटी

int main()
{
    const A a1;
    a1.badGetter(); // doesn't work
    a1.goodGetter(); // works
    a1.hashGetter(); // works

    A a2;
    a2.badGetter(); // works
    a2.goodGetter(); // works
    a2.hashGetter(); // works
}

अधिक जानकारी के लिए this पढ़ें


कॉन्स का मतलब है कि विधि वर्ग के किसी भी सदस्य को बदलने का वादा नहीं करती है। आप उस ऑब्जेक्ट के सदस्यों को निष्पादित करने में सक्षम होंगे जो इतने चिह्नित हैं, भले ही ऑब्जेक्ट को चिह्नित किया गया हो:

const foobar fb;
fb.foo();

कानूनी होगा।

सी ++ में "कॉन्स्ट" के उपयोग कितने और कौन से हैं? अधिक जानकारी के लिए।


जब आप विधि हस्ताक्षर में const का उपयोग करते हैं (जैसे आपका कहा गया: const char* foo() const; ) आप संकलक को बता रहे हैं कि this द्वारा इंगित स्मृति को इस विधि द्वारा बदला नहीं जा सकता है (जो यहां foo है)।


ब्लेयर का जवाब निशान पर है।

हालांकि ध्यान दें कि एक mutable योग्यता है जिसे कक्षा के डेटा सदस्यों में जोड़ा जा सकता है। किसी भी सदस्य को इतनी चिह्नित किया जा सकता है कि const अनुबंध का उल्लंघन किये बिना किसी const विधि में संशोधित किया जा सके।

आप इसका उपयोग करना चाहेंगे (उदाहरण के लिए) यदि आप किसी ऑब्जेक्ट को याद रखना चाहते हैं कि किसी विशेष विधि को कितनी बार बुलाया जाता है, जबकि उस विधि की "तार्किक" स्थिरता को प्रभावित नहीं करते हैं।


const क्वालीफायर का अर्थ है कि विधियों को foobar किसी भी मूल्य पर बुलाया जा सकता है। अंतर तब आता है जब आप किसी कॉन्स्ट ऑब्जेक्ट पर गैर-कॉन्स्ट विधि को कॉल करने पर विचार करते हैं। विचार करें कि क्या आपके foobar प्रकार में निम्नलिखित अतिरिक्त विधि घोषणा थी:

class foobar {
  ...
  const char* bar();
}

विधि bar() गैर-कॉन्स है और केवल गैर-कॉन्स मानों से ही पहुंचा जा सकता है।

void func1(const foobar& fb1, foobar& fb2) {
  const char* v1 = fb1.bar();  // won't compile
  const char* v2 = fb2.bar();  // works
}

हालांकि const पीछे विचार उन विधियों को चिह्नित करना है जो कक्षा की आंतरिक स्थिति को नहीं बदलेंगे। यह एक शक्तिशाली अवधारणा है लेकिन वास्तव में सी ++ में लागू नहीं है। यह गारंटी से अधिक वादा है। और वह जो अक्सर टूटा और आसानी से टूट जाता है।

foobar& fbNonConst = const_cast<foobar&>(fb1);






c++-faq