दूसरों ने कॉन्स सदस्य कार्यों के बारे में आपके प्रश्न के तकनीकी पक्ष का उत्तर दिया है, लेकिन यहां एक बड़ी तस्वीर है - और यह const correctness का विचार है।
लंबी कहानी छोटी, स्थिरता आपके कोड के अर्थशास्त्र को स्पष्ट और लागू करने के बारे में है। एक साधारण उदाहरण लें। इस समारोह घोषणा को देखो:
bool DoTheThing(char* message);
मान लीजिए किसी और इस समारोह में लिखा था और आप इसे कॉल करने के लिए की जरूरत है। क्या आप जानते हैं कि DoTheThing()
आपके चार बफर में क्या करता है? हो सकता है कि यह सिर्फ एक फ़ाइल को संदेश लॉग करता है, या शायद यह स्ट्रिंग को बदल देता है। आप यह नहीं बता सकते कि कॉल की अर्थशास्त्र केवल फ़ंक्शन घोषणा को देखकर क्या है। यदि फ़ंक्शन स्ट्रिंग को संशोधित नहीं करता है, तो घोषणा गलत है।
आपके कार्यों को सही बनाने के लिए व्यावहारिक मूल्य भी है। अर्थात्, कॉल के संदर्भ के आधार पर, हो सकता है कि आप कुछ चालबाजी के बिना कॉन्स्ट-गलत फ़ंक्शंस को कॉल करने में सक्षम न हों। उदाहरण के लिए, मान लेते हैं आप जानते हैं कि कि DoTheThing()
स्ट्रिंग यह करने के लिए पारित कर दिया की सामग्री को संशोधित नहीं है, और आप इस कोड है:
void MyFunction()
{
std::string msg = "Hello, const correctness";
DoTheThing(msg.c_str());
}
ऊपर कोड संकलन नहीं करेगा क्योंकि msg.c_str()
रिटर्न एक const char*
। ,
void MyFunction()
{
std::string msg = "Hello, const correctness";
DoTheThing(const_cast<char*>(msg.c_str()));
}
न जिनमें से यकीनन, 'बेहतर' की तुलना में कर रहे हैं:
void MyFunction()
{
std::string msg = "Hello, const correctness";
DoTheThing(msg.begin());
}
... या और भी बदतर: आदेश संकलित करने के लिए इस कोड को पाने के लिए, अगर आप इस तरह कुछ करने के लिए होता है मूल कोड लेकिन क्योंकि DoTheThing()
एक कॉन्स्ट-गलत तरीके से लिखा गया था, तो आपको इसके चारों ओर अपना कोड मोड़ना होगा।
यदि आपके सदस्य चर कभी नहीं बदलते हैं, तो आपके पास सदस्य चर क्यों हैं? –
क्योंकि वह एक कक्षा चाहता है जो अपरिवर्तनीय है? यह अनुचित नहीं है। –
मैं वास्तव में एक सी ++ व्यक्ति नहीं हूं, इसलिए यह "गॉचा" प्रश्न से अधिक ब्याज का सवाल था। यदि आप वास्तव में अपरिवर्तनीय होना चाहते हैं तो आप अपने सभी सदस्यों को "कॉन्स्ट" क्यों घोषित नहीं करेंगे? या आप दोनों सदस्यों को कॉन्स और विधियों के रूप में घोषित करेंगे? –