2011-06-28 14 views
146

मैंने default को कक्षा में फ़ंक्शन घोषणाओं के बगल में उपयोग किया है। यह क्या करता है?कक्षा के फ़ंक्शन घोषणा के बाद "डिफ़ॉल्ट" का क्या अर्थ है?

class C { 
    C(const C&) = default; 
    C(C&&) = default; 
    C& operator=(const C&) & = default; 
    C& operator=(C&&) & = default; 
    virtual ~C() { } 
}; 
+7

असाइनमेंट ऑपरेटर घोषणाओं में "=" से पहले "&" क्या करता है? – dshin

उत्तर

172

यह new C++11 feature है।

इसका मतलब है कि आप उस फ़ंक्शन के कंपाइलर-जेनरेट किए गए संस्करण का उपयोग करना चाहते हैं, इसलिए आपको शरीर निर्दिष्ट करने की आवश्यकता नहीं है।

आप का उपयोग यह भी निर्दिष्ट करने के लिए कर सकते हैं कि नहीं है कि संकलक स्वचालित रूप से उस फ़ंक्शन को उत्पन्न करे।

चालक कन्स्ट्रक्टरों की शुरूआत और असाइनमेंट ऑपरेटरों को स्थानांतरित करने के साथ, जब रचनाकारों, विनाशकों और असाइनमेंट ऑपरेटर के स्वचालित संस्करण उत्पन्न होते हैं तो नियम काफी जटिल हो जाते हैं। = default और = delete का उपयोग करना चीजों को आसान बनाता है क्योंकि आपको नियमों को याद रखने की आवश्यकता नहीं है: आप बस इतना कहें कि आप क्या करना चाहते हैं।

+8

'= delete' मजबूत है: इसका मतलब है कि, उस फ़ंक्शन का उपयोग प्रतिबंधित है, हालांकि यह अभी भी ओवरलोड रिज़ॉल्यूशन में भाग लेता है। – Deduplicator

34

यह एक नई सी ++ 0x सुविधा है जो संकलक को संबंधित कंस्ट्रक्टर या असाइनमेंट ऑपरेटर का डिफ़ॉल्ट संस्करण बनाने के लिए कहती है, यानी वह प्रत्येक जो प्रतिलिपि करता है या प्रत्येक सदस्य के लिए कार्रवाई करता है। यह उपयोगी है क्योंकि चालक कन्स्ट्रक्टर हमेशा डिफ़ॉल्ट रूप से जेनरेट नहीं होता है (उदाहरण के लिए यदि आपके पास कस्टम विनाशक है), कॉपी कन्स्ट्रक्टर (और इसी तरह असाइनमेंट के लिए) के विपरीत, लेकिन यदि लिखने के लिए कुछ भी छोटा नहीं है, तो बेहतर है प्रत्येक बार इसे स्वयं वर्तनी करने के लिए संकलक इसे संभालते हैं।

यह भी ध्यान दें कि यदि आप कोई अन्य गैर-डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान करते हैं तो एक डिफ़ॉल्ट कन्स्ट्रक्टर उत्पन्न नहीं किया जाएगा। यदि आप अभी भी डिफ़ॉल्ट कन्स्ट्रक्टर चाहते हैं, तो आप संकलक को एक बनाने के लिए इस वाक्यविन्यास का उपयोग कर सकते हैं।

एक अन्य उपयोग के मामले के रूप में, ऐसी कई स्थितियां हैं जिनमें एक प्रतिलिपि निर्माता उत्पन्न नहीं किया जाएगा (उदाहरण के लिए यदि आप एक कस्टम चालक कन्स्ट्रक्टर प्रदान करते हैं)। यदि आप अभी भी डिफ़ॉल्ट संस्करण चाहते हैं, तो आप इस वाक्यविन्यास के साथ अनुरोध कर सकते हैं।

विवरण के लिए मानक के अनुभाग 12.8 देखें।

+3

हालांकि यह केवल रचनाकारों और असाइनमेंट के लिए नहीं है, बल्कि यह 'ऑपरेटर नया/नया []', 'ऑपरेटर हटाएं/हटाएं []' और उनके ओवरलोड पर भी लागू होता है। दूसरे पैराग्राफ के बारे में –

13

यह सी ++ 11 में नया है, here देखें। यदि आप एक कन्स्ट्रक्टर को परिभाषित करते हैं, तो यह काफी उपयोगी हो सकता है, लेकिन दूसरों के लिए डिफ़ॉल्ट का उपयोग करना चाहता है। प्री-सी ++ 11 एक बार परिभाषित करने के बाद आपको सभी रचनाकारों को परिभाषित करना होगा, भले ही वे डिफ़ॉल्ट के बराबर हों।

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

+0

, क्या आप एक उदाहरण प्रदान कर सकते हैं? –

5

एक अन्य उपयोग केस जो कि इन उत्तरों में उल्लिखित नहीं है, यह है कि यह आपको आसानी से एक निर्माता की दृश्यता बदलने की अनुमति देता है। उदाहरण के लिए, हो सकता है कि आप एक मित्र वर्ग को कॉपी कन्स्ट्रक्टर तक पहुंचने में सक्षम हों, लेकिन आप नहीं चाहते कि यह सार्वजनिक रूप से उपलब्ध हो।

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

  • कोई संबंधित समस्या नहीं^_^