मैं मूल्य और डिफ़ॉल्ट- और शून्य-आरंभीकरण के बारे में बहुत उलझन में हूं। और विशेषकर जब वे विभिन्न मानकों C ++ 03 और C ++ 11 (और C ++ 14 ) के लिए किक करते हैं ।
मैं उद्धृत कर रहा हूं और वास्तव में अच्छे उत्तर का विस्तार करने की कोशिश कर रहा हूं- / Default- / Zero- Init C ++ 98 और C ++ 03 यहां इसे और अधिक सामान्य बनाने के लिए क्योंकि यह बहुत सारे उपयोगकर्ताओं की मदद करेगा यदि कोई व्यक्ति इसे भरने में मदद कर सकता है। क्या होता है, इसके बारे में एक अच्छा अवलोकन करने के लिए अंतराल की आवश्यकता होती है
संक्षेप में उदाहरण द्वारा पूर्ण अंतर्दृष्टि:
कभी-कभी नए ऑपरेटर द्वारा दी गई मेमोरी को इनिशियलाइज़ किया जाएगा, और कभी-कभी यह इस बात पर निर्भर नहीं करेगा कि आप जिस प्रकार से नया कर रहे हैं वह एक POD (सादा पुराना डेटा) है , या यदि यह एक वर्ग है जिसमें POD सदस्य हैं और एक का उपयोग कर रहा है संकलक-जनित डिफ़ॉल्ट निर्माता।
- में सी ++ 1998 : प्रारंभ के 2 प्रकार देखते हैं शून्य और डिफ़ॉल्ट-आरंभीकरण
- में सी ++ 2003 प्रारंभ, के एक 3 प्रकार मूल्य-प्रारंभ जोड़ा गया है।
- में सी ++ 2011 / सी ++ 2014 केवल सूची-प्रारंभ जोड़ा गया था और के लिए नियमों को value- / default- / शून्य प्रारंभ थोड़ा बदल दिया है।
मान लीजिये:
struct A { int m; };
struct B { ~B(); int m; };
struct C { C() : m(){}; ~C(); int m; };
struct D { D(){}; int m; };
struct E { E() = default; int m;}; /** only possible in c++11/14 */
struct F {F(); int m;}; F::F() = default; /** only possible in c++11/14 */
C ++ 98 संकलक में, निम्नलिखित होने चाहिए :
new A
- अनिश्चित मान (A
POD है)new A()
- शून्य-इनिशियलाइज़new B
- डिफ़ॉल्ट निर्माण (B::m
असिंचित है,B
गैर-पीओडी है)new B()
- डिफ़ॉल्ट निर्माण (B::m
असिंचित है)new C
- डिफ़ॉल्ट निर्माण (C::m
शून्य-प्रारंभिक है,C
गैर-पीओडी है)new C()
- डिफ़ॉल्ट निर्माण (C::m
शून्य प्रारंभिक है)new D
- डिफ़ॉल्ट निर्माण (D::m
असिंचित है,D
गैर-पीओडी है)new D()
- डिफ़ॉल्ट निर्माण? (D::m
अनधिकृत है)
C ++ 03 अनुरूप कंपाइलर में, चीजों को इस तरह काम करना चाहिए:
new A
- अनिश्चित मान (A
POD है)new A()
- मूल्य-आरंभीकरणA
, जो शून्य-आरंभीकरण है क्योंकि यह एक पीओडी है।new B
- डिफ़ॉल्ट-इनिशियलाइज़ (पत्तियांB::m
असिंचित है,B
गैर-पीओडी है)new B()
- वैल्यू-इनिशियलाइज़ेशनB
जो सभी फ़ील्ड्स को इनिशियलाइज़ करता है, क्योंकि उसका डिफॉल्ट ctor कंपाइलर है, जो यूज़र-डिफ़ाइंड के विपरीत है।new C
- डिफ़ॉल्ट-इनिशियलाइज़ करता हैC
, जो डिफ़ॉल्ट ctor को कॉल करता है। (C::m
शून्य-प्रारंभिक है,C
गैर-पीओडी है)new C()
- वैल्यू-इनिशियलाइज़C
, जो डिफॉल्ट ctor को कॉल करता है। (C::m
शून्य-आरंभिक है)new D
- डिफ़ॉल्ट निर्माण (D::m
असिंचित है,D
गैर-पीओडी है)new D()
- D को इनिशियलाइज़ करता है? , जो डिफ़ॉल्ट ctor को कॉल करता है (असिंचितD::m
है)
इटैलिक मूल्य और मान? अनिश्चितताएं हैं, कृपया इसे ठीक करने में मदद करें :-)
C ++ 11 अनुरूप कंपाइलर में, चीजों को इस तरह से काम करना चाहिए:
??? (कृपया मदद करें अगर मैं यहाँ शुरू करूँ तो यह वैसे भी गलत हो जाएगा)
C ++ 14 अनुरूप कंपाइलर में, चीजों को इस तरह से काम करना चाहिए: ??? (कृपया मदद करें अगर मैं यहां से शुरू करूं तो यह गलत हो जाएगा) (उत्तर पर आधारित ड्राफ्ट)
new A
- डिफ़ॉल्ट-इनिशियलाइज़A
, कंपाइलर जीन। ctor, (leavsA::m
uninitialized) (A
POD है)new A()
- मूल्य-इनिशियलाइज़A
, जो कि शून्य-आरंभीकरण है। 2. बिंदु [dcl.init] / 8 मेंnew B
- डिफ़ॉल्ट-इनिशियलाइज़B
, कंपाइलर जीन। ctor, (leavsB::m
uninitialized) (B
नॉन-पीओडी है)new B()
- वैल्यू-इनिशियलाइज़ेशनB
जो सभी फ़ील्ड्स को इनिशियलाइज़ करता है, क्योंकि उसका डिफॉल्ट ctor कंपाइलर है, जो यूज़र-डिफ़ाइंड के विपरीत है।new C
- डिफ़ॉल्ट-इनिशियलाइज़ करता हैC
, जो डिफ़ॉल्ट ctor को कॉल करता है। (C::m
शून्य-प्रारंभिक है,C
गैर-पीओडी है)new C()
- वैल्यू-इनिशियलाइज़C
, जो डिफॉल्ट ctor को कॉल करता है। (C::m
शून्य-आरंभिक है)new D
- डिफ़ॉल्ट-इनिशियलाइज़D
( गैर-D::m
अधिकृत है,D
गैर-पीओडी है)new D()
- मूल्य-इनिशियलाइज़D
, जो डिफॉल्ट ctor को कॉल करता है (अनइंस्टॉलिज्डD::m
है)new E
- डिफ़ॉल्ट-इनिशियलाइज़E
, जो COMP कहता है। जनरल। ctor। (E::m
गैर-सरकारी है, ई गैर-पीओडी है)new E()
- मूल्य आरंभE
है, जो शून्य आरंभE
में 2 बिंदु के बाद से [dcl.init] / 8 )new F
- डिफ़ॉल्ट-इनिशियलाइज़F
, जो COMP कहता है। जनरल। ctor। ( गैर-F::m
अधिकृत है,F
गैर-पीओडी है)new F()
- मूल्य-initializesF
, जो डिफ़ॉल्ट-आरंभF
के बाद से 1 में बिंदु [dcl.init] / 8 (F
ctor समारोह अगर यह उपयोगकर्ता के घोषित कर दिया और नहीं स्पष्ट रूप से चूक या अपनी पहली घोषणा पर नष्ट कर दिया है उपयोगकर्ता द्वारा प्रदान की है। लिंक )