Toán tử gán – Assignment operator
Toán tử | = |
Có thể được thực hiện như là một hàm toàn cục không ? | Không |
Có thể được thực hiện như là một hàm thành việc của lớp không ? | Có |
Kiểu dữ liệu trả về | Tham chiếu đến đối tượng nằm bên trái của toán tử (đóng vái trò l-value) |
Hoạt động mặc định của toán tử ‘=’ là khá đơn giản khi áp dụng cho các đối tượng: nó chỉ sao chép nội dung của đối tượng theo từng trường, tạo ra một bản sao của đối tượng gốc. Lưu ý rằng có thể nguy hiểm nếu đối tượng được sao chép có chứa các con trỏ đến dữ liệu được cấp phát động, bởi vì hai hoặc nhiều đối tượng khác nhau có thể sử dụng cùng một dữ liệu được chia sẻ. Nó có thể hữu ích khi thực hiện có chủ ý, nhưng nó cũng rất dễ gây lỗi nếu nhầm lẫn. Việc nạp chồng toán tử ‘=’ có thể bảo vệ đối tượng khỏi vấn đề này.
Hãy xem ví dụ sau →
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostream> using namespace std; class V { public: int vec[2]; V(int a0, int a1) { vec[0]=a0; vec[1]=a1; } V(void) { vec[0]=vec[1]=0; } V& operator=(V &arg) { for(int i = 0; i < 2; i++) { vec[i] = arg.vec[1 - i]; } return *this; } }; int main(void) { V v1(4, 8), v2; v2 = v1; cout << "(" << v2.vec[0] << ", " << v2.vec[1] << ")" << endl; return 0; } |
Ví dụ này cho thấy một phép gán, nó hoán đổi vector được gán: phép gán này không hữu ích lắm và cũng không funny lắm, nhưng rất tốt để minh hoạ (hy vọng như vậy).
Chương trình tạo ra kết quả sau:
1 |
(8, 4) |
Hãy thử đoán kết quả của chương trình nếu hàm main có dạng sau →
1 2 3 4 5 6 |
int main(void) { V v1(4, 8), v2, v3; v2 = v3 = v1; cout << "(" << v2.vec[0] << ", " << v2.vec[1] << ")" << endl; return 0; } |