2011-11-20 18 views
5

इस answer से, सी ++ 03 में, () छोड़ा गया है तो पीओडी प्रकार डिफ़ॉल्ट रूप से प्रारंभ हो जाता है अन्यथा यह मूल्य-प्रारंभिक होता है।डिफ़ॉल्ट-प्रारंभिक बनाम मूल्य-प्रारंभिक

// POD type 
struct foo { 
    int x; 
}; 

// value-initialized 
new foo(); 

लेकिन यदि उपयोगकर्ता द्वारा परिभाषित कन्स्ट्रक्टर प्रदान किया गया है, तो नीचे दी गई किसी भी वस्तु को डिफ़ॉल्ट या मूल्य-प्रारंभिक माना जाएगा?

// non-POD type 
struct bar { 
    bar(int x = 0):x(x) {} 
    int x; 
}; 

new bar(); 
new bar(42); 
+1

आपके उदाहरण में, 'बार' के कन्स्ट्रक्टर के लिए कॉल' x' के प्रारंभ के दौरान मूल्य प्रदान करने के परिणामस्वरूप। – Chad

उत्तर

2

यदि आपकी कक्षा में उपयोगकर्ता द्वारा परिभाषित डिफ़ॉल्ट कन्स्ट्रक्टर है, तो डिफ़ॉल्ट और मूल्य प्रारंभिक दोनों कारण कन्स्ट्रक्टर कहलाते हैं। जो कुछ भी आगे क्या होता है निर्माता पर निर्भर है:

struct UDT 
{ 
    int a; 
    int b; 
    Foo c; 
    Foo d; 
    UDT() : a(), c() {} 
}; 

दोनों डिफ़ॉल्ट रूप और वर्ग UDT की एक वस्तु के मूल्य में प्रारंभ कारण UDT::a और UDT::c मूल्य प्रारंभ हो जाएगा (ताकि a शून्य है), क्योंकि प्रारंभकर्ता सूची तो कहते हैं, जबकि UDT::b और UDT::d स्वयं डिफ़ॉल्ट हैं- प्रारंभिक (इसलिए b अनियमित है, और d के लिए उसी तर्क को दोबारा लागू करें)।

प्रारंभ करने के विवरण के लिए, 8.5 देखें, और प्रारंभकर्ता सूचियों पर 12.6.2 (esp। Clause 8) देखें।

3

सी ++ 03 में, एक पीओडी प्रकार डिफ़ॉल्ट रूप से प्रारंभ हो जाता है अगर() छोड़ा जाता है अन्यथा यह मूल्य-प्रारंभिक होता है।

यह बिल्कुल नहीं होता है। सी ++ 03 spec के अनुसार, खंड 8.5/9, यदि कोई प्रारंभिक पॉड-प्रकार ऑब्जेक्ट के लिए कोई प्रारंभकर्ता निर्दिष्ट नहीं है, तो यह और उसके उप-ऑब्जेक्ट्स में "अनिश्चित प्रारंभिक मान है"। यह डिफ़ॉल्ट-प्रारंभिक जैसी ही बात है। डिफ़ॉल्ट-प्रारंभिकता एक ही चीज़ है जो पीओडी-प्रकार के लिए मूल्य-प्रारंभिकता है, जिसका अर्थ यह होगा कि ऑब्जेक्ट शून्य-प्रारंभिक (8.5/5) है, लेकिन यह केवल खाली प्रारंभकर्ता (यानी खाली-संश्लेषण) की उपस्थिति के साथ हो सकता है प्रति 8.5/7)। इस प्रकार आप एक खाली प्रारंभकर्ता के साथ केवल पीओडी-प्रकार को डिफ़ॉल्ट और/या मूल्य-प्रारंभ कर सकते हैं। गैर स्थैतिक पीओडी-प्रकार के लिए डिफ़ॉल्ट प्रारंभ तब नहीं होता जब कोई प्रारंभकर्ता निर्दिष्ट नहीं होता है।

आपके दूसरे उदाहरण में, गैर-पीओडी प्रकार के साथ जिसमें उपयोगकर्ता द्वारा परिभाषित कन्स्ट्रक्टर है, डिफ़ॉल्ट-प्रारंभिक तकनीकी रूप से तब होता है जब आप मान-प्रारंभकर्ता (कोष्ठक) प्रतीकों को छोड़ देते हैं। दूसरे शब्दों में:

bar* ptr_a = new bar; //default initialization 
bar* ptr_b = new bar(); //value initialization 

ध्यान रखें कि हालांकि दोनों गैर पॉड struct या वर्ग-प्रकार के साथ, अगर वहाँ एक उपयोगकर्ता परिभाषित निर्माता, डिफ़ॉल्ट-प्रारंभ और मूल्य आरंभीकरण, प्रति 8.5/5 है, दोनों कॉल उपयोगकर्ता परिभाषित कन्स्ट्रक्टर। तो अंत में, bar के प्रकार के साथ, जैसा कि आपने इसे घोषित किया है, डिफ़ॉल्ट और मूल्य प्रारंभिकता एक ही चीज़ कर रही है।

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