कक्षा परिभाषा में प्रारंभकर्ता क्यों हो सकता है?
[class.static.data]/3
[नोट: इन दोनों मामलों में, सदस्य लगातार भाव में दिखाई दे सकते
const
और
constexpr
स्थिर डेटा सदस्यों के लिए दो अपवाद के संबंध में
। - अंत नोट]
आईई। प्रारंभकर्ता के साथ, आप निरंतर अभिव्यक्तियों में उनका उपयोग कर सकते हैं, उदा।
struct s
{
static std::size_t const len = 10;
int arr[len];
};
std::size_t const s::len;
len
वर्ग परिभाषा आरंभ नहीं किया गया था, तो संकलक आसानी से अगली पंक्ति में अपने मूल्य arr
की लंबाई को परिभाषित करने में पता नहीं कर सका।
एक वर्ग परिभाषा गैर const
, गैर constexpr
स्थिर डेटा सदस्यों के लिए initializers अनुमति देने के बारे बहस कर सकते हैं, लेकिन यह आरंभीकरण आदेश के साथ हस्तक्षेप कर सकता है:
[basic.start.init]/2
स्पष्ट रूप से विशिष्ट वर्ग टेम्पलेट की सांख्यिकीय डेटा सदस्यों ने परिभाषाओं का आदेश दिया है। अन्य वर्ग टेम्पलेट स्थिर डेटा सदस्यों (यानी, स्पष्ट रूप से या स्पष्ट रूप से तत्काल तत्काल विशेषज्ञता) अनियंत्रित प्रारंभिकता है। स्थिर भंडारण अवधि वाले अन्य गैर-स्थानीय चर प्रारंभिकरण का आदेश दिया है।
यही है, प्रारंभकर्ताओं सहित परिभाषाओं का क्रम महत्वपूर्ण है। गैर-स्थानीय वस्तुओं के प्रारंभिक (गतिशील) प्रारंभिकरण को केवल अनुवाद इकाई के भीतर परिभाषित किया जाता है, यह एक और कारण है कि गैर-const
, गैर-constexpr
स्थैतिक डेटा सदस्यों के लिए प्रारंभकर्ता सहित परिभाषा क्यों होनी चाहिए।
इस अतिरिक्त परिभाषा का क्या अर्थ है?
यह पहले ही आईएमओ टिप्पणियों में उत्तर दिया गया है। हो सकता है कि आप ODR को जोड़ना चाहें, अर्थात बाह्य लिंक वाले नाम के रूप में, स्थिर डेटा सदस्य को केवल एक अनुवाद इकाई (यदि यह ओडीआर-प्रयुक्त है) में परिभाषित किया जाना चाहिए। यह अनुवाद इकाई चुनने के लिए प्रोग्रामर पर निर्भर है।
मुख्य बिंदु यह है कि परिवर्तनीय odr-used होगा या नहीं। जब तक यह नहीं है, आपको वास्तव में इसे परिभाषित करने की आवश्यकता नहीं है, क्योंकि जब भी वेरिएबल को संदर्भित किया जाता है तो यह * मूल्य * पेस्ट करने के लिए पर्याप्त होता है। –
यह ** अतिरिक्त ** परिभाषा नहीं है; यह एक परिभाषा है। कक्षा निकाय के अंदर आपके पास ** घोषणा ** है। –
जैसा कि आप अलग-अलग अनुवाद इकाइयों (= cpp फ़ाइलों) से स्थिर डेटा सदस्य तक पहुंचना चाहते हैं, आपको एक "स्थान" परिभाषित करना होगा जहां प्रत्येक अनुवाद इकाई को संदर्भित किया जाए, यानी एक एकल अनुवाद इकाई जहां स्थिर सदस्य परिभाषित किया गया हो। यह वही बात है (वैश्विक) बाहरी चर के साथ। – dyp