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