c++ एक स्थैतिक सदस्य एक स्थैतिक डेटा सदस्य को क्यों बदल सकता है?




function c++11 (4)

निम्नलिखित C++ प्रोग्राम में, स्थैतिक डेटा सदस्य को एक const फ़ंक्शन से संशोधित करना ठीक काम कर रहा है:

class A 
{
  public:   
    static int a; // static data member

    void set() const
    {
        a = 10;
    }
};

लेकिन एक स्थैतिक फ़ंक्शन से गैर-स्थैतिक डेटा सदस्य को संशोधित करने से काम नहीं होता है:

class A 
{
  public:   
    int a; // non-static data member

    void set() const
    {
        a = 10;
    }
};

एक static सदस्य एक static डेटा सदस्य को क्यों बदल सकता है?

https://code.i-harness.com


बात यह है, कि यदि किसी वर्ग A का सदस्य फ़ंक्शन const , तो इसका प्रकार const X* , और इस तरह गैर-स्थैतिक डेटा सदस्यों को परिवर्तित होने से रोकता है (cf, उदाहरण के लिए, C ++ मानक ):

9.3.2 यह सूचक [class.this]

एक गैर-स्थैतिक (9.3) सदस्य फ़ंक्शन के शरीर में, कीवर्ड यह एक प्रचलित अभिव्यक्ति है जिसका मूल्य उस ऑब्जेक्ट का पता है जिसके लिए फ़ंक्शन कहा जाता है। एक कक्षा X के सदस्य फ़ंक्शन में इसका प्रकार X * है। यदि सदस्य फ़ंक्शन को const घोषित किया जाता है, तो इसका प्रकार const X * है, ...

यदि a गैर-स्थैतिक डेटा सदस्य है, तो a=10 इस के समान this->a = 10 , जिसकी अनुमति नहीं है यदि इस का प्रकार const A* और इसे mutable घोषित नहीं किया गया है। इस प्रकार, चूंकि void set() const इस प्रकार का निर्माण करता है const A* , इस एक्सेस की अनुमति नहीं है।

यदि a इसके विपरीत स्थैतिक डेटा सदस्य है, तो a=10 में this सब शामिल नहीं है; और जब तक static int a द्वारा स्वयं को const घोषित नहीं किया जाता है, तब तक a=10 की अनुमति है।


यह नियम है, बस इतना ही। और अच्छे कारण के लिए।

एक सदस्य समारोह में const मतलब है कि आप गैर- static गैर- static वर्ग के सदस्य चर को संशोधित नहीं कर सकते।

कुछ युक्तिकरण की पेशकश के माध्यम से, एक const योग्य सदस्य फ़ंक्शन में this पॉइंटर एक const प्रकार है, और this स्वाभाविक रूप से एक वर्ग की आवृत्ति से संबंधित है। static सदस्य वर्ग उदाहरण से संबंधित नहीं हैं। आपको static सदस्य को संशोधित करने के लिए एक उदाहरण की आवश्यकता नहीं है: आप इसे अपने मामले में, A::a = 10; लिखकर कर सकते हैं A::a = 10;

तो, अपने पहले मामले में, a = 10; बारे में सोचो a = 10; A::a = 10; लिए आशुलिपि के रूप में A::a = 10; और दूसरे मामले में, इसे इसके लिए शॉर्टहैंड this->a = 10; , जो इस प्रकार के const A* का कॉन्स्टेबल है, क्योंकि यह अनिवार्य नहीं है।


सी ++ मानक के अनुसार (9.2.3.2 स्टेटिक डेटा सदस्य)

1 एक स्थैतिक डेटा सदस्य किसी वर्ग के उप-अंशों का हिस्सा नहीं है ...

और (9.2.2.1 यह सूचक)

1 एक गैर-स्थैतिक (9.2.1) सदस्य फ़ंक्शन के शरीर में, यह एक प्रचलित अभिव्यक्ति है जिसका मूल्य उस वस्तु का पता है जिसके लिए फ़ंक्शन कहा जाता है। एक कक्षा X के सदस्य फ़ंक्शन में इसका प्रकार X * है। यदि सदस्य फ़ंक्शन को const घोषित किया जाता है, तो इसका प्रकार const X * है , ...

और अंत में (9.2.2 गैर-स्थैतिक सदस्य कार्य)

3 ... यदि नाम लुकअप (3.4) कुछ कक्षा C के गैर-स्थिर गैर-प्रकार के सदस्य के लिए आईडी-एक्सप्रेशन में नाम को हल करता है, और यदि या तो आईडी-एक्सप्रेशन का संभावित मूल्यांकन किया गया है या C X या बेस क्लास है X का, आईडी-एक्सप्रेशन को एक क्लास मेंबर एक्सेस एक्सप्रेशन (5.2.5) में बदल दिया गया है (* इस) (9.2.2.1) के बाईं ओर पोस्टफिक्स-एक्सप्रेशन के रूप में। ऑपरेटर।

इस प्रकार इस वर्ग की परिभाषा में

class A 
{
  public:   
    static int a; 

    void set() const
    {
        a = 10;
    }
};

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

इस वर्ग की परिभाषा में

class A 
{
  public:   
    int a; 

    void set() const
    {
        a = 10;
    }
};

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


सदस्य फ़ंक्शन पर const क्वालिफायर का अर्थ है कि आप non-mutable , non-static वर्ग डेटा सदस्यों को संशोधित नहीं कर सकते।





const