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