2008-12-10 7 views
55

कक्षा सदस्यों को const के रूप में घोषित किया जाना चाहिए कन्स्ट्रक्टर बॉडी के बजाय कन्स्ट्रक्टर प्रारंभकर्ता सूची में आरंभ किया जाना चाहिए?सदस्यों को इसके शरीर के बजाय कन्स्ट्रक्टर प्रारंभकर्ता में क्यों शुरू किया जाना चाहिए?

दोनों के बीच क्या अंतर है?

उत्तर

90

सी ++ में, निष्पादन के शरीर में निष्पादन में प्रवेश करते समय एक वस्तु पूरी तरह से प्रारंभ की जाती है।

तुमने कहा था:

"? मैं जानना चाहता है कि स्थिरांक यह के शरीर में से सूची बल्कि निर्माता प्रारंभकर्ता में intialized किया जाना चाहिए था।"

आप क्या याद कर रहे हैं कि initialisation initialisation सूची में होता है, और काम निर्माता के शरीर में होता है। तर्क में कदम:

1) एक कॉन्स ऑब्जेक्ट केवल आरंभ किया जा सकता है।

2) किसी ऑब्जेक्ट में प्रारंभिक सूची में उसके सभी सदस्यों की शुरुआत हुई है। यहां तक ​​कि यदि आप उन्हें स्पष्ट रूप से वहां प्रारंभ नहीं करते हैं, तो संकलक खुशी से आपके लिए ऐसा करेगा :-)

3) इसलिए, 1) और 2) एक साथ, एक सदस्य जो कॉन्स्ट है, केवल उसके पास असाइन किया जा सकता है प्रारंभिकरण में, जो प्रारंभिक सूची के दौरान होता है।

+3

आपके पहले उत्तर के लिए बधाई देता है ...^_^ – paercebal

+1

नंबर 2 के बारे में बधाई। ASFAIK यह केवल डिफ़ॉल्ट ctors के साथ गैर-निर्मित प्रकार के लिए सच है। मैं कहूंगा कि सूची 1 के ऊपर जो कहा गया है उसके साथ नंबर 1 प्रश्न के उत्तर देने के लिए पर्याप्त है। वैसे भी, मेरे द्वारा अच्छा जवाब +1! –

+1

@AndreasMagnusson: C++ 11 से पहले, शुरुआती प्रारंभिक सूची में नामित सभी सदस्यों के लिए डिफ़ॉल्ट प्रारंभिकता नहीं की जाती है, जिसमें अंतर्निहित आदिम प्रकार शामिल हैं (जिसके लिए डिफ़ॉल्ट प्रारंभिक अर्थ "बिल्कुल प्रारंभ नहीं है")। यदि कोई (सुलभ) डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है, तो यह एक संकलित त्रुटि है। फिर ब्रेस-या-बराबर-प्रारंभकर्ताओं ने ये सब बदल दिया। –

9

const और संदर्भ चर को उनके द्वारा घोषित लाइन पर प्रारंभ किया जाना चाहिए।

class Something 
{ 
    private: 
     const int m_nValue; 
    public: 
     Something() 
     { 
      m_nValue = 5; 
     } 
    }; 

कोड के बराबर होगा;

const int nValue; // error, const vars must be assigned values immediately 
nValue = 5; 

निर्माता के शरीर में स्थिरांक या संदर्भ सदस्य चर मान आवंटित पर्याप्त नहीं है।

सी ++ सदस्य चर को प्रारंभ करने का एक और तरीका प्रदान करता है जो सदस्य चर को प्रारंभ करने के बजाय बाद में बनाए जाने की अनुमति देता है। यह प्रारंभिक सूची के उपयोग के माध्यम से किया जाता है।

आप वैरिएबल को मानों को दो तरीकों से असाइन कर सकते हैं: स्पष्ट रूप से और निहित: क्लिपबोर्डप्रिंट पर सादेकॉपी देखें?

int nValue = 5; // explicit assignment 
double dValue(4.7); // implicit assignment 

प्रारंभिक सूची का उपयोग करना निहित असाइनमेंट करने के समान ही है।

याद रखें कि सदस्य प्रारंभिक सूची, आधार और सदस्य डेटा ऑब्जेक्ट्स को प्रारंभ करने के लिए उपयोग की जाती है, परिभाषा में है, कन्स्ट्रक्टर की घोषणा नहीं।

cpp-tutorial और Code Wrangler पर अधिक।

-2

क्योंकि उपयोग के पहले घोषणा के समय निरंतर चर और संदर्भ प्रारंभ किए जाने चाहिए। लेकिन रचनाकार एक वैरिएबल को मान निर्दिष्ट करेंगे, वेरिएबल को निष्क्रिय नहीं करते हैं, इसलिए आपको निरंतर और संदर्भ

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