2012-04-02 18 views
5

क्या कोई मुझे प्रतिलिपि और असाइनमेंट के बीच अंतर बता सकता है?प्रतिलिपि और असाइनमेंट

SomeClass a; 
SomeClass b = a; // assignment 
SomeClass c(a); // assignment 
b = c; // copying 

लेकिन अंतर क्या है, भाषा में दो अलग-अलग निर्माण क्यों हैं?

+1

आप क्या कहते हैं "काम" वास्तव में "प्रारंभ" कहा जाता है, और क्या आप "नकल" कहते हैं "काम" कहा जाता है। – Philipp

+4

'कुछ क्लास ए();' - यह एक फ़ंक्शन घोषणा है। –

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/5368258/the-copy-constructor-and-assignment-operator –

उत्तर

1

प्रतिलिपि मौजूदा वस्तुओं की प्रतिलिपि बनाकर नई वस्तुओं को शुरू करने के लिए है, असाइनमेंट अन्य वस्तुओं की सामग्री के साथ मौजूदा वस्तुओं को ओवरराइट करने के लिए है - दोनों बहुत अलग चीजें हैं। विशेष रूप से, इस

SomeClass a; 
SomeClass b = a; 

प्रतिलिपि प्रारंभ है - आप एक नया SomeClass फार्म के सिंटैक्स का उपयोग

T x = y; 

यह लागू SomeClass के के प्रभाव पड़ता है b कहा जाता है बनाने के लिए a कॉपी कर रहे हैं कॉपी कन्स्ट्रक्टर (मान लीजिए कि एक है और यह सुलभ है)। संकलक-जेनरेट की गई डिफ़ॉल्ट प्रतिलिपि निर्माता a की सदस्यवार प्रतिलिपि करेगा; आप इसे आवश्यकतानुसार अपने आप से बदल सकते हैं, उदा।

SomeClass(const SomeClass& rhs) 
: x(rhs.x) 
{} 

(ध्यान दें कि यह एक बहुत उबाऊ उदाहरण है, के रूप में यह सिर्फ डिफ़ॉल्ट सदस्य वार क्या नकल निर्माता हो सकता है।)

आगे बढ़ते, इस

SomeClass c(a); 

प्रत्यक्ष प्रारंभ है कॉपी कन्स्ट्रक्टर का उपयोग कर। यह आम तौर पर इसके बाद के संस्करण के रूप में ही असर नहीं होगा, लेकिन यह एक पढ़ने लायक है:

http://www.gotw.ca/gotw/036.htm

इसके अलावा, यहाँ देखें:

http://www.gotw.ca/gotw/001.htm

आपकी अंतिम मामले, अर्थात्

b = c; 

असाइनमेंट है। इसके अर्थशास्त्र c की सामग्री के साथ आम तौर पर b को ओवरराइट करना चाहिए (हालांकि कुछ चीजें, जैसे std::auto_ptr, अजीब असाइनमेंट सेमेन्टिक्स हैं, इसलिए देखें)। अपनी खुद की असाइनमेंट ऑपरेटर लागू करने के लिए, आपके द्वारा लिखी कुछ इस तरह (ध्यान दें कि यह एक बहुत उबाऊ उदाहरण है, के रूप में यह सिर्फ क्या करता है डिफ़ॉल्ट सदस्य वार असाइनमेंट ऑपरेटर हो सकता है):

SomeClass& operator=(const SomeClass& rhs) 
{ 
    x = rhs.x; 
    return *this; 
} 

व्यवहार में, हालांकि, आप के लिए है इस तरह की स्थितियों में अपवाद सुरक्षा के बारे में सावधान रहें, जो असाइनमेंट ऑपरेटरों को लागू करने के लिए लोकप्रिय प्रतिलिपि और स्वैप मुहावरे जैसी चीजों की ओर जाता है। यहाँ देखें:

http://en.wikibooks.org/wiki/More_C++_Idioms/Copy-and-swap

2

यह आरंभीकरण है (लेकिन यह प्रतिलिपि निर्माता कॉल):

SomeClass b = a; 

तो यह है:

SomeClass c(a); 

यह असाइनमेंट है:

b = c; 

ओह, और इस isn't an initialization :

SomeClass a(); 
+0

अंतर - असाइनमेंट पहले से बनाए गए 'ऑब्जेक्ट पर काम करता है जबकि नई निर्मित ऑब्जेक्ट पर कॉपी करता है जो पहले मौजूद नहीं था। –

1

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

3

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

अब, अपने उदाहरण के लिए पर, उन में से सब गलत कर रहे हैं:

SomeClass a(); 

यह एक विधि a कहा जाता है जो कोई पैरामीटर लेता है और एक वस्तु SomeClass रिटर्न की घोषणा की।

SomeClass b = a; // actually copy constructor & initialization of b 
SomeClass c(a); // same 

तो a एक SomeClass वस्तु थे, इन दोनों प्रारंभ होगा, और यह प्रति निर्माता कहता है - SomeClass::SomeClass(const SomeClass&)। वे बराबर हैं।

b = c; // assignment 

तो c एक SomeClass वस्तु है, इस काम है। यह SomeClass::operator =(const SomeClass&) पर कॉल करता है।

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