2010-04-27 40 views
5

यहाँ के बारे में सरल सवाल कुछ कोड सी ++ Vol1 अध्याय 10.सी ++ निरंतर वाक्य रचना

#include <iostream> 
    using namespace std; 

    int x = 100; 

    class WithStatic { 
     static int x; 
     static int y; 
     public: 
      void print() const { 
      cout << "WithStatic::x = " << x << endl; 
      cout << "WithStatic::y = " << y << endl; 
      } 
    }; 

समारोह प्रिंट के लिए स्थिरांक का अर्थ() क्या है में सोच रही थी से नकल कर रहा है? धन्यवाद!

+1

की डुप्लीकेट http://stackoverflow.com/questions/98705/what-are-the-semantics-of-a-const-member-function और http://stackoverflow.com/questions/ 49035/what-does-the-const-operator-mean-when-used-with-a-method-in-c – jweyrich

उत्तर

3

मैंने यह पहले सुना है कि यह “ एक विधि है जो तर्कसंगत रूप से ऑब्जेक्ट ” को परिवर्तित नहीं करता है। इसका मतलब है कि इस विधि को कॉल करके कॉलर विधि ’ एस स्थिति को विधि रिटर्न के बाद एक ही रहने की उम्मीद कर सकता है। प्रभावी रूप से, this पॉइंटर उस वर्ग के निरंतर उदाहरण के लिए निरंतर सूचक बन जाता है, इसलिए सदस्य चर को बदला नहीं जा सकता है।इस नियम का अपवाद यह है कि यदि सदस्य चर mutable के साथ घोषित किए जाते हैं। यदि किसी वर्ग में mutable सदस्य चर हैं, तो इन्हें गैर-कॉन्स और कॉन्स्ट विधियों दोनों द्वारा संशोधित किया जा सकता है। इसके अलावा, एक कॉन्स विधि के भीतर गैर-कॉन्स विधियों को नहीं बुलाया जा सकता है।

कुछ लोग समय पर गणना के परिणामों को कैश करने के लिए mutable सदस्य चर का उपयोग करते हैं। सिद्धांत रूप में, वस्तु की स्थिति में परिवर्तन नहीं होता है (यानी एकमात्र प्रभाव यह है कि बाद की कॉल तेज होती है, लेकिन वे एक ही इनपुट के समान परिणाम उत्पन्न करते हैं)।

+0

+1। – jweyrich

1

यह गारंटी है कि फ़ंक्शन ऑब्जेक्ट को बिल्कुल संशोधित नहीं करेगा (यानी यह "केवल पढ़ने के लिए" फ़ंक्शन है)। संपादित करें: जाहिर है, उस नियम का अपवाद यह है कि यदि किसी ऑब्जेक्ट में mutable सदस्य हैं; उन दोनों कोस्ट और गैर-कॉन्स फ़ंक्शंस द्वारा बदला जा सकता है।

इसके अलावा, मुझे टीआईसी ++ से सीखने वाले किसी और को देखकर खुशी हुई। यह शुरुआती लोगों के लिए एक महान संसाधन है।

+0

पूरी तरह से सत्य नहीं है, 'mutable' सदस्यों को बदला जा सकता है। – jweyrich

+0

ओह, मुझे 'म्यूटेबल' कीवर्ड से अवगत नहीं था। मैं अपना जवाब बदल दूंगा। – Maulrus

+0

'mutable' सी ++ में एक नया विकास है। –

-1

कॉन्स्ट का मतलब प्रिंट() को परिवर्तनीय के साथ चिह्नित नहीं किए गए राज्य चर को संशोधित करने की अनुमति नहीं है।

+0

आईआईआरसी, यह एक वैकल्पिक संकलन-समय की जांच है, इसलिए जब आप * कर सकते हैं, तो सामान को संशोधित करने का प्रयास करना वाकई एक बुरा विचार है। – muhmuhten

+0

@sreservoir, जबकि यह केवल एक संकलन-समय की जांच है, आप इस पॉइंटर से कॉन्स्ट को हटाने के लिए conststcast का उपयोग करते हैं, तो आप (पढ़ सकते हैं: क्योंकि आपने वादा किया था कि आप नहीं करेंगे) गैर-कॉन्स सदस्यों को संशोधित कर सकते हैं।उत्परिवर्तनीय के रूप में चिह्नित सदस्यों को सदस्य समारोह के कॉन्स्टेस के बावजूद संशोधित किया जा सकता है। –

+1

@sreservoir यह 'mutable' है,' अस्थिर 'नहीं है। – jweyrich

1

यह क्या करता है this सूचक गैर स्थिरांक के लिए एक स्थिरांक सूचक के बजाय const करने के लिए एक स्थिरांक सूचक हो बनाने के लिए प्रभावी ढंग से है। तो, किसी भी समय जब आप किसी कॉन्स्ट सदस्य फ़ंक्शन में this संदर्भित करते हैं - या तो स्पष्ट रूप से या निहित रूप से - आप कॉन्स्टेंस के लिए एक कॉन्स्ट पॉइंटर का उपयोग कर रहे हैं।

तो, वर्ग तुम यहाँ है, किसी भी गैर स्थिरांक समारोह में के मामले में, this के प्रकार WithStatic const * है, जबकि स्थिरांक कार्यों में, अपने प्रकार const WithStatic * const है।

किसी भी सूचक के साथ किसी भी सूचक के साथ, आप जो कुछ भी इंगित करते हैं उसे बदल नहीं सकते हैं। इसलिए, आप इसके किसी भी सदस्य चर को बदल नहीं सकते हैं, और आप इसके किसी भी गैर-कॉन्स्ट सदस्य फ़ंक्शन को कॉल नहीं कर सकते हैं।

आम तौर पर, यदि आप उचित रूप से ऐसा कर सकते हैं, तो सदस्य कार्य को दृढ़ता से बनाना एक अच्छा विचार है, क्योंकि यह गारंटी देता है कि आप ऑब्जेक्ट की स्थिति को बदलने के लिए नहीं जा रहे हैं, और आप इसे एक कॉन्स्ट ऑब्जेक्ट के साथ कॉल कर सकते हैं।

यह सदस्य चर के लिए संभव बदल दिया है अगर वे mutable या volatile हो, लेकिन उन है कि शायद बेहतर परहेज कर रहे हैं जब तक आप भाषा के साथ अधिक परिचित हो और अधिक उन्नत विषयों रहे हैं। निश्चित रूप से, आपको आमतौर पर उनके बारे में चिंता करने की आवश्यकता नहीं होती है और जब तक आपको आवश्यकता नहीं होती तब तक उनका उपयोग नहीं करना चाहिए। this पॉइंटर की स्थिरता को दूर करना भी संभव है, जिस बिंदु पर आप इसे बदल सकते हैं, लेकिन आईआईआरसी, यह अनिर्धारित व्यवहार है, और यह निश्चित रूप से आम तौर पर एक बुरा विचार माना जाता है। ऐसे में ऐसे कई उदाहरण हैं जहां किसी ऑब्जेक्ट की स्थिति को किसी कॉन्स्ट सदस्य फ़ंक्शन के भीतर बदलना संभव है, लेकिन यह सामान्य रूप से संभव नहीं है और जब भी यह सर्वोत्तम होता है तब भी इससे बचा जाता है।

जब आप सदस्य फ़ंक्शन कॉन्स्ट करते हैं, तो आप प्रभावी रूप से वादा कर रहे हैं कि ऑब्जेक्ट की स्थिति उस फ़ंक्शन कॉल द्वारा नहीं बदली जाएगी (हालांकि स्पष्ट रूप से दुष्प्रभाव हो सकते हैं क्योंकि आप printf() जैसे कार्यों को कॉल कर सकते हैं) ।

+0

नहीं, 'अस्थिर' सदस्यों को कॉन्स्ट विधियों द्वारा बदला नहीं जा सकता, केवल 'mutable' वाले। AFAIK, गैर-परिवर्तनीय सदस्यों को बदलने का एकमात्र तरीका 'const_cast' का उपयोग कर रहा है। – jweyrich

+0

असल में नहीं, इसका प्रकार है: कॉन्स विस्टैटिक * (गैर-कॉन्स फ़ंक्शंस के लिए) और कॉन्सटैटिक * कॉन्स (कॉन्स फ़ंक्शंस के लिए)। सूचक कांस्टे तार के बाद चला जाता है। – CMircea

+0

ठीक है। सूचक वाक्यविन्यास तय। यही कारण है कि मैं सी ++ सूचक वाक्यविन्यास से नफरत करता हूं। यह बहुत गन्दा हो जाता है। अस्थिर के लिए के रूप में। नहीं, आप इसे एक कॉन्स फ़ंक्शन के भीतर नहीं बदल सकते हैं, लेकिन यह * आपके नीचे से बदल सकता है। इसलिए, यह उन चीजों के साथ फिट बैठता है जो एक कॉन्स्ट फ़ंक्शन के कॉन्स्टेस के खिलाफ जाते हैं, लेकिन नहीं, एक कॉन्स फ़ंक्शन स्वयं को अस्थिर चर बदल नहीं सकता है। –

1

यदि कोई सदस्य फ़ंक्शन "कॉन्स्ट" घोषित किया गया है, तो इसका अर्थ यह है कि फ़ंक्शन ऑब्जेक्ट की स्थिति को संशोधित नहीं करेगा। यह:

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

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

0

सहजता से, इसका मतलब है कि विधि उस ऑब्जेक्ट को संशोधित नहीं करती है जिस पर इसे कहा जाता है।

  • विधि एक वस्तु या वस्तु सूचक const रूप में घोषित किया पर कहा जा सकता है: लेकिन वास्तव में, यह दो बातें मतलब है।
  • विधि के भीतर, this सूचक const बन जाता है। नतीजतन, सभी सदस्यों (mutable घोषित किए गए को छोड़कर) const हैं, यानी विधि के संदर्भ में केवल पढ़ने के लिए। हालांकि, यह अभी संशोधित कर सकते हैं:
    • डेटा वस्तु यह
    • डेटा पर कहा जाता है के सदस्यों द्वारा की ओर इशारा किया this सूचक के माध्यम से के अलावा अन्य पहुँचा - वैश्विक डेटा सहित, डेटा विधि के मापदंडों के स्थिर सदस्यों द्वारा की ओर इशारा किया कक्षा, कक्षा की अन्य वस्तुओं, यहां तक ​​कि एक ही वस्तु (यदि ऐसा होता है तो इसमें गैर-कॉन्स्ट पॉइंटर तक पहुंच होती है या const_cast का उपयोग करके स्थिरता को छोड़ दिया जाता है)।
संबंधित मुद्दे