A
और s::A
अलग हैं?
सबसे बड़ा अंतर यह है कि A
की घोषणा भी एक परिभाषा है, जबकि s::A
की है कि नहीं है। मुझे यकीन नहीं है कि "विशेष नियम" से आपका क्या मतलब है, लेकिन प्रत्येक मामले में static
का एक अलग अर्थ है।
नामस्थान स्कोप पर, यह आंतरिक लिंक देता है ताकि ऑब्जेक्ट वर्तमान अनुवाद इकाई के बाहर दिखाई न दे। ध्यान दें कि static
यहां अनावश्यक है, क्योंकि नामस्थान स्कोप पर निरंतर चर के डिफ़ॉल्ट रूप से आंतरिक संबंध हैं।
कक्षा के दायरे में, इसका मतलब है कि कक्षा के किसी भी तत्कालता से स्वतंत्र एक वस्तु है।
जब उनका उपयोग उनके शाब्दिक मूल्य के साथ बदल दिया जाएगा?
के बाद से दोनों घोषणा में एक initialiser साथ अभिन्न स्थिरांक हैं, दोनों लगातार भाव में इस्तेमाल किया जा सकता है, और संकलक संकलन समय स्थिरांक साथ उनके मूल्यों को बदलने के लिए सक्षम है।
शायद एक और उचित सवाल यह है कि एक परिभाषा कब आवश्यक है?
सी ++ 11 में, यह आवश्यक है यदि परिवर्तक odr-used - मोटे तौर पर बोल रहा है, यदि आप ऐसा कुछ करते हैं जिसके लिए इसके मूल्य के बजाय चर के पते की आवश्यकता होती है।
सी ++ 03 में, मुझे लगता है कि यदि चर का उपयोग किया जाता है तो इसकी आवश्यकता होती है, हालांकि कोई डायग्नोस्टिक आवश्यक नहीं है और यदि आप केवल इसके मान का उपयोग करते हैं तो कई कंपाइलर शिकायत नहीं करेंगे। मुझसे गलती भी हो सकती है; पुराने नियमों को शांत कर दिया गया था और अब मैं उन्हें भूलने में सक्षम होने में खुश हूं।
जब मैं इसका पता ले सकता हूं?
उस चर को सी ++ 03 और सी ++ 11 में परिभाषा की आवश्यकता होती है। परिभाषा चर के लिए भंडारण आवंटित करती है, ताकि उसके पास पता हो।
जब मुझे उन्हें अलग से परिभाषित करने की आवश्यकता है?
नेमस्पेस स्कोप पर एक परिवर्तनीय घोषणा भी एक परिभाषा है, जब तक कि आप इसे extern
घोषित न करें; तो आपके पहले चर को एक अलग परिभाषा की आवश्यकता नहीं है।
कक्षा के दायरे में एक परिवर्तनीय घोषणा परिभाषा नहीं है; इसलिए आपके दूसरे चर को C++ 03 में एक अलग परिभाषा की आवश्यकता होती है, और सी ++ 11 में यदि यह odr-used है।
आपको क्यों लगता है कि कोई अंतर है? विशेष उपचार यह है कि उन्हें निरंतर अभिव्यक्ति माना जा सकता है। "शाब्दिक मूल्य के साथ प्रतिस्थापन" के संदर्भ में मत सोचो। – Pubby
@ पब्बी 'const int और x = s :: ए;' इसके बाद, और कहीं भी 'x' का उपयोग करें। संभावना है कि आपको एक लिंकर त्रुटि मिलेगी। – hvd