आइए हम कॉपी कंस्ट्रक्टर और असाइनमेंट ऑपरेटर के बीच अंतर का अध्ययन करें।
तुलना चार्ट
तुलना के लिए आधार | कापी कंस्ट्रक्टर | असाइनमेंट ऑपरेटर |
---|---|---|
बुनियादी | कॉपी कंस्ट्रक्टर एक ओवरलोडेड कंस्ट्रक्टर है। | असाइनमेंट ऑपरेटर एक बिटवाइज़ ऑपरेटर होता है। |
अर्थ | कॉपी कंस्ट्रक्टर नए ऑब्जेक्ट को पहले से मौजूद ऑब्जेक्ट के साथ इनिशियलाइज़ करता है। | असाइनमेंट ऑपरेटर एक वस्तु के मूल्य को दूसरी वस्तु को सौंपता है, जो दोनों पहले से ही अस्तित्व में हैं। |
वाक्य - विन्यास | class_name (cont class_name और object_name) { // कंस्ट्रक्टर का शरीर } | class_name Ob1, Ob2; Ob2 = OB1; |
invokes | (1) एक नया ऑब्जेक्ट मौजूदा एक के साथ आरंभीकृत होने पर कॉपी कंस्ट्रक्टर को आमंत्रित करता है। (2) ऑब्जेक्ट एक गैर-संदर्भ पैरामीटर के रूप में एक फ़ंक्शन को दिया गया। (3) ऑब्जेक्ट फ़ंक्शन से वापस आ गया है। | असाइनमेंट ऑपरेटर को केवल तब ही लागू किया जाता है जब मौजूदा ऑब्जेक्ट को एक नई ऑब्जेक्ट असाइन करते हैं। |
स्मृति आवंटन | लक्ष्य ऑब्जेक्ट और प्रारंभिक ऑब्जेक्ट दोनों अलग-अलग मेमोरी स्थानों को साझा करते हैं। | लक्ष्य वस्तु और प्रारंभिक वस्तु दोनों समान आवंटित स्मृति को साझा करते हैं। |
चूक | यदि आप प्रोग्राम में किसी भी कॉपी कंस्ट्रक्टर को परिभाषित नहीं करते हैं, तो C ++ कंपाइलर एक प्रदान करता है। | यदि आप "=" ऑपरेटर को अधिभार नहीं देते हैं, तो एक बिटवाइज़ कॉपी बनाई जाएगी। |
कॉपी कंस्ट्रक्टर की परिभाषा
एक "कॉपी कंस्ट्रक्टर" एक अतिभारित कंस्ट्रक्टर का एक रूप है। एक कॉपी कंस्ट्रक्टर को केवल इनिशियलाइज़ेशन के उद्देश्य से बुलाया या बुलाया जाता है। एक कॉपी कंस्ट्रक्टर किसी अन्य मौजूदा ऑब्जेक्ट द्वारा नए बनाए गए ऑब्जेक्ट को इनिशियलाइज़ करता है। जब एक कॉपी कंस्ट्रक्टर का उपयोग नए बनाए गए लक्ष्य ऑब्जेक्ट को आरंभीकृत करने के लिए किया जाता है, तो लक्ष्य ऑब्जेक्ट और स्रोत ऑब्जेक्ट दोनों अलग-अलग मेमोरी स्थान साझा करते हैं। स्रोत ऑब्जेक्ट में किए गए परिवर्तन लक्ष्य ऑब्जेक्ट में प्रतिबिंबित नहीं होते हैं। कॉपी कंस्ट्रक्टर का सामान्य रूप है
class_ name (class_name & object_name) {। // कॉपी कंस्ट्रक्टर का शरीर। } // object_name प्रारंभ के दाईं ओर ऑब्जेक्ट को संदर्भित करता है।
यदि प्रोग्रामर C ++ प्रोग्राम में कॉपी कंस्ट्रक्टर नहीं बनाता है, तो कंपाइलर एक कॉपी कंस्ट्रक्टर को निहित करता है। कंपाइलर द्वारा प्रदान की गई एक अंतर्निहित कॉपी कंस्ट्रक्टर स्रोत ऑब्जेक्ट की सदस्य-वार कॉपी करता है। लेकिन, कभी-कभी सदस्य-वार कॉपी पर्याप्त नहीं होती है, क्योंकि ऑब्जेक्ट में पॉइंटर चर हो सकता है। पॉइंटर वेरिएबल को कॉपी करने का मतलब है, हम पॉइंटर वेरिएबल में स्टोर किए गए एड्रेस को कॉपी कर लेते हैं, लेकिन हम पॉइंटर वेरिएबल में स्टोर किए गए एड्रेस को कॉपी नहीं करना चाहते हैं, इसके बजाय हम उस पॉइंटर को कॉपी करना चाहते हैं। इसलिए, इस तरह की समस्याओं को हल करने के लिए कार्यक्रम में स्पष्ट 'कॉपी कंस्ट्रक्टर' की आवश्यकता है।
एक कॉपी कंस्ट्रक्टर को तीन स्थितियों में निम्नानुसार लागू किया जाता है:
- जब कोई नया ऑब्जेक्ट मौजूदा एक के साथ आरंभीकृत होता है, तो कॉपीराइजर को कॉपी करता है।
- ऑब्जेक्ट एक गैर-संदर्भ पैरामीटर के रूप में एक फ़ंक्शन को दिया गया।
- ऑब्जेक्ट फ़ंक्शन से वापस आ गया है।
आइए एक उदाहरण के साथ कॉपी कंस्ट्रक्टर को समझते हैं।
कक्षा की प्रति {int num; public: copy () {} // default constructor copy (int a) {// कंस्ट्रक्शन कंस्ट्रक्टर num = a; } कॉपी (कॉपी और सी) {// कॉपी कंस्ट्रक्टर num = c.num; } शून्य दिखाना () {cout << संख्या; }}; int main () {कॉपी ए (200); // ऑब्जेक्ट A निर्मित और प्रारंभिक प्रतिलिपि B (A); // कॉपी कंस्ट्रक्टर जिसे कॉपी सी = ए कहा जाता है; // कॉपी डी नामक कॉपी कंस्ट्रक्टर; डी = एक; // कॉपी कंस्ट्रक्टर को नहीं बुलाया जाता है क्योंकि ऑब्जेक्ट डी नव निर्मित ऑब्जेक्ट नहीं है। // यह एक असाइनमेंट ऑपरेशन है। वापसी 0; }
उपरोक्त कोड में, मैंने स्पष्ट रूप से एक रचनाकार "कॉपी (कॉपी और सी)" घोषित किया था। जब ऑब्जेक्ट B को ऑब्जेक्ट ए का उपयोग करके आरंभीकृत किया जाता है तो यह कॉपी कंस्ट्रक्टर कहा जाता है। दूसरी बार जब ऑब्जेक्ट C का उपयोग करके ऑब्जेक्ट C को इनिशियलाइज़ किया जा रहा है। जब ऑब्जेक्ट D को ऑब्जेक्ट का उपयोग करके इनिशियलाइज़ किया जाता है तो कॉपी कंस्ट्रक्टर को इसलिए नहीं बुलाया जाता है क्योंकि जब डी को इनिशियलाइज़ किया जाता है यह पहले से ही अस्तित्व में है, नव निर्मित नहीं है। इसलिए, यहां असाइनमेंट ऑपरेटर को आमंत्रित किया गया है।
असाइनमेंट ऑपरेटर की परिभाषा
असाइनमेंट ऑपरेटर C ++ का असाइनमेंट ऑपरेटर है। "=" ऑपरेटर का उपयोग असाइनमेंट ऑपरेटर को लागू करने के लिए किया जाता है। यह डेटा को एक वस्तु में पहचान कर दूसरे वस्तु को कॉपी करता है। असाइनमेंट ऑपरेटर एक वस्तु को दूसरे सदस्य के हिसाब से कॉपी करता है। यदि आप असाइनमेंट ऑपरेटर को अधिभार नहीं देते हैं, तो यह बिटवाइज़ कॉपी करता है। इसलिए, आपको असाइनमेंट ऑपरेटर को अधिभारित करने की आवश्यकता है।
कक्षा की प्रति {int num; public: copy () {} // default constructor copy (int a) {// कंस्ट्रक्शन कंस्ट्रक्टर num = a; } शून्य दिखाना () {cout << संख्या; }}; int main () {कॉपी ए (200); // ऑब्जेक्ट A निर्मित और प्रारंभिक प्रतिलिपि B (300); // ऑब्जेक्ट बी बनाया और शुरू में बी = ए; // असाइनमेंट ऑपरेटर ने कॉपी सी मंगाई; सी = एक; // असाइनमेंट ऑपरेटर ने रिटर्न 0 आमंत्रित किया; }
उपरोक्त कोड में जब ऑब्जेक्ट को ऑब्जेक्ट बी को सौंपा जाता है तो असाइनमेंट ऑपरेटर को आमंत्रित किया जा रहा है क्योंकि दोनों ऑब्जेक्ट पहले से ही अस्तित्व में हैं। इसी प्रकार, वस्तु C के साथ वस्तु C का आरंभ होने पर भी ऐसा ही होता है।
जब बिटवाइज़ असाइनमेंट किया जाता है तो दोनों ऑब्जेक्ट एक ही मेमोरी लोकेशन को साझा करते हैं और एक ऑब्जेक्ट में बदलाव किसी अन्य ऑब्जेक्ट में प्रतिबिंबित होते हैं।
कॉपी कंस्ट्रक्टर और असाइनमेंट ऑपरेटर के बीच मुख्य अंतर
- एक कॉपी कंस्ट्रक्टर एक ओवरलोडेड कंस्ट्रक्टर है जहां असाइनमेंट ऑपरेटर के रूप में बिटवाइज़ ऑपरेटर है।
- कॉपी कंस्ट्रक्टर का उपयोग करके आप पहले से मौजूद ऑब्जेक्ट के साथ एक नई ऑब्जेक्ट को इनिशियलाइज़ कर सकते हैं। दूसरी ओर, एक असाइनमेंट ऑपरेटर एक ऑब्जेक्ट को दूसरी ऑब्जेक्ट में कॉपी करता है, जो दोनों पहले से ही अस्तित्व में हैं।
- जब भी किसी ऑब्जेक्ट को पहले से मौजूद ऑब्जेक्ट के साथ इनिशियलाइज़ किया जाता है, तो एक कॉपी कंस्ट्रक्टर को इनिशियलाइज़ किया जाता है, जब किसी फ़ंक्शन को नॉन रिफरेन्स पैरामीटर के रूप में फंक्शन में पास किया जाता है, या जब किसी ऑब्जेक्ट को किसी फंक्शन से लौटाया जाता है। दूसरी ओर, एक असाइनमेंट ऑपरेटर को केवल तब ही इनवॉइस किया जाता है जब किसी ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट को सौंपा जा रहा हो।
- जब कोई ऑब्जेक्ट कॉपी कंस्ट्रक्टर का उपयोग करके इनिशियलाइज़ किया जा रहा है, तो इनिशियलाइज़िंग ऑब्जेक्ट और इनिशलाइज़्ड ऑब्जेक्ट अलग-अलग मेमोरी लोकेशन को साझा करता है। दूसरी ओर, जब एक असाइनमेंट ऑपरेटर का उपयोग करके किसी ऑब्जेक्ट को इनिशियलाइज़ किया जा रहा होता है तो ऑब्जेक्ट्स को इनिशियलाइज़ और इनिशियलाइज़ करना उसी मेमोरी लोकेशन को शेयर करता है।
- यदि आप स्पष्ट रूप से कॉपी कंस्ट्रक्टर को परिभाषित नहीं करते हैं तो कंपाइलर एक प्रदान करता है। दूसरी ओर, यदि आप एक एसिगमेंट ऑपरेटर को ओवरलोड नहीं करते हैं, तो एक बिटवाइज़ कॉपी ऑपरेशन किया जाता है।
निष्कर्ष:
कॉपी कन्स्ट्रक्टर एक ऑब्जेक्ट को दूसरे में कॉपी करने के लिए सबसे अच्छा है जब ऑब्जेक्ट में कच्चे पॉइंटर्स होते हैं।