Ở đây chúng ta sẽ thấy khi nào chúng ta cần tạo toán tử gán riêng trong C ++. Nếu một lớp không có bất kỳ con trỏ nào, thì chúng ta không cần tạo toán tử gán và phương thức khởi tạo sao chép. Trình biên dịch C ++ tạo phương thức khởi tạo sao chép và toán tử gán cho mỗi lớp. Nếu các toán tử không đủ, thì chúng ta phải tạo toán tử gán của riêng mình.
Ví dụ
#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(); }
Đầu ra
100
Trong hàm main (), chúng ta đã đặt giá trị của x bằng phương thức setValue () cho ob1. Giá trị cũng được phản ánh trong đối tượng ob2; Loại thay đổi bất ngờ này có thể tạo ra một số vấn đề. Không có toán tử gán do người dùng xác định, vì vậy trình biên dịch tạo một toán tử. Tại đây nó sao chép ptr của RHS sang LHS. Vì vậy, cả hai con trỏ đều trỏ đến cùng một vị trí.
Để giải quyết vấn đề này, chúng ta có thể làm theo hai phương pháp. Chúng ta có thể tạo toán tử gán riêng giả để hạn chế sao chép đối tượng, nếu không, hãy tạo toán tử gán của riêng chúng tôi.
Ví dụ
#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(); }
Đầu ra
50
Ở đây toán tử gán được sử dụng để tạo bản sao sâu và lưu trữ con trỏ riêng biệt. Một điều chúng ta phải ghi nhớ. Chúng ta phải kiểm tra tự tham chiếu nếu không toán tử gán có thể thay đổi giá trị của đối tượng hiện tại.