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

ในฟังก์ชัน main() เราได้ตั้งค่าของ x โดยใช้เมธอด setValue() สำหรับ ob1 ค่ายังสะท้อนให้เห็นในวัตถุ ob2; การเปลี่ยนแปลงที่ไม่คาดคิดประเภทนี้อาจสร้างปัญหาบางอย่าง ไม่มีโอเปอเรเตอร์การกำหนดที่ผู้ใช้กำหนด ดังนั้นคอมไพเลอร์จึงสร้างขึ้น นี่คือการคัดลอก ptr ของ RHS ไปยัง LHS ดังนั้นตัวชี้ทั้งสองจึงชี้ไปที่ตำแหน่งเดียวกัน

เพื่อแก้ปัญหานี้ เราสามารถทำตามสองวิธี ไม่ว่าเราจะสร้างตัวดำเนินการมอบหมายส่วนตัวจำลองเพื่อจำกัดการคัดลอกวัตถุ หรือสร้างตัวดำเนินการมอบหมายงานของเราเองได้

ตัวอย่าง

#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

ในที่นี้ ตัวดำเนินการมอบหมายจะใช้เพื่อสร้างสำเนาในเชิงลึกและจัดเก็บตัวชี้แยกกัน สิ่งหนึ่งที่เราต้องจำไว้ เราต้องตรวจสอบการอ้างอิงตนเอง มิฉะนั้น ผู้ดำเนินการมอบหมายอาจเปลี่ยนค่าของวัตถุปัจจุบัน