2010-10-30 4 views

उत्तर

61

इसका मतलब है कि *thisconst उस सदस्य फ़ंक्शन के अंदर है, यानी यह ऑब्जेक्ट को परिवर्तित नहीं करता है।

कीवर्ड 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 प्रकार का है नहीं है।

+0

आह ठीक थक्स! और मैं ऐसे कॉन्स्ट फ़ंक्शन के अंदर सदस्य चर के लिए एक सूचक कैसे प्राप्त करूं? अगर मैं 'int * ptr = & m_value' आज़माता हूं तो मुझे' C2440 const int * को int * ' – Mat

+0

में परिवर्तित नहीं किया जा सकता है और क्या यह संकलक को असेंबली कोड को अनुकूलित करने में मदद करता है या वास्तव में क्या लाभ है? – Mat

+2

@ मेट: अपने वैरिएबल को एक कॉन्स के रूप में भी घोषित करें: 'const int * ptr = & m_value' –

10

संकलक अनुकूलन संभव है, लेकिन मुख्य लाभ यह अनुबंध समारोह की घोषणा में व्यक्त लागू करने में है - अगर आप const के रूप में एक सदस्य समारोह को परिभाषित, संकलक कि समारोह के अंदर वस्तु में कोई भी बदलाव को रोकता है।

आप अपनी घोषणा में mutable का उपयोग करके इस प्रतिबंध से कक्षा में व्यक्तिगत फ़ील्ड को छूट दे सकते हैं। यह उदाहरण के लिए उपयोगी है जब आपके पास एक वर्ग है जो अपने लॉक_गार्ड को समाहित करता है, जो const सदस्य कार्यों के भीतर भी थ्रेड सुरक्षा को लागू करने के लिए अपना मान बदलना चाहिए।

25

const फ़ंक्शन हस्ताक्षर के अंत में इसका अर्थ यह है कि फ़ंक्शन को उस वस्तु को मानना ​​चाहिए जिसमें यह सदस्य है const। व्यावहारिक शब्दों में इसका मतलब है कि आप संकलक को पर पर जांचें कि सदस्य फ़ंक्शन ऑब्जेक्ट डेटा को किसी भी तरह से नहीं बदलता है। इसका मतलब यह है कि कंपाइलर से यह जांचने के लिए कहा जाता है कि यह किसी भी सदस्य डेटा को सीधे नहीं बदलता है, और यह किसी भी फ़ंक्शन को कॉल नहीं करता है जो स्वयं गारंटी नहीं देता है कि यह ऑब्जेक्ट को नहीं बदलेगा।

जब आप const ऑब्जेक्ट बनाते हैं तो आप संकलक से यह सुनिश्चित करने के लिए कह रहे हैं कि वह ऑब्जेक्ट प्रारंभिक से परे नहीं बदलता है। बदले में इसका मतलब है कि संकलक आपको जांच करेगा कि आप सीधे अपने सदस्य डेटा को नहीं बदलते हैं और आप किसी भी फ़ंक्शन को कॉल नहीं करते हैं जो गारंटी नहीं देता है कि यह ऑब्जेक्ट को नहीं बदलेगा।

यह कॉन्स शुद्धता दर्शन का सभी हिस्सा है। संक्षेप में इसका मतलब है कि अगर चीजें अभी काम करती हैं और वे नहीं बदलेगी तो वे कभी नहीं तोड़ेंगे। दूसरे शब्दों में, निरंतर चीजों को विश्वसनीय रूप से काम करना आसान होता है। फ़ंक्शन हस्ताक्षर के अंत में यह const चीज आपके लिए चीजों को तोड़ने से रोकने के लिए एक उपकरण है।बदले में इसका मतलब है कि आपको const हर जगह संभवतः आप कर सकते हैं।

+0

धन्यवाद। क्या किसी फ़ंक्शन में कॉन्स्ट का उपयोग करने के खिलाफ कोई तर्क है जो ऑब्जेक्ट को नहीं बदलता है? मुझे लगता है कि सॉफ़्टवेयर कम लचीला रूप से रखरखाव योग्य हो सकता है यदि आप अचानक कुछ डिज़ाइन बदलने के लिए उदाहरण के लिए निर्णय लेते हैं और वर्तमान में कॉन्स्ट घोषित फ़ंक्शन के रूप में गैर-कॉन्स्ट फ़ंक्शन को कॉल करने की आवश्यकता होती है और फिर शायद इस फ़ंक्शन को कॉल करने वाले कार्यों की एक बड़ी श्रृंखला बदलनी होगी भी – Mat

+1

नहीं, 'const' का उपयोग करने के खिलाफ कोई तर्क नहीं है। यही है, जब तक कि आप अपनी कक्षा को डिजाइन करने के समय अभी तक नहीं जानते हैं, कि किसी सदस्य फ़ंक्शन को ऑब्जेक्ट को बदलने की अनुमति दी जानी चाहिए। यह एक डिज़ाइन सवाल है कि आपको खुद से पहले पूछना चाहिए, और इसका उत्तर देना आसान होना चाहिए। यह "बाद में दरवाजा खोलने" के बारे में नहीं है। इसके बजाय, यह इस बारे में है कि फ़ंक्शन ** को ऑब्जेक्ट को बदलना चाहिए या ** ** इसे ** नहीं बदलना चाहिए। यह एक हां/नहीं सवाल है, काला या सफेद, बीच में कुछ भी नहीं है, और इसका जवाब देना आसान होना चाहिए। नोट: यह ** ** ** नहीं हो सकता है, यह ऑब्जेक्ट बदलता है, लेकिन ** ** इसे चाहिए। – wilhelmtell

+1

बदले में इसका मतलब है कि कॉन्स्ट-शुद्धता दर्शन आपको प्रारंभिक रूप से बल देता है कि प्रत्येक कार्य क्या करता है। यह आपको प्रत्येक सदस्य कार्य के राशन डी'एटर के बारे में निर्णय लेने और स्पष्ट होने के लिए मजबूर करता है। ये अच्छी बात है। आप जो पूछ रहे हैं वह एक समारोह के राइस डी'एट्रे को बदलने के लिए एक दरवाजा खोलना है, और यह एक बुरी चीज है। आपको केवल ** ** ** एक समारोह को क्या करना है, यह करना चाहिए, ** ** ** यह क्या करता है। अपने एपीआई के उपयोगकर्ताओं के बारे में सोचें (जो आप स्वयं हैं)। अपने पैरों से गलीचा मत खींचो! – wilhelmtell