mutable कीवर्ड क्या है?
Mutable डेटा सदस्य वे सदस्य हैं जिनके मान रनटाइम पर बदले जा सकते हैं भले ही ऑब्जेक्ट कॉन्स्टेंट टाइप का हो। यह कॉन्स्टेंट के बिल्कुल विपरीत है।
कभी-कभी लॉजिक के लिए केवल एक या दो डेटा सदस्यों को वेरिएबल के रूप में और दूसरे को कॉन्स्टेंट के रूप में उपयोग करने की आवश्यकता होती है ताकि डेटा को हैंडल किया जा सके। उस स्थिति में, म्यूटेबिलिटी क्लासेस को प्रबंधित करने के लिए बहुत उपयोगी अवधारणा है।
उदाहरण
#include <iostream>
using namespace std;
class Test {
public:
int a;
mutable int b; // mutable कीवर्ड
Test(int x = 0, int y = 0) {
a = x;
b = y;
}
void seta(int x = 0) {
a = x;
}
void setb(int y = 0) {
b = y;
}
void disp() {
cout << endl << "a: " << a << " b: " << b << endl;
}
};
int main() {
const Test t(10, 20); // कॉन्स्ट ऑब्जेक्ट
cout << t.a << " " << t.b << "\n";
// t.a = 30; // एरर: a को बदला नहीं जा सकता, क्योंकि ऑब्जेक्ट कॉन्स्ट है
t.b = 100; // b अभी भी बदला जा सकता है, क्योंकि b mutable है
cout << t.a << " " << t.b << "\n";
return 0;
}
आउटपुट
10 20 10 100
व्याख्या
const Test t(10, 20)एक कॉन्स्ट ऑब्जेक्ट बनाता हैt.a = 30कंपाइल एरर देगा क्योंकिamutable नहीं हैt.b = 100काम करता है क्योंकिbकोmutableघोषित किया गया है
mutable का उपयोग कब करें
- कैशिंग: कॉन्स्ट मेथड में महंगी गणना का परिणाम कैश करना
- म्यूटेक्स/लॉक्स: कॉन्स्ट मेथड में थ्रेड सेफ्टी के लिए म्यूटेक्स लॉक करना
- लॉगिंग/डीबगिंग: कॉन्स्ट ऑब्जेक्ट में लॉग काउंटर अपडेट करना
- लेजी इनिशियलाइज़ेशन: पहली बार एक्सेस पर डेटा इनिशियलाइज़ करना
व्यावहारिक उदाहरण: कैशिंग
class ExpensiveCalculation {
mutable int cachedResult;
mutable bool isCached;
public:
ExpensiveCalculation() : cachedResult(0), isCached(false) {}
int getResult() const {
if (!isCached) {
// महंगी गणना
cachedResult = computeExpensive();
isCached = true;
}
return cachedResult;
}
private:
int computeExpensive() const {
// सिमुलेटेड महंगी गणना
return 42;
}
};
सावधानियां
- mutable का उपयोग सावधानी से करें - यह कॉन्स्ट सहीता (const correctness) को तोड़ सकता है
- केवल उन सदस्यों के लिए उपयोग करें जो ऑब्जेक्ट की "लॉजिकल कॉन्स्टनेस" को प्रभावित नहीं करते
- थ्रेड-सेफ्टी पर विचार करें यदि mutable सदस्यों को मल्टीथ्रेडेड संदर्भ में एक्सेस किया जाता है