समारोह कॉल कोष्ठक के बाद क्वालीफायर सदस्य कार्यों में से छिपा this
पैरामीटर के लिए लागू होते हैं। लेकिन क्या होता है यदि फू ऑब्जेक्ट const
है?
struct Foo {
void bar();
};
const Foo f{};
f.bar();
ठीक है, के बाद से Foo::bar()
एक Foo *this
पैरामीटर, जो const
होने की अनुमति नहीं है लेता है, इसके बाद के संस्करण f.bar();
संकलित करने के लिए विफल रहता है। तो हमें छिपे हुए this
पैरामीटर को अर्हता प्राप्त करने के लिए एक तरीका चाहिए, और जिस तरह से सी ++ ऐसा करने का विकल्प चुनता है वह उन क्वालीफायरों को फ़ंक्शन पैरों के बाहर जाने की अनुमति देता है।
रास्ता संकलक इन कार्यों अलग करती है, नियमित रूप से समारोह से अधिक भार के लिए हर तरह से समान है क्योंकि यह है कि यह वास्तव में क्या है, अजीब वाक्य रचना के बावजूद।
इसके अलावा, const
एकमात्र क्वालीफायर नहीं है। आप volatile
क्वालीफायर भी जोड़ सकते हैं, और सी ++ 11 में आप लवल्यू और रावल्यू रेफरेंस क्वालीफायर भी डाल सकते हैं।
कारण है कि हम इस समारोह के दो लगभग समान प्रतियां की जरूरत है एक ही अंतर बाहर निकलने के लिए कोई सीधा रास्ता नहीं है क्योंकि वहाँ है: विभिन्न वापसी प्रकार के। यदि हमारे पास एक कॉन्स ऑब्जेक्ट है, और उस ऑब्जेक्ट में एक गेटटर है जो इसमें शामिल किसी संदर्भ का संदर्भ देता है, तो उस संदर्भ को समग्र ऑब्जेक्ट के समान योग्यता प्राप्त करने की आवश्यकता होती है।
struct Foo {
int i;
int &get_i() const { return i; }
};
int main() {
const Foo f{};
f.get_i() = 10; // i should be const!
}
ऊपर भी संकलन नहीं होगा Foo::get_i() const
क्योंकि अंदर, i
स्थिरांक है, और हम यह करने के लिए एक गैर स्थिरांक संदर्भ नहीं लौट सकते। लेकिन अगर इसकी अनुमति थी, तो यह गलत होगा क्योंकि हमें किसी कॉन्स ऑब्जेक्ट के सदस्यों को संशोधित करने में सक्षम नहीं होना चाहिए। तो Foo::get_i() const
को i
पर एक कॉन्स्ट संदर्भ वापस करने की आवश्यकता है।
int const &Foo::get_i() const { return i; }
लेकिन हम एक गैर स्थिरांक वस्तु के एक सदस्य को संशोधित करने में सक्षम होना चाहिए,
int main() {
Foo f{};
f.get_i() = 10; // should be fine
}
इसलिए हम केवल इस समारोह नहीं हो सकता। हमें एक फ़ंक्शन की आवश्यकता होती है जो एक गैर-कॉन्स्ट संदर्भ देता है जब फू ऑब्जेक्ट स्वयं नहीं होता है। तो हम वस्तु का स्थिरांक सत्ता के आधार पर समारोह को ओवरलोड:
struct Foo {
int i;
int const &get_i() const { return i; }
int &get_i() { return const_cast<int &>(const_cast<Foo const *>(this)->get_i()); }
};
है यही कारण है कि, गैर:
struct Foo {
int i;
int const &get_i() const { return i; }
int &get_i() { return i; }
};
तो समारोह शरीर अधिक वहाँ एक संभव है कि दोहराव से बचने के विकल्प को मुश्किल है -कॉन्स्ट ओवरलोड प्रकार को ठीक करने के लिए const_cast का उपयोग करके, कॉन्स ओवरलोड पर इसके कार्यान्वयन को प्रतिनिधि करता है। कॉन्स जोड़ना हमेशा सुरक्षित है। एक const_cast का उपयोग कर कॉन्स्ट को हटाने केवल तभी सुरक्षित होता है जब हम यह सुनिश्चित करने के लिए जानते हैं कि मूल वस्तु नहीं है। हम जानते हैं कि इस मामले में, क्योंकि हम जानते हैं कि हमने पहले स्थान पर नॉन-कॉन्स्ट ऑब्जेक्ट में कॉन्स जोड़ा था।
सुझाव: पहले एक आप को संशोधित करने की अनुमति देता है जो कुछ भी ' एफ() 'रिटर्न, जो वस्तु 'एफ()' का एक हिस्सा हो सकता है, पर कॉल किया जा रहा है। – juanchopanza
द्वितीय श्रेणी को उस वर्ग की स्थिति को संशोधित करने की अनुमति नहीं है जिसे इस विधि में परिभाषित किया गया है। – kerem
http://www.parashift.com/c++-faq/const-overloading.html –