const
प्रोग्राम अर्थशास्त्र के बारे में है और कार्यान्वयन विवरण के बारे में नहीं है। जब आप ऑब्जेक्ट की दृश्य स्थिति को नहीं बदलते हैं तो आपको सदस्य फ़ंक्शन const
चिह्नित करना चाहिए, और उस ऑब्जेक्ट पर कॉल करने योग्य होना चाहिए जो const
है। const
कक्षा X
पर सदस्य फ़ंक्शन के भीतर, this
का प्रकार X const *
है: सूचक X
ऑब्जेक्ट के लिए सूचक। इस प्रकार सभी सदस्य चर प्रभावी रूप से const
उस सदस्य फ़ंक्शन के भीतर प्रभावी होते हैं (mutable
को छोड़कर)। यदि आपके पास const
ऑब्जेक्ट है, तो आप केवल const
सदस्य फ़ंक्शन पर कॉल कर सकते हैं।
आप mutable
का उपयोग यह इंगित करने के लिए कर सकते हैं कि एक सदस्य चर const
सदस्य फ़ंक्शन के भीतर भी बदल सकता है। यह आम तौर पर कैशिंग परिणामों के लिए उपयोग किए जाने वाले चर की पहचान करने के लिए प्रयोग किया जाता है, या उन चर के लिए जो वास्तविक अवलोकन योग्य राज्य को प्रभावित नहीं करते हैं जैसे कि म्यूटेक्स (आपको अभी भी const
सदस्य फ़ंक्शंस में म्यूटेक्स को लॉक करने की आवश्यकता है) या काउंटर का उपयोग करें।
class X
{
int data;
mutable boost::mutex m;
public:
void set_data(int i)
{
boost::lock_guard<boost::mutex> lk(m);
data=i;
}
int get_data() const // we want to be able to get the data on a const object
{
boost::lock_guard<boost::mutex> lk(m); // this requires m to be non-const
return data;
}
};
आप (जैसे std::auto_ptr
या boost::shared_ptr
के रूप में स्मार्ट संकेत सहित) तो सूचक एक const
सदस्य समारोह में const
हो जाता है, लेकिन नहीं उठाई-करने के लिए डेटा है, तो आप संशोधित कर सकते हैं तो बजाय सूचक सीधे द्वारा डेटा तक दबाकर रखें बिंदु से डेटा।
कैशिंग के लिए: सामान्य रूप से संकलक ऐसा नहीं कर सकता क्योंकि राज्य कॉल के बीच बदल सकता है (विशेष रूप से मल्टीक्स के साथ मेरे बहु-थ्रेडेड उदाहरण में)। हालांकि, यदि परिभाषा इनलाइन है तो संकलक कोड को कॉलिंग फ़ंक्शन में खींच सकता है और अनुकूलित कर सकता है कि वह वहां क्या देख सकता है। इसके परिणामस्वरूप प्रभावी रूप से फ़ंक्शन को केवल एक बार बुलाया जा सकता है।
C++ Standard (C++0x) का अगला संस्करण एक नया कीवर्ड constexpr
होगा। constexpr
टैग किए गए कार्यों को निरंतर मान लौटाता है, इसलिए परिणाम कैश किए जा सकते हैं। इस तरह के एक समारोह में आप क्या कर सकते हैं इस पर सीमाएं हैं (ताकि संकलक इस तथ्य को सत्यापित कर सकें)।
स्रोत
2008-09-19 08:56:48
आह! कॉन्स्टेक्स शायद मैं क्या सोच रहा था! धन्यवाद। – Ferruccio
आपने मेरा दिन बनाया, महोदय। मुझे नहीं पता था कि मुझे हमेशा 'उत्परिवर्तनीय' की ज़रूरत थी। आपका बहुत बहुत धन्यवाद। – lucastamoios