2010-08-13 19 views
7

C++ में कभी कभी मैं नीचे की तरह घोषणाओं को देखने के बाद:स्थिरांक प्रकार क्वालीफायर जल्द ही समारोह नाम

return_type function_name( datatype parameter1, datatype parameter2 ) const 
{ /*................*/} 

क्या यह स्थिरांक प्रकार क्वालीफायर सटीक इस मामले में क्या करता है?

उत्तर

7

$ 9.3.1/3 राज्यों

"एक nonstatic सदस्य समारोह घोषित की जा सकती स्थिरांक, अस्थिर, या स्थिरांक अस्थिर। ये cvqualifiers इस सूचक (9.3.2) के प्रकार प्रभावित करते हैं। उन्होंने यह भी प्रभावित करते हैं सदस्य समारोह के समारोह प्रकार (8.3.5); एक सदस्य समारोह घोषित स्थिरांक एक स्थिरांक सदस्य समारोह, एक सदस्य समारोह अस्थिर घोषित है एक अस्थिर सदस्य समारोह है और एक सदस्य समारोह घोषित स्थिरांक अस्थिर एक स्थिरांक अस्थिर सदस्य समारोह है। "

तो यहाँ

सार है:

क) एक स्थिरांक क्वालीफायर केवल वर्ग गैर स्थिर सदस्य कार्यों

ख) सीवी योग्यता समारोह के लिए अधिक भार

struct X{ 
    int x; 
    void f() const{ 
     cout << typeid(this).name(); 
     // this->x = 2; // error 
    } 
    void f(){ 
     cout << typeid(this).name(); 
     this->x = 2; // ok 
    } 
}; 

int main(){ 
    X x; 
    x.f();   // Calls non const version as const qualification is required 
        // to match parameter to argument for the const version 

    X const xc; 
    xc.f();  // Calls const version as this is an exact match (identity 
        // conversion) 
} 
+0

+ 1 में भाग लेने के लिए इस्तेमाल किया जा सकता प्रामाणिक संदर्भ के लिए! –

13

सदस्य फ़ंक्शन घोषणा के अंत में कॉन्स्ट क्वालीफायर इंगित करता है कि फ़ंक्शन को उन वस्तुओं पर बुलाया जा सकता है जो स्वयं हैं। स्थिरांक सदस्य कार्यों किसी भी गैर-परिवर्तनशील डेटा सदस्यों की स्थिति बदलने के लिए नहीं वादा करता हूँ।

कॉन्स सदस्य फ़ंक्शन भी, गैर-कॉन्स ऑब्जेक्ट्स पर कॉल किए जा सकते हैं (और फिर भी वही वादा करते हैं)।

सदस्य कार्यों के रूप में अच्छी तरह से स्थिरांक सत्ता पर अतिभारित किया जा सकता। उदाहरण के लिए:

class A { 
    public: 
    A(int val) : mValue(val) {} 

    int value() const { return mValue; } 
    void value(int newVal) { mValue = newVal; } 

    private: 
    int mValue; 
}; 

A obj1(1); 
const A obj2(2); 

obj1.value(3); // okay 
obj2.value(3); // Forbidden--can't call non-const function on const object 
obj1.value(obj2.value()); // Calls non-const on obj1 after calling const on obj2 
3

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

यानी

class MyClass { 
public: 
    int ConvertToInteger() const; 

}; 

मतलब है कि अगर आप

const MyClass myClass; 

है आप एक संकलन त्रुटि के बिना

int cValue = myClass.ConvertToInteger(); 

कॉल कर सकते हैं, क्योंकि विधि घोषणा इंगित करता है यह परिवर्तन नहीं करता है वस्तु के डेटा।

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