Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ प्रोग्रामिंग में हमें अपना स्वयं का असाइनमेंट ऑपरेटर कब लिखना चाहिए?

यहां हम देखेंगे कि कब हमें C++ में खुद का असाइनमेंट ऑपरेटर बनाने की जरूरत है। यदि किसी वर्ग में कोई पॉइंटर्स नहीं है, तो हमें असाइनमेंट ऑपरेटर और कॉपी कंस्ट्रक्टर बनाने की आवश्यकता नहीं है। C++ कंपाइलर प्रत्येक वर्ग के लिए कॉपी कंस्ट्रक्टर और असाइनमेंट ऑपरेटर बनाता है। यदि ऑपरेटर पर्याप्त नहीं हैं, तो हमें अपना स्वयं का असाइनमेंट ऑपरेटर बनाना होगा।

उदाहरण

#include<iostream>
using namespace std;
class MyClass { //no user defined assignment operator or copy constructor is present
   int *ptr;
   public:
      MyClass (int x = 0) {
         ptr = new int(x);
      }
      void setValue (int x) {
         *ptr = x;
      }
      void print() {
         cout << *ptr << endl;
      }
};
main() {
   MyClass ob1(50);
   MyClass ob2;
   ob2 = ob1;
   ob1.setValue(100);
   ob2.print();
}

आउटपुट

100

मुख्य () फ़ंक्शन में, हमने ob1 के लिए setValue () विधि का उपयोग करके x का मान निर्धारित किया है। मान ऑब्जेक्ट ob2 में भी परिलक्षित होता है; इस प्रकार के अनपेक्षित परिवर्तन कुछ समस्याएँ उत्पन्न कर सकते हैं। कोई उपयोगकर्ता परिभाषित असाइनमेंट ऑपरेटर नहीं है, इसलिए कंपाइलर एक बनाता है। यहां यह आरएचएस के पीटीआर को एलएचएस में कॉपी करता है। तो दोनों पॉइंटर्स एक ही स्थान की ओर इशारा कर रहे हैं।

इस समस्या को हल करने के लिए हम दो तरीके अपना सकते हैं। या तो हम ऑब्जेक्ट कॉपी को प्रतिबंधित करने के लिए डमी प्राइवेट असाइनमेंट ऑपरेटर बना सकते हैं, अन्यथा अपना खुद का असाइनमेंट ऑपरेटर बना सकते हैं।

उदाहरण

#include<iostream>
using namespace std;
class MyClass { //no user defined assignment operator or copy constructor is present
   int *ptr;
   public:
      MyClass (int x = 0) {
         ptr = new int(x);
      }
      void setValue (int x) {
         *ptr = x;
      }
      void print() {
         cout << *ptr << endl;
      }
      MyClass &operator=(const MyClass &ob2){
      // Check for self assignment
         if(this != &ob2)
            *ptr = *(ob2.ptr);
         return *this;
      }
};
main() {
   MyClass ob1(50);
   MyClass ob2;
   ob2 = ob1;
   ob1.setValue(100);
   ob2.print();
}

आउटपुट

50

यहां असाइनमेंट ऑपरेटर का उपयोग डीप कॉपी बनाने और अलग पॉइंटर को स्टोर करने के लिए किया जाता है। एक बात हमें ध्यान में रखनी है। हमें स्व-संदर्भ की जांच करनी होगी अन्यथा असाइनमेंट ऑपरेटर वर्तमान वस्तु के मूल्य को बदल सकता है।


  1. C++ में static_cast, dynamic_cast, const_cast और reinterpret_cast का उपयोग कब किया जाना चाहिए?

    const_cast एक चर को हटाने या जोड़ने के लिए इस्तेमाल किया जा सकता है। यह तब उपयोगी हो सकता है जब किसी वैरिएबल से कॉन्स्टेंस जोड़ना/निकालना आवश्यक हो। static_cast इसका उपयोग सामान्य/साधारण प्रकार के रूपांतरण के लिए किया जाता है। यह निहित प्रकार के जबरदस्ती के लिए जिम्मेदार कलाकार भी है और इसे स्पष्ट र

  1. स्मार्ट पॉइंटर क्या है और मुझे इसे C++ में कब इस्तेमाल करना चाहिए?

    एक स्मार्ट पॉइंटर एक ऐसा वर्ग है जो कच्चे (या नंगे) सी ++ पॉइंटर को लपेटता है। इसका उपयोग पॉइंटर द्वारा इंगित संसाधनों को प्रबंधित करने के लिए किया जाता है। उदाहरण के लिए, यदि उस स्मृति स्थान का संदर्भ खो जाता है। यह एक तरह से कचरा संग्रहकर्ता की तरह काम करता है। कई स्मार्ट पॉइंटर प्रकार हैं। आप

  1. आपको C++ में 'मित्र' का प्रयोग कब करना चाहिए?

    किसी वर्ग के मित्र कार्य को उस वर्ग के दायरे से बाहर परिभाषित किया गया है लेकिन उसे कक्षा के सभी निजी और संरक्षित सदस्यों तक पहुंचने का अधिकार है। भले ही फ्रेंड फंक्शन के प्रोटोटाइप क्लास डेफिनिशन में दिखाई देते हैं, फ्रेंड्स मेंबर फंक्शन नहीं होते हैं। एक दोस्त एक फंक्शन, फंक्शन टेम्प्लेट, या मेंब