เมื่อไหร่ต้องเขียน Assignment Operator เอง
ถ้า Class ไม่มี Pointer → ไม่ต้องเขียน เนื่องจาก Compiler สร้าง Copy Constructor และ Assignment Operator ให้อัตโนมัติ (Shallow Copy)
แต่ถ้ามี Pointer → Shallow Copy จะทำให้ 2 Object ชี้ pointer เดียวกัน → ปัญหา Double Free หรือการเปลี่ยนค่าร่วมกัน
ตัวอย่างปัญหา (Shallow Copy)
class MyClass {
int* ptr;
public:
MyClass(int x = 0) { ptr = new int(x); }
void setValue(int x) { *ptr = x; }
void print() { cout << *ptr << endl; }
};
int main() {
MyClass ob1(50);
MyClass ob2;
ob2 = ob1; // Shallow copy: ptr ชี้ที่เดียวกัน
ob1.setValue(100); // เปลี่ยนค่า ob1
ob2.print(); // พิมพ์ 100 (ควรเป็น 50!) → Bug
}
Output: 100 (ผิด!)
แก้ไขด้วย Custom Assignment Operator (Deep Copy)
class MyClass {
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) {
if (this != &ob2) // Check self-assignment
*ptr = *(ob2.ptr); // Deep copy ค่า
return *this;
}
};
int main() {
MyClass ob1(50);
MyClass ob2;
ob2 = ob1;
ob1.setValue(100);
ob2.print(); // Output: 50 (ถูกต้อง)
}
ข้อสังเกต
- ต้องเช็ค Self-assignment (this != &ob2)
- หรือทำ Private Assignment Operator เพื่อห้าม Copy เลย