2013-01-10 27 views
14

मैंने केवल कल ही सीखा है कि प्रारंभकर्ता सूची आइटमों के पैरामीटर निर्दिष्ट करना वैकल्पिक है। हालांकि, इस मामले में होता है के लिए नियम क्या हैं?सी ++ प्रारंभकर्ता सूची में डिफ़ॉल्ट मान

नीचे दिए गए उदाहरण में, क्या पीआरआर 0 पर शुरू किया जाएगा, झूठी टॉगल करेगा, और बार डिफ़ॉल्ट-निर्मित होगा? मुझे लगता है कि इस सवाल का एक तरह से बेमानी है, क्योंकि वहाँ अगर अनिर्दिष्ट तर्क मान == अपरिभाषित व्यवहार प्रारंभकर्ता सूचियों में थोड़ा बिंदु होगा।

क्या मुझे सी ++ मानक के अनुभाग की भी ओर इशारा किया जा सकता है जो प्रारंभकर्ता सूची आइटमों के मामले में व्यवहार को तर्क नहीं दिया जा रहा है?

class Bar 
{ 
    Bar() { } 
}; 

class SomeClass; 
class AnotherClass 
{ 
public: 
    SomeClass *ptr; 
    bool toggle; 
    Bar bar; 

    AnotherClass() : ptr(), toggle(), bar() { } 
    // as opposed to... 
    // AnotherClass() : ptr(NULL), toggle(false), bar(Bar()) { } 
}; 
+0

[खाली आरंभीकरण के साथ निर्माता प्रारंभ सूची] के संभावित डुप्लिकेट (https://stackoverflow.com/questions/11164394/constructor-initialization-list-with-empty-initialization) – Justin

उत्तर

12

हां, सदस्यों को क्रमशः शून्य और डिफ़ॉल्ट-निर्मित ऑब्जेक्ट में प्रारंभ किया जाएगा।

सी ++ 11 मानक निर्दिष्ट 12.6.2/7 में इस व्यवहार:

अभिव्यक्ति-सूची या एक मेम-प्रारंभकर्ता में braced-init-सूची प्रयोग किया जाता है नामित subobject प्रारंभ करने (या, एक सौंपने के निर्माता, पूरा वर्ग वस्तु) डायरेक्ट-आरंभीकरण के लिए 8.5 की प्रारंभ नियमों के अनुसार के मामले में।

बदले में, 8.5/10 में लिखा है:

एक वस्तु जिसका प्रारंभकर्ता कोष्ठकों के एक खाली सेट है, जैसे कि,(), मूल्य प्रारंभ किया जाएगा।

पैरा 8.5/7 को परिभाषित करता है मूल्य प्रारंभ: प्रकार टी का एक उद्देश्य मूल्य आरंभ कर

करने का अर्थ है:

  • अगर टी है (संभवत: सीवी-योग्य) क्लास प्रकार (क्लॉज 9) उपयोगकर्ता द्वारा प्रदत्त कन्स्ट्रक्टर (12.1) के साथ, फिर टी के लिए डिफ़ॉल्ट कन्स्ट्रक्टर कहा जाता है (और प्रारंभिकता बीमार है यदि टी के पास कोई सुलभ डिफ़ॉल्ट नहीं है निर्माता);
  • यदि टी (संभवत: सीवी-योग्य) गैर संघ वर्ग प्रकार एक उपयोगकर्ता द्वारा प्रदान की निर्माता के बिना है, तो वस्तु, शून्य प्रारंभ है और कि अगर टी के परोक्ष-घोषित डिफ़ॉल्ट निर्माता गैर तुच्छ है निर्माता कहा जाता है।
  • यदि टी एक सरणी प्रकार है, तो प्रत्येक तत्व मान-प्रारंभिक है;
  • अन्यथा, ऑब्जेक्ट शून्य-प्रारंभिक है।

और अंत में, 8.5/5 को परिभाषित करता है शून्य प्रारंभ:

करने के लिए एक वस्तु या प्रकार टी के संदर्भ शून्य से प्रारंभ का अर्थ है:

  • अगर टी एक है स्केलर प्रकार (3.9), ऑब्जेक्ट 0 (शून्य) पर सेट किया गया है, जिसे एक अभिन्न निरंतर अभिव्यक्ति के रूप में लिया गया है, जिसे टी में परिवर्तित किया गया है;
  • अगर टी एक (संभवतः सीवी-योग्य) गैर संघ वर्ग प्रकार है, प्रत्येक गैर स्थिर डेटा सदस्य और प्रत्येक आधार स्तरीय subobject शून्य प्रारंभ और गद्दी शून्य बिट्स को आरंभ नहीं हो जाता है,
  • यदि टी एक (संभवतः सीवी-योग्य) संघ प्रकार है, तो ऑब्जेक्ट का पहला गैर स्थैतिक नामित डेटा सदस्य शून्य - प्रारंभ होता है और पैडिंग शून्य बिट्स में प्रारंभ किया जाता है;
  • यदि टी सरणी प्रकार है, तो प्रत्येक तत्व शून्य-प्रारंभ होता है;
  • यदि टी संदर्भ प्रकार है, तो कोई प्रारंभिकता नहीं की जाती है।
+0

बहुत बढ़िया और विस्तृत। बस मैं क्या देख रहा था - धन्यवाद! –

2

Initialisations [dcl.init] में (उर्फ 8.5)

प्वाइंट 10 कवर कर रहे हैं का कहना है:

एक वस्तु जिसका प्रारंभकर्ता कोष्ठकों के एक खाली सेट है, यानी,(), मूल्य-प्रारंभ किया जाएगा।

मूल्य initialisation, बस, डिफ़ॉल्ट कक्षाओं के लिए निर्माण और गैर वर्ग प्रकार के लिए शून्य initialisation डाल दिया है।

6

नीचे दिए गए उदाहरण में, 0 पर प्रारंभ होगा PTR जा, गलत पर टॉगल, और बार डिफ़ॉल्ट-निर्माण किया?

हां। यदि कोई सदस्य प्रारंभकर्ता प्रारंभिक सूची में रिक्त कोष्ठक के साथ प्रारंभकर्ता सूची में प्रकट होता है, तो वह सदस्य मान प्रारंभिक है। इसका मतलब है कि संख्यात्मक प्रकार शून्य, पॉइंटर्स को शून्य, और उस कन्स्ट्रक्टर का उपयोग करके डिफ़ॉल्ट कन्स्ट्रक्टर वाले वर्गों के लिए प्रारंभ किया जाएगा।

यदि आप प्रारंभिक सूची में सदस्य को शामिल नहीं करते हैं, तो यह डिफ़ॉल्ट प्रारंभिक होगा; उस स्तिथि में। संख्यात्मक और सूचक प्रकार अनियंत्रित छोड़े जाएंगे।

क्या मुझे सी ++ मानक के अनुभाग की भी ओर इशारा किया जा सकता है जो प्रारंभकर्ता सूची आइटमों के मामले में व्यवहार को तर्क नहीं दिया जा रहा है?

सी ++ 11 12.6.2/7 निर्दिष्ट करता है कि नियम प्रत्यक्ष प्रारंभिक के समान हैं।

सी ++ 11 8.5/16 यह बताता है कि अगर initialiser () है, वस्तु मूल्य initialised है।

सी ++ 11 8.5/7 मूल्य प्रारंभिकता को परिभाषित करता है।

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

  • कोई संबंधित समस्या नहीं^_^