2013-05-04 8 views
10

सी ++ में प्रारंभ, static सदस्यों लेकिन इसके कुछ अपवाद वर्ग शरीर में आरंभ नहीं किया जा सकता है: const अभिन्न प्रकार कीमें स्तरीय स्थिर डेटा सदस्यों

  • static सदस्यों
  • static के सदस्य हो सकते हैं constexpr शाब्दिक प्रकार होना चाहिए

आप व्याख्या कर सकते हैं क्यों इन पूर्व ceptions?

इसके अलावा, इस रखती है:

यहां तक ​​कि अगर एक const static डेटा सदस्य वर्ग शरीर में आरंभ नहीं हो जाता, कि सदस्य आमतौर पर वर्ग परिभाषा के बाहर परिभाषित किया जाना चाहिए।

यह मुझे कभी समझा नहीं गया। इस अतिरिक्त परिभाषा का क्या मतलब है?

बस कुछ अंतर्ज्ञान प्राप्त करने का प्रयास कर रहा है।

+2

मुख्य बिंदु यह है कि परिवर्तनीय odr-used होगा या नहीं। जब तक यह नहीं है, आपको वास्तव में इसे परिभाषित करने की आवश्यकता नहीं है, क्योंकि जब भी वेरिएबल को संदर्भित किया जाता है तो यह * मूल्य * पेस्ट करने के लिए पर्याप्त होता है। –

+3

यह ** अतिरिक्त ** परिभाषा नहीं है; यह एक परिभाषा है। कक्षा निकाय के अंदर आपके पास ** घोषणा ** है। –

+1

जैसा कि आप अलग-अलग अनुवाद इकाइयों (= cpp फ़ाइलों) से स्थिर डेटा सदस्य तक पहुंचना चाहते हैं, आपको एक "स्थान" परिभाषित करना होगा जहां प्रत्येक अनुवाद इकाई को संदर्भित किया जाए, यानी एक एकल अनुवाद इकाई जहां स्थिर सदस्य परिभाषित किया गया हो। यह वही बात है (वैश्विक) बाहरी चर के साथ। – dyp

उत्तर

6

कक्षा परिभाषा में प्रारंभकर्ता क्यों हो सकता है?

[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 को जोड़ना चाहें, अर्थात बाह्य लिंक वाले नाम के रूप में, स्थिर डेटा सदस्य को केवल एक अनुवाद इकाई (यदि यह ओडीआर-प्रयुक्त है) में परिभाषित किया जाना चाहिए। यह अनुवाद इकाई चुनने के लिए प्रोग्रामर पर निर्भर है।

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