2014-10-30 9 views
23

में स्थिर डेटा सदस्यों को प्रारंभ करने का सही तरीका क्या है C12+ में static डेटा सदस्यों को प्रारंभ करने का सही तरीका क्या है? मुझे यह भी रूचि है कि यह सी ++ 98 से कैसे बदल गया है, सी ++ 11 से सी ++ 14 तक।सी ++ (98, 11 और 14)

// bufferedOutput.h 
class BufferedOutput 
{ 
// Static member declaration. 
static long bytecount; 
}; 

// bufferedOutput.cpp 
long BufferedOutput::bytecount = 50; 

वहाँ static डेटा सदस्यों को प्रारंभ करने के लिए अन्य तरीके हैं:

यहाँ एक उदाहरण है?

+2

यह मदद कर सकता है: http://stackoverflow.com/a/26429556/

सी ++ 17 के रूप में, हम अपने एसडीएम इनलाइन है, जो अपने में स्तरीय घोषणा एक परिभाषा में आता है कर सकते हैं 1147772 – Drax

उत्तर

27

नियम हमेशा इस प्रकार किया गया है:

  • एक const स्थिर डेटा सदस्य अभिन्न या गणना प्रकार की (एसडीएम) एक निरंतर अभिव्यक्ति के साथ कक्षा में initialised जा सकता है।

  • constexpr एसडीएम निरंतर अभिव्यक्ति के साथ कक्षा में प्रारंभ किया जाना चाहिए।

    सी ++ 17 को प्रारंभिक निर्माता की आवश्यकता नहीं होती है जब डिफ़ॉल्ट निर्माता प्रत्येक सदस्य को प्रारंभ करता है। इसके अलावा, constexpr एसडीएम अंतर्निहित इनलाइन वैरिएबल हैं, जो उनकी घोषणा को परिभाषा बनाता है (बाहरी परिभाषाएं अब बहिष्कृत हैं)।

  • अन्य प्रकार के एसडीएम में उनकी परिभाषा में प्रारंभकर्ता हो सकता है (जो कक्षा में है यदि एसडीएम inline घोषित किया गया है)।

दोनों भाषाओं में मान्य कोड के लिए सी ++ 03 और सी ++ 11 + के बीच कुछ भी काफी नहीं बदला है।

ध्यान दें कि एसडीएम के लिए जो इनलाइन नहीं हैं, इन-क्लास घोषणा — परिभाषा नहीं है, भले ही कोई प्रारंभकर्ता — प्रदान किया गया हो और उन्हें परिभाषित किया जाना चाहिए कि वे ओडीआर-प्रयुक्त हैं।

class BufferedOutput 
{ 
    static inline long bytecount = 50; 
}; 
+1

आपको यह उल्लेख करना चाहिए कि जब आप इन-क्लास प्रारंभकर्ता का उपयोग कर सकते हैं तब भी एक कक्षा की परिभाषा की आवश्यकता हो सकती है। –

+0

@ जोनाथन वाक्ली मैंने सोचा कि यह स्पष्ट है क्योंकि कक्षा में चीज हमेशा एक घोषणा है (और यदि इकाई ओडीआर-प्रयुक्त होती है तो परिभाषा की आवश्यकता होती है)। – Columbo

+0

दुर्भाग्य से यह बहुत से लोगों के लिए स्पष्ट नहीं है जो सोचते हैं कि इन-क्लास प्रारंभकर्ता भी एक परिभाषा प्रदान करता है: - \ Anyway, अगर मुझे अनुमति है तो मैं आपको अंतिम नोट के लिए एक और +1 दूंगा! –

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