2010-09-14 16 views
109

की सी ++ अर्थ विज्ञान सी ++ विशेष रूप में, जो उदाहरण के लिए के बीच अर्थ अंतर हैं:`स्थिर const`` बनाम const`

static const int x = 0 ; 
लिंकेज के रूप में

और दोनों static के लिए

const int x = 0 ; 

और एक भंडारण वर्ग विनिर्देशक (यानी एक समारोह के अंदर और बाहर)।

+6

'स्थिर 'शायद सी ++ में सबसे अधिक अधिभारित कीवर्ड है। आपके कोड का अर्थ व्यापक रूप से भिन्न होता है कि यह नामस्थान क्षेत्र में, वर्ग के दायरे पर या फ़ंक्शन स्कोप पर है या नहीं। आप इसे स्पष्ट करना चाहते हैं। – sbi

+1

@ एसबीआई: मैंने सोचा कि मैंने पहले ही किया है। फ़ंक्शन स्कोप (जहां यह एक स्टोरेज क्लास विनिर्देशक है) और फ़ाइल स्कोप (जहां यह एक लिंकेज विनिर्देशक है)। वर्ग के सदस्यों और नामस्थान स्कोप्ड चर विशेष रूप से इस प्रश्न के संबंध में मेरे लिए चिंता का विषय नहीं हैं, हालांकि अगर किसी को लगता है कि एक दिलचस्प भेद है, तो उसे भी कवर करने में संकोच न करें। – Clifford

+0

@Clifford: मुझे खेद है कि मैंने उन अंतिम शब्दों को अनदेखा किया। हालांकि, इसने आपके हिस्से पर एक गलतफहमी का खुलासा किया: सी ++ में, फ़ाइल स्कोप _is_ नेमस्पेस स्कोप। यदि आप किसी भी नामस्थान के बाहर कुछ भी घोषित करते हैं, तो यह केवल _global namespace_ से संबंधित होगा (और पूर्व में कोई पहचानकर्ता नहीं होने के साथ पूर्ववर्ती '::' के माध्यम से सुलभ है। मुझे वैश्विक नामस्थान और इसमें नामित किसी भी नामस्थान के बीच किसी भी सार्थक अंतर के बारे में पता नहीं है। निश्चित रूप से 'स्थिर 'वस्तुओं के बारे में कोई नहीं है। – sbi

उत्तर

101

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

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

कक्षा के भीतर, मूल रूप से कार्यों के लिए एक ही चीज़, एक उदाहरण const मान सीटीओआर-प्रारंभकर्ता-सूची में गणना की जा सकती है। एक static const स्टार्टअप प्रारंभ के दौरान सेट किया गया है और शेष कार्यक्रम के लिए अपरिवर्तित बनी हुई है। (नोट: static सदस्यों के लिए कोड एक छोटे से अलग दिखता है क्योंकि घोषणा और प्रारंभ अलग होती है।)

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

+1

क्या फ़ाइल स्कोप नामक कुछ भी है? मैं सिर्फ 3.3 डॉलर की जांच कर रहा था और मुझे लगता है कि निकटतम 'नेमस्पेस स्कोप' है। क्या मेरी समझ सही है? सी ++ 03 मानक केवल परिशिष्टों में फ़ाइल स्कोप का उल्लेख करता है – Chubsdad

+0

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

+1

मैं सुझाव दूंगा कि * फ़ाइल स्कोप * कंपाइलर की बजाय लिंकर का एक आर्टेफैक्ट है, इसलिए भाषा मानक में अधिक ध्यान नहीं दिया जा सकता है। कड़ाई से यह शायद "संकलन इकाई गुंजाइश" है। वाक्यांश के लिए – Clifford

संबंधित मुद्दे