44

यदि मैं operator= ओवरराइड करता हूं तो कॉपी कन्स्ट्रक्टर स्वचालित रूप से नए ऑपरेटर का उपयोग करेगा? इसी प्रकार, अगर मैं एक प्रतिलिपि निर्माता को परिभाषित करता हूं, तो operator= प्रतिलिपि प्रतिलिपि से व्यवहार को 'वारिस' कर देगा?कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर

+0

इस लिंक को देखें: http://stackoverflow.com/questions/1457842/is-this-good-code-copy-ctor-operator & http://stackoverflow.com/questions/1477145/reducing-code - डुप्लिकेशंस-बीच-ऑपरेटर-एंड-द-कॉपी-कन्स्ट्रक्टर –

+0

संभावित डुप्लिकेट [तीन का नियम क्या है?] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of- तीन) – fredoverflow

उत्तर

38

नहीं, वे अलग-अलग ऑपरेटर हैं।

कॉपी कन्स्ट्रक्टर एक नई वस्तु बनाने के लिए है। यह किसी मौजूदा ऑब्जेक्ट को एक नव निर्मित ऑब्जेक्ट पर प्रतिलिपि बनाता है। कॉपी कन्स्ट्रक्टर का उपयोग पुराने इंस्टेंस से एक नया उदाहरण प्रारंभ करने के लिए किया जाता है। इसे या कार्यों के बाहर मूल्यों के मूल्य के रूप में चर द्वारा चर को पारित करते समय जरूरी नहीं कहा जाता है।

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

उपयोगी लिंक:

+6

'... को फ़ंक्शन में मान द्वारा वैरिएबल पास करने या कार्यों के बाहर वापसी मूल्यों के रूप में गुजरते समय कहा जाता है। 'जरूरी नहीं। जब आप आरवीओ के मूल्य धन्यवाद द्वारा वापस आते हैं तो एक प्रतिलिपि बनाने वाले को बुलाया नहीं जा सकता है। –

+0

@PS: +1 ... धन्यवाद! संपादित! –

+0

@ प्र्रासून, मैं समझ में नहीं आता, जब कार्यों में मूल्य से वैरिएबल पास करना या कार्यों के बाहर मूल्यों के रूप में, प्रतिलिपि बनाने वाले को क्यों नहीं कहा जा सकता है? और आरवीओ क्या है? – Alcott

11

नहीं। जब तक आप एक प्रतिलिपि ctor परिभाषित नहीं करते हैं, तो एक डिफ़ॉल्ट उत्पन्न होगा (यदि आवश्यक हो)। जब तक आप ऑपरेटर को परिभाषित नहीं करते हैं, एक डिफ़ॉल्ट उत्पन्न होगा (यदि आवश्यक हो)। वे एक-दूसरे का उपयोग नहीं करते हैं, और आप उन्हें स्वतंत्र रूप से बदल सकते हैं।

1

नहीं, वे एक ही ऑपरेटर नहीं हैं।

5

नहीं। वे अलग-अलग वस्तुएं हैं।

आपकी चिंता प्रतिलिपि निर्माता और असाइनमेंट ऑपरेटर के बीच कोड दोहराव है, तो निम्न मुहावरा, copy and swap नामित पर विचार करें:

struct MyClass 
{ 
    MyClass(const MyClass&); // Implement copy logic here 
    void swap(MyClass&) throw(); // Implement a lightweight swap here (eg. swap pointers) 

    MyClass& operator=(MyClass x) 
    { 
     x.swap(*this); 
     return *this; 
    } 
}; 

इस तरह, operator= एक नई वस्तु का निर्माण करने के प्रति निर्माता का उपयोग करेगा, जो होगा *this के साथ आदान-प्रदान करें और फ़ंक्शन से बाहर निकलें (पुराने this के अंदर)।

+0

के लिए समान होता है, क्या आप यह कहते हैं कि ऑपरेटर को कॉल करने के लिए यह एक अच्छा अभ्यास नहीं है = प्रतिलिपि या उपाध्यक्ष में विपरीत? – Alcott

+0

@ एल्कॉट: आप कॉपी कन्स्ट्रक्टर में ऑपरेटर = को कॉल नहीं करते हैं, जैसा कि मैं दिखाता हूं, आप इसे दूसरी तरफ करते हैं। –

+0

आपका असाइनमेंट ऑपरेटर क्यों कॉन्स्ट संदर्भ नहीं ले रहा है? –

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

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