2009-12-27 21 views
7

मैं स्थिरांक सदस्य समारोह के दो स्पष्टीकरण मुलाकातस्थिरांक सदस्य समारोह के बारे में

class A{ 
    public: 
    ... 
    void f() const {} 
    ... 
} 
  1. यह यह केवल निरंतर सदस्यों यहां पहुंच सकता है का मतलब है,
  2. इसका मतलब है कि यह किसी भी सदस्य को संशोधित नहीं करता है;

मुझे लगता है कि दूसरा सही है। लेकिन पहला व्यक्ति क्यों बाहर आता है? क्या स्पष्ट करने के लिए कुछ भी है?

धन्यवाद!

+1

आपकी सी ++ पुस्तक क्या कहती है? –

+6

यह साइट ** ** मेरी सी ++ पुस्तक है! –

+0

वे दोनों सही हैं। एक डिग्री (नीचे देखें)। –

उत्तर

18

आप किसी सदस्य सदस्य मान में सभी वर्ग सदस्य मानों की जांच कर सकते हैं, और कुछ मामलों में आप सदस्य चर के मूल्य को भी बदल सकते हैं। पहला स्पष्टीकरण गलत है, मुझे नहीं पता कि यह कहां से आता है। दूसरा स्पष्टीकरण सही है, लेकिन कुछ अपवादों के साथ।

इस नियम के कुछ अपवाद हैं। तुम भी एक स्थिरांक सदस्य समारोह में परिवर्तनशील चर को बदल सकते हैं, उदाहरण के लिए एक सदस्य चर इस तरह की घोषणा की:

mutable float my_rank; 

आप भी इस तरह अपने आप को के लिए एक संदर्भ const_cast'ing द्वारा एक कक्षा में स्थिरांक-शुद्धता तोड़ सकते हैं:

Class* self = const_cast<Class*> (this); 

तकनीकी रूप से सी ++ में अनुमति दी जाने पर, इसे आमतौर पर खराब रूप माना जाता है क्योंकि यह आपके डिजाइन के सभी कॉन्स्ट संशोधक को फेंक देता है। जब तक आप वास्तव में करने के लिए है ऐसा मत करो, और यदि आप पाते हैं अपने आप को इस काफी एक बहुत कुछ है कि अपने डिजाइन के साथ एक समस्या का सुझाव क्या करने वाले। C++ FAQ इसे बहुत अच्छी तरह से कवर करता है।

5

एक सरल अर्थ में, स्थिरांक समारोह में आप की स्थिति को बदल नहीं सकते:

यहाँ मामले में दो संदर्भों आप और अधिक पढ़ने करना चाहते हैं उदेश्य।

स्थिरांक समारोह में इस सूचक स्थिरांक डेटा को स्थिरांक सूचक है, जहां गैर स्थिरांक समारोह में के रूप में यह डेटा को स्थिरांक सूचक की तरह बर्ताव के रूप में व्यवहार करता है।

void foo() const --> const ClassName * const this (so you can't alter data) 

void foo() --> ClassName * const this (so you can alter data) 

जहां तक ​​कॉन्स्ट डेटा सदस्य चिंता का विषय है, आप किसी भी सदस्य समारोह से इसे (पढ़ सकते हैं) चाहे उसका आधार हो या नहीं।

के रूप में जेम्स थॉम्पसन तुम भी constness को हटाने अगर आप इस तरह चाहते द्वारा वस्तु की स्थिति को बदल सकते हैं दिखाई है।

class Bar 
{ 
    int bar; 
    public: 
    void foo() const 
    { 
     this->bar = 0; //flashes error 

     Bar * const thisClass = const_cast<Bar * const>(this); 
     thisClass->bar = 0; 
    } 
}; 

इसके अलावा मठनीय डेटा सदस्यों को कॉन्स्ट फ़ंक्शन में बदला जा सकता है।

1

मुझे लगता है कि कुछ स्पष्टीकरण के बाद मामले 1 स्थिति चिंता का विषय हो सकता है आप इस तरह के एक मामले में आप केवल अपने सदस्य कार्यों च() इस मामले में की तरह स्थिरांक के रूप में घोषित कॉल कर सकते हैं में टाइप ए के एक स्थिरांक वस्तु है जब।तो आपकी पोस्ट के मुताबिक आपको यह मानना ​​चाहिए कि 'यह' टाइप कॉन्स्ट ए के ऑब्जेक्ट पर सदस्य फ़ंक्शंस का कॉलर है। हो सकता है कि आपको इस धारणा को ध्यान में रखते हुए परिभाषा की समीक्षा करनी चाहिए।

2

वे दोनों सही हैं।

एक कॉन्स सदस्य फ़ंक्शन ऑब्जेक्ट के राज्य को परिवर्तित नहीं कर सकता है।

  • इसका मतलब है कि यह सभी सदस्य चर को पढ़ सकता है (लेकिन संशोधित नहीं)।
  • इसका यह भी अर्थ है कि यह केवल अन्य कॉन्स्ट सदस्य फ़ंक्शन
    अन्य विधियों को ऑब्जेक्ट की स्थिति को बदलने की गारंटी नहीं देता है।

ऊपर जेम्स भी उत्परिवर्ती सदस्यों का उल्लेख करता है।
तो मुझे यहां उनको भी कवर करना चाहिए।

एक परिवर्तनीय सदस्य चर एक चर है जो वस्तु की स्थिति का हिस्सा नहीं है (संकलक इसे वस्तुओं की स्थिति का हिस्सा नहीं मानता)। आपको इसका इलाज भी करना चाहिए। ऑब्जेक्ट के बारे में राज्य की जानकारी रखने वाले किसी भी सदस्य चर को परिवर्तनीय चिह्नित किया जाना चाहिए। आपको केवल अस्थायी जानकारी रखने के लिए इसका उपयोग करना चाहिए जिसे ऑब्जेक्ट्स राज्य से फिर से बनाया जा सकता है।

एक साधारण उदाहरण दिनांक-समय वस्तु है। जहां ऑब्जेक्ट में एक विधि है जो डेटा/समय को एक पठनीय स्ट्रिंग प्रारूप में परिवर्तित करती है। इस स्ट्रिंग को म्यूटेबल सदस्य में दक्षता के लिए ऑब्जेक्ट में कैश किया जा सकता है (ताकि आपको बार-बार स्ट्रिंग बनाने की आवश्यकता न हो)। लेकिन स्ट्रिंग ऑब्जेक्ट स्टेट का हिस्सा नहीं है (क्योंकि इसे अन्य सदस्यों से बनाया जा सकता है)।

इसके अलावा जेम्स const_cast का उपयोग करके स्थिरता कास्टिंग करने का उल्लेख करता है।

बहुत विशेष परिस्थितियों के अलावा जहां आप ऑब्जेक्ट जानते हैं, ऐसा नहीं कर सकता है इसे सार्वभौमिक रूप से एक बुरा विचार माना जाता है। क्योंकि यह सीधे अपरिभाषित व्यवहार की ओर जाता है। यदि आपको खुद को स्थिरता को दूर करने की आवश्यकता है तो आपके कार्यक्रम में डिजाइन में कुछ गड़बड़ हुई है।

असल में मैं केवल एक ऐसी स्थिति के बारे में सोच सकता हूं जहां यह सामान्य रूप से होता है। और फिर मैं यह सुनिश्चित करने के लिए कोड को प्रतिबद्ध करने के लिए तैयार नहीं हूं कि मैं मूर्खतापूर्ण न दिखूं।

+0

मुझे लगता है कि आपने मुझसे पहले प्रश्न को अलग से पढ़ा है। प्रस्तावित परिभाषा "यह केवल निरंतर सदस्यों तक पहुंच सकती थी।" एक कॉन्स सदस्य फ़ंक्शन गैर-निरंतर सदस्यों तक पहुंच सकता है जब तक कि यह उनके राज्य को संशोधित नहीं करता है, ताकि परिभाषा गलत हो। –

+0

@ जेम्स। कृपया अपना बयान स्पष्ट करें। एक कॉन्स विधि किसी भी सदस्य चर को पढ़ सकते हैं। लेकिन केवल कॉन्स सदस्य विधियों को कॉल कर सकते हैं। मुझे लगता है कि यह स्पष्ट है कि मूल प्रश्न को मामूली विवरण मिला है। –

+0

कोई चिंता नहीं, हालांकि 2 ठोस उदाहरण दिए गए थे .. सभी टिप्पणियां लेंगी और छोटे चैनलों का समर्थन करने वाले मीडिया चैनलों का समर्थन करना शुरू करेंगी। कौन जानता है, शायद मैं एक ही सड़क की बजाय प्रत्येक कार के लिए एक समर्पित लेन देखना शुरू कर दूंगा। –

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