Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

เมื่อไหร่ควรเขียน Assignment Operator เองใน C++

เมื่อไหร่ต้องเขียน 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 เลย