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

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

ที่นี่เราจะดูเมื่อไหร่ต้องสร้าง assignment operator เองใน C++ หากคลาสไม่มี pointer ใดๆ เราไม่ต้องสร้าง assignment operator และ copy constructor คอมไพเลอร์ C++ จะสร้าง copy constructor และ assignment operator ให้อัตโนมัติสำหรับทุกคลาส หาก operator เหล่านั้นไม่เพียงพอ เราจึงต้องสร้างเอง

ตัวอย่างปัญหา

#include <iostream>
using namespace std;

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;
    ob1.setValue(100);
    ob2.print();
}

ผลลัพธ์

100

ใน main() เราตั้งค่า x ผ่าน setValue() ให้ ob1 ค่าก็เปลี่ยนใน ob2 ด้วย เพราะไม่มี assignment operator ผู้ใช้ คอมไพเลอร์สร้างให้เอง โดยคัดลอก ptr จาก RHS ไป LHS ทำให้ทั้งสองชี้ไปที่เดียวกัน

แก้ไขได้ 2 วิธี: 1) สร้าง dummy private assignment operator ป้องกันการคัดลอก 2) สร้าง assignment operator เอง

ตัวอย่างแก้ไข

#include <iostream>
using namespace std;

class MyClass {
    int *ptr;
public:
    MyClass(int x = 0) {
        ptr = new int(x);
    }
    void setValue(int x) { *ptr = x; }
    void print() { cout << *ptr << endl; }
    // Assignment operator เอง
    MyClass& operator=(const MyClass& ob2) {
        // ตรวจสอบ self-assignment
        if (this != &ob2)
            *ptr = *(ob2.ptr);
        return *this;
    }
};

int main() {
    MyClass ob1(50);
    MyClass ob2;
    ob2 = ob1;
    ob1.setValue(100);
    ob2.print();
}

ผลลัพธ์

50

ที่นี่ assignment operator ทำ deep copy และเก็บ pointer แยกกัน ต้องระวัง self-reference ไม่เช่นนั้นอาจเปลี่ยนค่าของออบเจ็กต์ปัจจุบัน