std::vector
को डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता नहीं है क्योंकि यह इसका कभी भी उपयोग नहीं करता है। हर बार इसे एक तत्व बनाने की आवश्यकता होती है, यह प्रतिलिपि बनाने वाले का उपयोग करके करता है, क्योंकि हर बार इसकी प्रतिलिपि बनाने के लिए कुछ होता है: या तो मौजूदा वेक्टर तत्व या तत्व जिसे आपने स्वयं विधि के पैरामीटर के माध्यम से कॉपी करने के लिए आपूर्ति की है (स्पष्ट रूप से या स्पष्ट रूप से, पर डिफ़ॉल्ट तर्क)
आप इस तरह की कक्षा को उसी तरह लिख सकते हैं: हर बार जब आपको अपनी सरणी में एक नया तत्व बनाने की आवश्यकता होती है, तो उपयोगकर्ता को प्रतिलिपि बनाने के लिए तत्व की आवश्यकता होती है। इस मामले में उस मूल तत्व का निर्माण उपयोगकर्ता की ज़िम्मेदारी बन जाता है।
हर बार ऐसा लगता है मानो std::vector
आप से एक डिफ़ॉल्ट निर्माता "की आवश्यकता है", यह बस का अर्थ है कि कहीं न कहीं आप vector
रों तरीकों में से कुछ की एक डिफ़ॉल्ट तर्क पर भरोसा किया, यानी यह था तुम कौन default- करने की कोशिश की वेक्टर नहीं, एक तत्व का निर्माण। वेक्टर स्वयं, फिर से, डिफ़ॉल्ट-निर्माण तत्वों को कभी भी कोशिश नहीं करेगा।
आदेश स्मृति आवंटन के दौरान डिफ़ॉल्ट निर्माता आवश्यकता से बचने के लिए, मानक पुस्तकालय कच्चे अप्रारंभीकृत स्मृति ब्लॉक आवंटित करता है और फिर तुरंत कि कच्चे स्मृति ब्लॉक (जो कुछ new[]
ऐसा नहीं कर सकते है) में नए तत्व कॉपी-निर्माण करती है। यह कार्यक्षमता std::allocator
कक्षा में incapsulated है। आप अपने कोड में std::allocator
का भी उपयोग कर सकते हैं, जिसका अर्थ है कि "जादू" तुरंत आपके लिए भी उपलब्ध है।
नोट: उपरोक्त सी ++ भाषा विनिर्देश के पूर्व-सी ++ 11 संस्करण पर लागू होता है। सी ++ 11 ने कई चीजें बदल दीं। और ये परिवर्तन ऐसी स्थितियां बनाते हैं जिनमें std::vector
आंतरिक रूप से डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग कर सकते हैं।
यह भी ध्यान देने योग्य बात है कि यहां तक कि मूल सी ++ 98 विनिर्देश अनुमति कार्यान्वयन आदेश मानक पुस्तकालय इंटरफ़ेस को लागू करने मेंके बजाय डिफ़ॉल्ट तर्क अधिक भार समारोह का उपयोग करने के लायक हो सकता है। इसका मतलब है कि औपचारिक रूप से std::vector
का वैध सी ++ 98 कार्यान्वयन संभव है जो डिफ़ॉल्ट कन्स्ट्रक्टर आंतरिक रूप से का उपयोग करता है।
मैं पहली जगह में स्थान कैसे आवंटित करूं? malloc? – anon
@anon: इस पर एक नज़र डालें कि 'वेक्टर' कैसे करता है ... यह एक आवंटक का उपयोग करता है, उदाहरण के लिए 'new_allocator'। मेरे (पुराने) सिगविन इंस्टॉलेशन में यह इस प्रकार काम करता है: '{return static_cast <_Tp*> (:: ऑपरेटर नया (__ n * sizeof (_Tp))); } 'या' malloc_allocator' इस तरह से करता है: 'सूचक __ret = static_cast <_Tp*> (malloc (__ n * sizeof (_Tp))); – Dan