प्रश्न 1: डिफ़ॉल्ट निर्माता पीओडी सदस्यों को सी ++ मानक के अनुसार 0 में प्रारंभ करते हैं। नीचे उद्धृत पाठ देखें।
प्रश्न 2: यदि किसी श्रेणी में एक निर्माता को निर्दिष्ट किया जाना चाहिए, तो वह वर्ग संघ का हिस्सा नहीं हो सकता है।
अंत में, आप अपने संघ के लिए एक निर्माता प्रदान कर सकते हैं:
union U
{
A a;
B b;
U() { memset(this, 0, sizeof(U)); }
};
Q1 के लिए:
से सी ++ 03, 12.1 कंस्ट्रक्टर्स, स्नातकोत्तर 190
परोक्ष परिभाषित डिफ़ॉल्ट निर्माता कक्षा के प्रारंभिकरण के सेट को निष्पादित करता है जो उस वर्ग के लिए एक खाली ज्ञापन-प्रारंभकर्ता-सूची (12.6.2) और खाली फ़ंक्शन बॉडी के साथ उपयोगकर्ता द्वारा लिखित डिफ़ॉल्ट कन्स्ट्रक्टर द्वारा किया जाएगा।
सी ++ 03, 8 से।5 initializers, स्नातकोत्तर 145
प्रकार टी की एक वस्तु डिफ़ॉल्ट आरंभ करने के लिए इसका मतलब है:
- अगर टी है एक गैर पॉड वर्ग प्रकार (खंड 9), टी के लिए डिफ़ॉल्ट निर्माता कहा जाता है (और प्रारंभिकता बीमार है यदि टी में कोई सुलभ डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है);
- यदि टी एक सरणी प्रकार है, तो प्रत्येक तत्व डिफ़ॉल्ट-प्रारंभिक है;
- अन्यथा, ऑब्जेक्ट शून्य-प्रारंभिक है।
के प्रकार टी का एक उद्देश्य शून्य से प्रारंभ का अर्थ है:
- अगर टी एक अदिश प्रकार (3.9), वस्तु 0 (शून्य) के मान पर सेट है टी में बदल जाती है,
- अगर टी एक गैर संघ वर्ग प्रकार, प्रत्येक गैर स्थिर डेटा सदस्य और प्रत्येक आधार स्तरीय subobject है शून्य प्रारंभ है;
- अगर टी एक संघ प्रकार है, वस्तु की पहली नामित डेटा सदस्य शून्य से आरंभ होता है;
- अगर टी एक सरणी प्रकार है, प्रत्येक तत्व शून्य से आरंभ होता है;
- यदि टी एक संदर्भ प्रकार है, तो कोई प्रारंभिकता नहीं की जाती है।
Q2 के लिए:
से सी ++ 03, 12.1 कंस्ट्रक्टर्स, स्नातकोत्तर 190
एक निर्माता तुच्छ है अगर यह एक परोक्ष-घोषित डिफ़ॉल्ट निर्माता है और यदि:
- अपने वर्ग कोई आभासी कार्यों (10.3) और कोई आभासी आधार वर्ग (10.1), और
- सभी प्रत्यक्ष आधार अपने वर्ग की कक्षाएं तुच्छ कंस्ट्रक्टर्स है है, और
- उस वर्ग प्रकार (या सरणी क्या है) के हैं अपने वर्ग के सभी nonstatic डेटा सदस्यों के लिए, ऐसे प्रत्येक वर्ग एक छोटी सी निर्माता
है सी ++ 03, 9.5 यूनियन, स्नातकोत्तर 162
से
एक संघ में सदस्य कार्य (कन्स्ट्रक्टर और विनाशक समेत) हो सकते हैं, लेकिन वर्चुअल (10.3) फ़ंक्शन नहीं। एक संघ के पास बेस क्लास नहीं होंगे। एक संघ को आधार वर्ग के रूप में उपयोग नहीं किया जाएगा। एक गैर-तुच्छ कन्स्ट्रक्टर (12.1) के साथ एक वर्ग की एक वस्तु, एक गैर-तुच्छ प्रतिलिपि निर्माता (12.8), एक गैर-तुच्छ विनाशक (12.4), या एक गैर-तुच्छ कॉपी असाइनमेंट ऑपरेटर (13.5.3, 12.8) यूनियन का सदस्य नहीं हो सकता है, न ही ऐसी वस्तुओं की एक सरणी
यहां क्या गुम है कि नाम के बावजूद, डिफ़ॉल्ट निर्माता डिफ़ॉल्ट नहीं हैं-पीओडी सदस्यों को प्रारंभ करें। 12.6.2/4 कहता है कि क्या होता है जब किसी प्रारंभिक सूची में किसी सदस्य का उल्लेख नहीं किया जाता है, और 12.1 से आपके उद्धरण के द्वारा, यह अंतर्निहित ctors पर लागू होता है। यह कहता है, "यदि इकाई का एक गैर स्थैतिक डेटा सदस्य है ... वर्ग प्रकार ... और इकाई वर्ग एक गैर-पीओडी वर्ग है, तो इकाई डिफ़ॉल्ट-प्रारंभिक है ... अन्यथा, इकाई प्रारंभ नहीं की गई है "। इसलिए, पीओडी डेटा सदस्यों को अंतर्निहित जनरेटेड कन्स्ट्रक्टर द्वारा प्रारंभ नहीं किया जाता है। गैर-पीओडी डेटा सदस्य डिफ़ॉल्ट-प्रारंभिक हैं। –
यह उत्तर पुराना है .. –