Toán tử gán kết hợp – Compound assignment operators
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) |
Lưu ý rằng không có toán tử nào ở bên trên được ngầm định kế thừa từ các thành phần cấu thành của nó và ngược lại. Tức là nạp chồng toán tử ‘+’ không tạo ra toán tử ‘+=’. Việc implement cả hai thành phần của một cặp như vậy nên tương thích với nhau (nghĩa là X += Y nên có kết quả giống như X = X + Y), nhưng không có sự tự động hóa trong đó. Mọi thứ tùy thuộc vào cách chúng ta thực hiện việc nạp chồng như thế nào.
Tất cả các hàm toán tử loại này đều có một tham số và sẽ thực hiện sửa đổi trực tiếp trên đối tượng được gọi. Nó nên trả về một tham chiếu đến đối tượng được sửa đổi để cho phép thực hiện toán tử theo một chuỗi.
Chương trình sau →
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <iostream> using namespace std; class V { public: int vec[2]; V(int a0, int a1) { vec[0]=a0; vec[1]=a1; } V& operator+=(V &arg) { for(int i = 0; i < 2; i++) { vec[i] += arg.vec[i]; } return *this; } }; V& operator+(V &left, V &right) { V *res = new V(0, 0); for(int i = 0; i < 2; i++) { res->vec[i] = left.vec[i] + right.vec[i]; } return *res; } int main(void) { V v1(0, 0), v2(1, 2), v3(3, 4); v1 = v2 + v3; v1 += v1; cout << "(" << v1.vec[0] << ", " << v1.vec[1] << ")" << endl; return 0; } |
Định nghĩa cả toán tử ‘+’ và ‘+=’.
Kết quả khi chạy chương trình như sau:
1 |
(8, 12) |