दिलचस्प पोस्ट
कैसे निश्चित रूप से निर्धारित चौड़ाई फ़ाइलों को पार्स करने के लिए? अजगर कैसे फ़ाइल को रिक्त या नहीं चेक करें मैं कैसे देखूं अगर वाई-फाई एंड्रॉइड पर कनेक्ट है? 'सुडो मणि इंस्टॉलेशन' या 'मणि इंस्टॉलेशन' और रत्न रत्न JQuery में प्रत्येक () फ़ंक्शन को कैसे तोड़ने / बाहर निकलना है? जावास्क्रिप्ट कूड़ा संग्रह क्या है? स्विफ्ट में NSNotificationCenter addObserver आउटलुक '07 / '10 / '13 पर पूर्ण चौड़ाई वाली पृष्ठभूमि क्लिक करें घटना गतिशील उत्पन्न तत्वों पर काम नहीं करता सीएमवाइके को आरजीबी रंग कन्वर्ट? सी ++ स्ट्रिंग लीटरल्स एस्केप वर्ण के लिए नियम एक गुण फाइल में एक पासवर्ड की सुरक्षा कैसे मानक बॉर्डरलेस बटन बनाने के लिए (जैसे कि डिजाइन दिशानिर्देश में उल्लेख किया गया है)? कैसे एक सूची <string> एक DataGridView नियंत्रण करने के लिए बाध्य करने के लिए? Android को कैसे कॉपी करें: संपादन = "गलत" कोड में?

क्या "const" का मतलब सिर्फ पढ़ने-योग्य या कुछ और है?

वास्तव में क्या होता है? केवल पढ़ने के लिए मेरे लिए अपने अर्थ को समझना लगता है, लेकिन, मुझे यकीन नहीं है कि मैं सही हूं।

यदि केवल पढ़ने के लिए और const भिन्न हैं, तो कोई मुझे बता सकता है क्यों?

इस सवाल का उत्तर क्या था, जहां उन्होंने कहा कि "बस" का अर्थ है "केवल" का अर्थ सी-सी में पढ़ा गया है। मैंने सोचा था कि सभी const मतलब है, भले ही यह सी या सी ++ था। उसका क्या मतलब है?

सी बनाम C ++ में const में विशिष्ट अंतर के उत्तर के लिए, मैंने एक नया प्रश्न बनाया है: "const" सी और सी ++ में कैसे भिन्न होता है? आर के अनुसार …

वेब के समाधान से एकत्रित समाधान "क्या "const" का मतलब सिर्फ पढ़ने-योग्य या कुछ और है?"

एक चर के रूप में परिभाषित करके आप संकलक संकेत मिलता है कि आपके पास उस चर को संशोधित करने का कोई इरादा नहीं है। लेकिन इसका मतलब यह नहीं है कि दूसरों के पास नहीं है! यह कुछ ऑप्टिमाइज़ेशन की अनुमति देने के लिए है और एक संकलन त्रुटि द्वारा नोटिफिकेशन किया जा सकता है (ध्यान दें, यह ज्यादातर त्रुटि संकलन करता है, जबकि const == ReadOnly रनटाइम त्रुटियों का मतलब होगा)।

const मतलब केवल पढ़ने के लिए नहीं है, क्योंकि आप const volatile लिख सकते हैं, इसका मतलब होगा कि यह कभी भी स्वयं बदल सकता है, लेकिन मुझे इसे संशोधित करने का कोई इरादा नहीं है।

संपादित करें: यहां एक शास्त्रीय उदाहरण है: मैं उस कोड को लिख रहा हूं जो स्मृति-मैप किए गए पोर्ट से वर्तमान समय को पढ़ता है। विचार करें कि आरटीसी को स्मृति DWORD 0x1234 पर मैप किया गया है

 const volatile DWORD* now = *(DWORD*)0x1234; 

यह const क्योंकि यह केवल पढ़ने के लिए पोर्ट है, और यह volatile क्योंकि हर बार मैं इसे पढ़ूंगा, यह बदल जाएगा।

यह भी ध्यान रखें कि कई आर्किटेक्चर वैश्विक रूप से विकिरण को प्रभावी रूप से केवल पढ़ने के लिए घोषित करते हैं क्योंकि यूबी उन्हें संशोधित करने के लिए है। इन मामलों में यूबी स्वतः रनटाइम-त्रुटि के रूप में प्रकट होगा अन्य मामलों में यह एक असली यूबी होगा 🙂

यहां एक अच्छा पढ़ना है: http://publications.gbdirect.co.uk/c_book/chapter8/const_and_volatile.html

संकलक संशोधित होने के लिए const रूप में घोषित कुछ की अनुमति नहीं देगा। जैसा कि आप कहते हैं

यह ज्यादातर फ़ंक्शन प्रोटोटाइप में उपयोग किया जाता है ताकि उपयोगकर्ता को यह सूचित किया जा सके कि फ़ंक्शन यह स्पर्श नहीं करेगा या जब पॉइंटर्स पारित हो जाएंगे यह अपने आप के लिए असफल रूप में काम करता है

बहुत से लोग आपको बता रहे हैं कि const मतलब है कि आप इसे संशोधित नहीं कर सकते। यह स्पष्ट रूप से गलत है const तुच्छ को दूर किया जा सकता है इस स्निपेट को नोट करें:

 void foo(const int *somevalue) { int *p = (int*) somevalue; *p = 256; // OMG I AM EVIL!!!!11 } 

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

कुछ मामलों में मानक जानबूझकर const तोड़ता है उदाहरण के लिए strstr के रिटर्न वैल्यू को नोट करें: परिभाषा के द्वारा यह आपको const बफर में ऑफसेट देता है … लेकिन लौटा मूल्य const नहीं है क्यूं कर? खैर, यह गैर- const बफर पर strstr के रिटर्न वैल्यू का सार्थक उपयोग करेगा।

बाइट के लिए दो बाइट समान (टिप्पणियों को छोड़कर) न्यूनतम केस उदाहरण …

पहले सी में, जीसीसी एक चेतावनी का उत्सर्जन करेगा …

 / * एक समारोह की एक सरणी के लिए एक सूचक ले
  दो केवल पूर्णांक पढ़ता है। * /
 शून्य (const int (* पैरा) [2]);

 शून्य बी (शून्य)
 {
    int सरणी [2] = {1,2};
    const int crray [2] = {1,2}; 
 / * सी एक पठन-योग्य स्थान में इसे छिपाने का अधिकार सुरक्षित रखता है। * /

    एक (एंड सरणी); 
 / * चेतावनी: असंगत सूचक प्रकार से 'ए' का तर्क गुजर रहा है * /
    एक (और क्र्रे);  /* ठीक!*/
 }

अब सी ++ में एक ही बात … जी ++ इसके साथ काफी खुश है।

 // समारोह एक सरणी के लिए एक संकेतक ले 
 / दो दो integers जो इसे संशोधित नहीं करने का वादा किया है 
 // (जब तक कि हम इसे नष्ट नहीं करते हैं; -पी)
 शून्य (const int (* पैरा) [2]);

 शून्य बी (शून्य)
 {
    int सरणी [2] = {1,2};
    const int crray [2] = {1,2};

    एक (एंड सरणी);  // सी + + इस के साथ कोई समस्या नहीं है
    एक (और क्र्रे);  // ठीक!
 }

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

 class Foo { int data; void Bar(); void ConstBar() const; }; void Foo::ConstBar() const { // Error! cannot modify i as ConstBar is a const member function. // i = 0; } // Usage: const Foo foo_instance; // Error! cannot call non-const member on a const object. // foo_instance.Bar(); // OK foo_instance.ConstBar(); 

Const का मतलब है कि एक सूचक या संदर्भ को const को बिना कलेक्शन के लिखने या पढ़ने-संशोधित-लेखन ऑपरेशन के लिए उपयोग नहीं किया जा सकता इसका अर्थ यह नहीं है कि C ++ मानक इसका दावा करने का प्रयास करता है (सी ++ मानक इस पर गलत है)।

इस तरह परिभाषित एक चर:

  /* auto */ int const x = 1; 

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

यह बदतर दुर्भाग्यपूर्ण है क्योंकि कंस्ट्रेंट द्वारा प्रदान अनुबंध बेहद कमजोर है, और विशेष रूप से मेमोरी स्थान को इंगित या निर्दिष्ट करने के कैशिंग को अनुमति देने में विफल रहता है, ठीक उसी तरह क्योंकि इसका अस्थायी भंडारण नहीं है।

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

यह चर के साथ कुछ नहीं करना है:

 int const *p = (int*)malloc(sizeof(int)); 

और भंडारण के साथ करने के लिए स्पष्ट रूप से थोड़ा सा (मॉलोक'एड स्टोर हमेशा लिखने योग्य है)।

इसके बजाय आपको कॉन्स्ट को प्रोग्रामर के प्रयोजनों के लिए प्रोग्रामर के अनुसार, कार्यक्रम के कुछ हिस्सों के बीच आविष्कारों, दायित्वों या आवश्यकताओं को संप्रेषित करने और प्रकार सिस्टम द्वारा प्रचारित करने के एक तरीके के रूप में सोचना चाहिए। दुर्भाग्य से टाइप सिस्टम ध्वनि नहीं है और ठीक से कंस्ट्रक्शन को ठीक से प्रसारित करने में विफल रहता है:

 X *last; struct X { int a; X() : a(0) { last=this; } }; X const x; // x is const? last->a = 1; //really ?? 

आईएमएचओ एकमात्र अवसर है कि एक कंपाइलर को अपरिवर्तनीय स्टोर बनाना पड़ता है, वास्तविक स्ट्रैटेन्ट्स जैसे स्ट्रिंग लिटरल्स (हो सकता है) या स्टैटिक (ग्लोबल) भंडारण के लिए। स्वचालित, ढेर और अस्थायी भंडारण को केवल अभ्यास में ही पढ़ा नहीं जा सकता।