2011-04-11 14 views
8

As we know, यदि कोई कन्स्ट्रक्टर घोषित किया गया है (कॉपी कन्स्ट्रक्टर शामिल है), डिफ़ॉल्ट कन्स्ट्रक्टर (जिसने कोई तर्क नहीं लिया है) पूरी तरह से नहीं बनाया गया है। क्या यह एक डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर के साथ होता है (वह जो ऑब्जेक्ट की उथली प्रतिलिपि करता है)? इसके अलावा, क्या विनाशक की उपस्थिति किसी भी तरह प्रभावित करती है?सी ++: क्या डिफॉल्ट कॉपी कन्स्ट्रक्टर अन्य रचनाकारों और विनाशक की उपस्थिति से प्रभावित है?

उत्तर

5

यहां उत्तर सही हैं लेकिन पूरा नहीं हुआ। वे सी ++ 98 और सी ++ 03 के लिए सही हैं। सी ++ 11 में आपको एक कॉपी कन्स्ट्रक्टर नहीं मिलेगा यदि आपने एक चालक कन्स्ट्रक्टर घोषित किया है या असाइनमेंट ऑपरेटर ले जाया है। इसके अलावा यदि आपने एक कॉपी असाइनमेंट ऑपरेटर या विनाशक घोषित किया है, तो कॉपी कन्स्ट्रक्टर की निहित पीढ़ी को बहिष्कृत कर दिया गया है। 12.8 [class.copy]:

वर्ग परिभाषा स्पष्ट रूप से एक प्रतिलिपि निर्माता नहीं घोषित करता है, कोई उपयोगकर्ता के घोषित चाल निर्माता है, और वहाँ कोई उपयोगकर्ता के घोषित चाल काम ऑपरेटर है, एक प्रतिलिपि बनाने वाला स्पष्ट रूप से (8.4.2) के रूप में घोषित किया गया है। इस तरह की एक निहित घोषणा को हटा दिया गया है यदि कक्षा में उपयोगकर्ता द्वारा घोषित प्रति असाइनमेंट ऑपरेटर या उपयोगकर्ता द्वारा घोषित विनाशक है।

+0

उन्हें क्यों हटा दिया गया था? मेरा विनाशक आभासी है, लेकिन खाली है। क्या मैं वास्तव में कॉपी-कन्स्ट्रक्टर पीढ़ी को मजबूर करने के लिए मजबूर हूं? मुझे लगता है कि मैं 'डिफ़ॉल्ट' का उपयोग कर सकते हैं? –

+0

@ जेनस ट्रॉल्सन: मुझे इस जवाब में एक तर्क मिला है: http://stackoverflow.com/a/11255258/576911 और हाँ, आप '= default' का उपयोग कर सकते हैं। –

3

नहीं। जब तक आप अपनी प्रतिलिपि बनाने वाले निर्माता की आपूर्ति नहीं करते हैं, और विनाशक की उपस्थिति या अनुपस्थिति में कोई फर्क नहीं पड़ता है, तो आपको कोई डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर नहीं मिलेगा।

1

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

+0

इस व्यवहार के कारण को समझाने के लिए धन्यवाद) – Septagram

3

नहीं। और ध्यान दें कि

MyClass 
{ 
    template <typename T> MyClass(const T&); 
}; 

एक प्रति निर्माता प्रदान नहीं करता है, और एक डिफ़ॉल्ट एक उत्पन्न होता है।

+0

ऐसा क्यों नहीं है? भले ही यह न केवल घोषित किया गया हो, बल्कि परिभाषित किया गया हो? यहां तक ​​कि यदि कोई विशेषज्ञता है (टेम्पलेट <> MyClass :: MyClass (कॉन्स्ट MyClass &) {...})? – Septagram

+0

@ सेप्टग्राम: नहीं। विशेषज्ञता सौदा नहीं बदलती है, और ओवरलोड रिज़ॉल्यूशन के लिए ध्यान में नहीं रखा जाता है। कॉपी कन्स्ट्रक्टर ** ** एक गैर टेम्पलेट समारोह, अवधि होना चाहिए। –

+0

यह अजीब है। लेकिन ठीक है, धन्यवाद :) – Septagram

9

12,8 # 4 प्रतिलिपि बनाई जा रही वर्ग वस्तुओं

स्पष्ट रूप से एक प्रति निर्माता की घोषणा नहीं वर्ग परिभाषा होती है, तो एक परोक्ष घोषित किया जाता है

और नाशक कोई भूमिका निभाता है

+0

उद्धरण के लिए बोनस अंक) – Septagram

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