As we know, यदि कोई कन्स्ट्रक्टर घोषित किया गया है (कॉपी कन्स्ट्रक्टर शामिल है), डिफ़ॉल्ट कन्स्ट्रक्टर (जिसने कोई तर्क नहीं लिया है) पूरी तरह से नहीं बनाया गया है। क्या यह एक डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर के साथ होता है (वह जो ऑब्जेक्ट की उथली प्रतिलिपि करता है)? इसके अलावा, क्या विनाशक की उपस्थिति किसी भी तरह प्रभावित करती है?सी ++: क्या डिफॉल्ट कॉपी कन्स्ट्रक्टर अन्य रचनाकारों और विनाशक की उपस्थिति से प्रभावित है?
उत्तर
यहां उत्तर सही हैं लेकिन पूरा नहीं हुआ। वे सी ++ 98 और सी ++ 03 के लिए सही हैं। सी ++ 11 में आपको एक कॉपी कन्स्ट्रक्टर नहीं मिलेगा यदि आपने एक चालक कन्स्ट्रक्टर घोषित किया है या असाइनमेंट ऑपरेटर ले जाया है। इसके अलावा यदि आपने एक कॉपी असाइनमेंट ऑपरेटर या विनाशक घोषित किया है, तो कॉपी कन्स्ट्रक्टर की निहित पीढ़ी को बहिष्कृत कर दिया गया है। 12.8 [class.copy]:
वर्ग परिभाषा स्पष्ट रूप से एक प्रतिलिपि निर्माता नहीं घोषित करता है, कोई उपयोगकर्ता के घोषित चाल निर्माता है, और वहाँ कोई उपयोगकर्ता के घोषित चाल काम ऑपरेटर है, एक प्रतिलिपि बनाने वाला स्पष्ट रूप से (8.4.2) के रूप में घोषित किया गया है। इस तरह की एक निहित घोषणा को हटा दिया गया है यदि कक्षा में उपयोगकर्ता द्वारा घोषित प्रति असाइनमेंट ऑपरेटर या उपयोगकर्ता द्वारा घोषित विनाशक है।
नहीं। जब तक आप अपनी प्रतिलिपि बनाने वाले निर्माता की आपूर्ति नहीं करते हैं, और विनाशक की उपस्थिति या अनुपस्थिति में कोई फर्क नहीं पड़ता है, तो आपको कोई डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर नहीं मिलेगा।
डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर हमेशा बनाया जाता है, जब तक कि आप अपना स्वयं का परिभाषित न करें। बिना तर्क वाले कन्स्ट्रक्टर को इसे कॉल करने से बचने के लिए मौजूद किसी भी अन्य कन्स्ट्रक्टर के साथ परिभाषित नहीं किया गया है और इसलिए वास्तविक कन्स्ट्रक्टर के कोड को छोड़ना है।
इस व्यवहार के कारण को समझाने के लिए धन्यवाद) – Septagram
नहीं। और ध्यान दें कि
MyClass
{
template <typename T> MyClass(const T&);
};
एक प्रति निर्माता प्रदान नहीं करता है, और एक डिफ़ॉल्ट एक उत्पन्न होता है।
ऐसा क्यों नहीं है? भले ही यह न केवल घोषित किया गया हो, बल्कि परिभाषित किया गया हो? यहां तक कि यदि कोई विशेषज्ञता है (टेम्पलेट <> MyClass :: MyClass
@ सेप्टग्राम: नहीं। विशेषज्ञता सौदा नहीं बदलती है, और ओवरलोड रिज़ॉल्यूशन के लिए ध्यान में नहीं रखा जाता है। कॉपी कन्स्ट्रक्टर ** ** एक गैर टेम्पलेट समारोह, अवधि होना चाहिए। –
यह अजीब है। लेकिन ठीक है, धन्यवाद :) – Septagram
12,8 # 4 प्रतिलिपि बनाई जा रही वर्ग वस्तुओं
स्पष्ट रूप से एक प्रति निर्माता की घोषणा नहीं वर्ग परिभाषा होती है, तो एक परोक्ष घोषित किया जाता है
और नाशक कोई भूमिका निभाता है
उद्धरण के लिए बोनस अंक) – Septagram
- 1. कॉपी कन्स्ट्रक्टर और डिफॉल्ट कन्स्ट्रक्टर
- 2. सी ++ में एक कॉपी कन्स्ट्रक्टर क्या है?
- 3. रचनाकारों की प्रतिलिपि बनाएँ - सी ++
- 4. कन्स्ट्रक्टर और विनाशक
- 5. कन्स्ट्रक्टर, विनाशक और असाइनमेंट ऑपरेटर कॉपी करें। जब हमें उन सभी की आवश्यकता नहीं होती है?
- 6. कन्स्ट्रक्टर और विनाशक से शुद्ध आभासी आमंत्रण
- 7. सी ++ में, केवल डिफॉल्ट कन्स्ट्रक्टर के साथ एक डिफॉल्ट कन्स्ट्रक्टर वाला कन्स्ट्रक्टर है?
- 8. सी # जेनेरिक कॉपी कन्स्ट्रक्टर
- 9. क्या डिफ़ॉल्ट कन्स्ट्रक्टर और विनाशक कभी इनलाइन हैं?
- 10. सी # कॉपी कन्स्ट्रक्टर जनरेटर
- 11. एसएलएल वेक्टर और सी ++: डिफॉल्ट कन्स्ट्रक्टर के बिना कैसे करें।
- 12. डिज़ाइनरों को डिफॉल्ट कन्स्ट्रक्टर या विनाशकों की तरह "जंजीर" क्यों कॉपी नहीं किया जाता है?
- 13. सी ++: कॉपी कन्स्ट्रक्टर और कॉपी असाइनमेंट ऑपरेटर को कार्यान्वित करना
- 14. सदस्य कन्स्ट्रक्टर और विनाशक का आदेश
- 15. कोबजेक्ट की कॉपी कन्स्ट्रक्टर और असाइनमेंट को अक्षम क्यों करें
- 16. कॉपी कन्स्ट्रक्टर
- 17. कॉपी कन्स्ट्रक्टर
- 18. अन्य कन्स्ट्रक्टर
- 19. कन्स्ट्रक्टर या कॉपी कन्स्ट्रक्टर?
- 20. std :: vector :: clear() कन्स्ट्रक्टर और विनाशक में
- 21. एक्सेल वीबीए ऑब्जेक्ट कन्स्ट्रक्टर और विनाशक
- 22. जावा कॉपी कन्स्ट्रक्टर और विरासत
- 23. कॉपी कन्स्ट्रक्टर सी ++ में डिफ़ॉल्ट कन्स्ट्रक्टर को क्यों छुपाता है?
- 24. सी ++ क्या कॉपी कन्स्ट्रक्टर यहां बुलाया गया है?
- 25. अस्थिर और आभासी सदस्यों द्वारा प्रभावित सी ++ संश्लेषित चालक कन्स्ट्रक्टर कैसा है? निम्नलिखित कोड पर
- 26. क्या कोई ऑब्जेक्ट कॉपी कन्स्ट्रक्टर
- 27. कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर
- 28. कॉपी प्रारंभिकरण की तरह क्यों है? कॉपी कन्स्ट्रक्टर की आवश्यकता क्यों है?
- 29. क्या सी ++ कन्स्ट्रक्टर (और विनाशक) घोषित/परिभाषित करने का कोई विशेष तरीका है
- 30. मैटलैब कॉपी कन्स्ट्रक्टर
उन्हें क्यों हटा दिया गया था? मेरा विनाशक आभासी है, लेकिन खाली है। क्या मैं वास्तव में कॉपी-कन्स्ट्रक्टर पीढ़ी को मजबूर करने के लिए मजबूर हूं? मुझे लगता है कि मैं 'डिफ़ॉल्ट' का उपयोग कर सकते हैं? –
@ जेनस ट्रॉल्सन: मुझे इस जवाब में एक तर्क मिला है: http://stackoverflow.com/a/11255258/576911 और हाँ, आप '= default' का उपयोग कर सकते हैं। –