सी ++ में const
कीवर्ड वास्तव में क्या होता है जब यह किसी सदस्य फ़ंक्शन के अंत में लिखा जाता है (तर्क सूची के बाद)?किसी सदस्य फ़ंक्शन के अंत में किसी कॉन्स्ट का अर्थ क्या है?
उत्तर
इसका मतलब है कि *this
const
उस सदस्य फ़ंक्शन के अंदर है, यानी यह ऑब्जेक्ट को परिवर्तित नहीं करता है।
कीवर्ड
this
एक प्रचलित अभिव्यक्ति है जिसका मूल्य उस वस्तु का पता है जिसके लिए फ़ंक्शन कहा जाता है। एक वर्गX
के एक सदस्य समारोह मेंthis
के प्रकार है। यदि सदस्य फ़ंक्शनconst
घोषित किया गया है, तोthis
का प्रकारconst X*
है। [धारा 9.3.2 §1]
const
सदस्य फ़ंक्शन में, जिस ऑब्जेक्ट के लिए फ़ंक्शन कहा जाता है उसेconst
एक्सेस पथ के माध्यम से एक्सेस किया जाता है; इसलिए,const
सदस्य फ़ंक्शन ऑब्जेक्ट और उसके गैर-स्थैतिक डेटा सदस्यों को संशोधित नहीं करेगा। [खंड 9.3.2 §2]
इसका मतलब यह है कि एक const
सदस्य समारोह वर्ग के एक const
उदाहरण पर कहा जा सकता है। एक गैर-const
सदस्य फ़ंक्शन को [1]const
ऑब्जेक्ट पर नहीं कहा जा सकता है, क्योंकि यह संभावित रूप से इसे संशोधित करने का प्रयास कर सकता है।
[1] नोट: एक अस्थायी एक const
वस्तु जब तक यह const
प्रकार का है नहीं है।
संकलक अनुकूलन संभव है, लेकिन मुख्य लाभ यह अनुबंध समारोह की घोषणा में व्यक्त लागू करने में है - अगर आप const
के रूप में एक सदस्य समारोह को परिभाषित, संकलक कि समारोह के अंदर वस्तु में कोई भी बदलाव को रोकता है।
आप अपनी घोषणा में mutable
का उपयोग करके इस प्रतिबंध से कक्षा में व्यक्तिगत फ़ील्ड को छूट दे सकते हैं। यह उदाहरण के लिए उपयोगी है जब आपके पास एक वर्ग है जो अपने लॉक_गार्ड को समाहित करता है, जो const
सदस्य कार्यों के भीतर भी थ्रेड सुरक्षा को लागू करने के लिए अपना मान बदलना चाहिए।
const
फ़ंक्शन हस्ताक्षर के अंत में इसका अर्थ यह है कि फ़ंक्शन को उस वस्तु को मानना चाहिए जिसमें यह सदस्य है const
। व्यावहारिक शब्दों में इसका मतलब है कि आप संकलक को पर पर जांचें कि सदस्य फ़ंक्शन ऑब्जेक्ट डेटा को किसी भी तरह से नहीं बदलता है। इसका मतलब यह है कि कंपाइलर से यह जांचने के लिए कहा जाता है कि यह किसी भी सदस्य डेटा को सीधे नहीं बदलता है, और यह किसी भी फ़ंक्शन को कॉल नहीं करता है जो स्वयं गारंटी नहीं देता है कि यह ऑब्जेक्ट को नहीं बदलेगा।
जब आप const
ऑब्जेक्ट बनाते हैं तो आप संकलक से यह सुनिश्चित करने के लिए कह रहे हैं कि वह ऑब्जेक्ट प्रारंभिक से परे नहीं बदलता है। बदले में इसका मतलब है कि संकलक आपको जांच करेगा कि आप सीधे अपने सदस्य डेटा को नहीं बदलते हैं और आप किसी भी फ़ंक्शन को कॉल नहीं करते हैं जो गारंटी नहीं देता है कि यह ऑब्जेक्ट को नहीं बदलेगा।
यह कॉन्स शुद्धता दर्शन का सभी हिस्सा है। संक्षेप में इसका मतलब है कि अगर चीजें अभी काम करती हैं और वे नहीं बदलेगी तो वे कभी नहीं तोड़ेंगे। दूसरे शब्दों में, निरंतर चीजों को विश्वसनीय रूप से काम करना आसान होता है। फ़ंक्शन हस्ताक्षर के अंत में यह const
चीज आपके लिए चीजों को तोड़ने से रोकने के लिए एक उपकरण है।बदले में इसका मतलब है कि आपको const
हर जगह संभवतः आप कर सकते हैं।
धन्यवाद। क्या किसी फ़ंक्शन में कॉन्स्ट का उपयोग करने के खिलाफ कोई तर्क है जो ऑब्जेक्ट को नहीं बदलता है? मुझे लगता है कि सॉफ़्टवेयर कम लचीला रूप से रखरखाव योग्य हो सकता है यदि आप अचानक कुछ डिज़ाइन बदलने के लिए उदाहरण के लिए निर्णय लेते हैं और वर्तमान में कॉन्स्ट घोषित फ़ंक्शन के रूप में गैर-कॉन्स्ट फ़ंक्शन को कॉल करने की आवश्यकता होती है और फिर शायद इस फ़ंक्शन को कॉल करने वाले कार्यों की एक बड़ी श्रृंखला बदलनी होगी भी – Mat
नहीं, 'const' का उपयोग करने के खिलाफ कोई तर्क नहीं है। यही है, जब तक कि आप अपनी कक्षा को डिजाइन करने के समय अभी तक नहीं जानते हैं, कि किसी सदस्य फ़ंक्शन को ऑब्जेक्ट को बदलने की अनुमति दी जानी चाहिए। यह एक डिज़ाइन सवाल है कि आपको खुद से पहले पूछना चाहिए, और इसका उत्तर देना आसान होना चाहिए। यह "बाद में दरवाजा खोलने" के बारे में नहीं है। इसके बजाय, यह इस बारे में है कि फ़ंक्शन ** को ऑब्जेक्ट को बदलना चाहिए या ** ** इसे ** नहीं बदलना चाहिए। यह एक हां/नहीं सवाल है, काला या सफेद, बीच में कुछ भी नहीं है, और इसका जवाब देना आसान होना चाहिए। नोट: यह ** ** ** नहीं हो सकता है, यह ऑब्जेक्ट बदलता है, लेकिन ** ** इसे चाहिए। – wilhelmtell
बदले में इसका मतलब है कि कॉन्स्ट-शुद्धता दर्शन आपको प्रारंभिक रूप से बल देता है कि प्रत्येक कार्य क्या करता है। यह आपको प्रत्येक सदस्य कार्य के राशन डी'एटर के बारे में निर्णय लेने और स्पष्ट होने के लिए मजबूर करता है। ये अच्छी बात है। आप जो पूछ रहे हैं वह एक समारोह के राइस डी'एट्रे को बदलने के लिए एक दरवाजा खोलना है, और यह एक बुरी चीज है। आपको केवल ** ** ** एक समारोह को क्या करना है, यह करना चाहिए, ** ** ** यह क्या करता है। अपने एपीआई के उपयोगकर्ताओं के बारे में सोचें (जो आप स्वयं हैं)। अपने पैरों से गलीचा मत खींचो! – wilhelmtell
आह ठीक थक्स! और मैं ऐसे कॉन्स्ट फ़ंक्शन के अंदर सदस्य चर के लिए एक सूचक कैसे प्राप्त करूं? अगर मैं 'int * ptr = & m_value' आज़माता हूं तो मुझे' C2440 const int * को int * ' – Mat
में परिवर्तित नहीं किया जा सकता है और क्या यह संकलक को असेंबली कोड को अनुकूलित करने में मदद करता है या वास्तव में क्या लाभ है? – Mat
@ मेट: अपने वैरिएबल को एक कॉन्स के रूप में भी घोषित करें: 'const int * ptr = & m_value' –