2011-08-16 16 views
8

मैंने हमेशा सोचा था कि एक नया ऑब्जेक्ट बनाना हमेशा ऑब्जेक्ट पर डिफॉल्ट कन्स्ट्रक्टर को कॉल करेगा, और क्या कन्स्ट्रक्टर द्वारा कन्स्ट्रक्टर स्पष्ट या स्वचालित रूप से जेनरेट किया गया था, इससे कोई फर्क नहीं पड़ता। एक अलग सवाल का this highly regarded answer के अनुसार, इस सी ++ 98 और सी ++ 03 के बीच एक सूक्ष्म रास्ते में बदल गया है और अब की तरह तो काम करता है:सी ++ 03 में डिफॉल्ट-प्रारंभिक और मूल्य-प्रारंभिक के बीच अंतर?

struct B { ~B(); int m; }; // non-POD, compiler generated default ctor 
new B; // default-initializes (leaves B::m uninitialized) 
new B(); // value-initializes B which zero-initializes all fields since its default ctor is compiler generated as opposed to user-defined. 

किसी को भी मुझे बता सकते हैं:

  1. क्यों था मानक बदल गया, यानी यह क्या लाभ देता है या अब क्या संभव है जो पहले नहीं था;
  2. "डिफ़ॉल्ट-प्रारंभिक" और "मूल्य-प्रारंभिक" शब्द का क्या उल्लेख है?
  3. मानक का प्रासंगिक हिस्सा क्या है?
+0

नए सी ++ 11 मानक का प्रासंगिक हिस्सा 8.5 ("प्रारंभकर्ता") खंड 5,6,7 है। –

+0

शायद यह लोगों को डिफ़ॉल्ट सीटीआर का उपयोग करने का विकल्प देता है या नहीं। सी ++ के पुराने संस्करण में जब कोई पैरामीटर नहीं थे तो आमतौर पर ब्रैकेट को याद किया जाता था। तो नए विकल्प पर ब्रैकेट होने से कम विरासत कोड प्रभावित होगा। – QuentinUK

+0

मैं इसे बदल नहीं सकता, बल्कि सुधार करता हूं। यह कम से कम संदर्भ के संदर्भ में समझ में आता है std :: map जहां [] द्वारा बनाए गए मान मूल्य intialized हैं, इसलिए उदा। std :: map सभी यू * 0 – PlasmaHH

उत्तर

2

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

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

यह §8.5 प्रारंभकर्ताओं में वर्णित है, और यह नेविगेट करने के लिए तुच्छ नहीं है। की परिभाषा दी गई शून्य को प्रारंभ, डिफ़ॉल्ट आरंभ कर और मूल्य आरंभ कर 5 वीं पैरा हैं:

के प्रकार टी का एक उद्देश्य शून्य से प्रारंभ का अर्थ है:

- अगर टी है एक स्केलर प्रकार (3.9), ऑब्जेक्ट को 0 (शून्य) के मान में सेट किया जाता है जो टी में परिवर्तित होता है;

- यदि टी गैर-यूनियन श्रेणी का प्रकार है, तो प्रत्येक गैर-स्टेटिक डेटा सदस्य और प्रत्येक बेस-क्लास सबोबजेक्ट ज़ीरोइनिलाइज्ड होता है;

- यदि टी एक यूनियन प्रकार है, तो ऑब्जेक्ट का पहला नाम डेटा सदस्य 89) शून्य-प्रारंभिक है;

- यदि टी एक सरणी प्रकार है, तो प्रत्येक तत्व शून्य-प्रारंभ होता है;

- यदि टी एक संदर्भ प्रकार है, तो कोई प्रारंभिकता नहीं की जाती है।

प्रकार टी की एक वस्तु डिफ़ॉल्ट आरंभ करने के लिए इसका मतलब है:

- अगर टी एक गैर पॉड वर्ग प्रकार (खंड 9), टी के लिए डिफ़ॉल्ट निर्माता कहा जाता है (और आरंभीकरण बीमार बनाई है अगर टी में कोई सुलभ डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है);

- यदि टी एक सरणी प्रकार है, तो प्रत्येक तत्व डिफ़ॉल्ट-प्रारंभिक है;

- अन्यथा, ऑब्जेक्ट शून्य-प्रारंभिक है।

के प्रकार टी का एक उद्देश्य मूल्य आरंभ कर देगा का अर्थ है:

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

- यदि टी उपयोगकर्ता द्वारा घोषित कन्स्ट्रक्टर के बिना गैर-यूनियन क्लास प्रकार है, तो प्रत्येक गैर स्थैतिक डेटा सदस्य और टी के बेस-क्लास घटक मूल्य-प्रारंभिक होते हैं;

- यदि टी एक सरणी प्रकार है, तो प्रत्येक तत्व मूल्य-प्रारंभिक है;

- अन्यथा, वस्तु शून्य आरंभ नहीं हो जाता

एक प्रोग्राम है जो डिफ़ॉल्ट-प्रारंभ या संदर्भ प्रकार का एक संस्था के मूल्य-आरंभीकरण के लिए कहता है विकृत हैं। यदि टी एक सीवी-योग्य प्रकार है, तो टी का सीवी-अयोग्य संस्करण ज़ीरोइनिलाइजेशन, डिफ़ॉल्ट-प्रारंभिकरण, और मूल्य-प्रारंभिकरण की इन परिभाषाओं के लिए उपयोग किया जाता है।

+0

नहीं होता है, आपका अग्रणी अनुच्छेद डिफ़ॉल्ट-प्रारंभिक व्यवहार के व्यवहार को परिभाषित करता है या तो ctor या उसके बाएं uninitialized का उपयोग कर। मेरा प्रश्न 8.5 आरंभकर्ता खंड के शामिल उद्धरण की व्याख्या है जो डिफ़ॉल्ट-प्रारंभिक परिभाषित करता है जो अंतिम चरण के रूप में है ... "- अन्यथा, ऑब्जेक्ट शून्य-प्रारंभिक है"। ऐसा लगता है कि अगर कोई सीटीओ नहीं है तो शून्य-प्रारंभिक बनाम नियमों का उपयोग करके इसे अनियंत्रित छोड़ दें। – TheChrisONeil

+0

@CBO: वह विशेष उद्धरण सी ++ 03 से है, सी ++ 11 में अंतिम आइटम बदल गया है और पढ़ता है: * अन्यथा, कोई प्रारंभिक प्रदर्शन नहीं किया जाता है *। इस बिंदु पर कुंजी बाद में कुछ पैराग्राफ लिखी गई है। किसी ऑब्जेक्ट के लिए कोई प्रारंभकर्ता नहीं है, सी ++ 03 में ऑब्जेक्ट को सी ++ 11 में अनियमित (इन/9) छोड़ दिया गया है, ऑब्जेक्ट * डिफ़ॉल्ट-प्रारंभिक * (/ 12) है।सुनिश्चित नहीं है कि यह आपकी चिंता का उत्तर देता है –

+0

समझ में आता है और अनुसरण करने के लिए धन्यवाद। मैं अब आपकी पोस्ट को अपडेट करने की अनुशंसा करता हूं जिसमें सी ++ 11 की सामग्री शामिल है। – TheChrisONeil

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