2011-06-27 13 views
7

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

struct S 
{ 
    S() : array() {} 

    int array[SIZE]; 
}; 

... 

S s; 
// is s.array zero-initialized? 

जीसीसी के साथ एक त्वरित परीक्षण पता चलता है कि यह मामला है, लेकिन मैं इस बात की पुष्टि करने के लिए कि मैं इस व्यवहार पर भरोसा कर सकते थे।

(मैं देखा है कि अगर मैं नहीं स्पष्ट रूप से सरणी संरचना निर्माता में डिफ़ॉल्ट-निर्माण करते हैं, सरणी तत्वों यादृच्छिक मान हैं।)

+2

कोई विशेष कारण आप 'std :: vector' का उपयोग नहीं कर रहे हैं? – AJG85

+2

@ AJG85: हां। यदि मैं इन संरचनाओं में से 100000 की एक सरणी आवंटित करता हूं, तो मैं 100000 * आकार (int *) बाइट्स के साथ-साथ SIZE बाइट्स के 100000 आवंटन के एकल आवंटन के बजाय 100000 * SIZE बाइट्स के एकल आवंटन के परिणामस्वरूप चाहूंगा। (दूसरी ओर, मैं 'बूस्ट :: सरणी '(या' + std :: array' सी ++ 0x में) का उपयोग कर थोड़ा और C++ - y हो सकता हूं)। – HighCommander4

+3

@ उच्च: 'std :: vector का आपका मानसिक मॉडल पूरी तरह से गलत है। इसमें फ्री-स्टोर पर लगभग 12 बाइट्स और कुछ ओवरहेड का निरंतर ओवरहेड है। – fredoverflow

उत्तर

12

हां (पर प्रकाश डाला मेरा):

(सी ++ 03 8,5)

प्रकार टी का एक उद्देश्य मूल्य-प्रारंभ करने के लिए इसका मतलब है:

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

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

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

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

...

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

+0

हां, आप सही हैं, एस डिफ़ॉल्ट रूप से प्रारंभ किया गया है। इसका मतलब है कि भीतर सरणी बहुत डिफ़ॉल्ट है, क्योंकि एस एक पीओडी है, और एक सरणी के लिए डिफ़ॉल्ट initalization शून्य-प्रारंभिक –

+0

के समान नहीं है, मुझे खेद है, मैंने निर्माता को नहीं देखा था, और सोचा कि यह एक पीओडी था । क्षमा करें, आपका उत्तर सही है –

+0

+1: सभी अड्डों को कवर करने के लिए संपादन के लिए। – AJG85

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