Khi nói đến nạp chồng toán tử (operator overloading) trong C++, có 3 quy tắc cơ bản bạn nên tuân thủ. Như mọi quy tắc, luôn có ngoại lệ. 3 quy tắc này là:
- Khi ý nghĩa của toán tử không rõ ràng và không có tranh cãi, không nên nạp chồng. Thay vào đó, cung cấp hàm với tên được chọn tốt. Về bản chất, quy tắc đầu tiên và quan trọng nhất cho nạp chồng toán tử nói: Đừng làm thế. Có vẻ lạ, nhưng chỉ có vài trường hợp nạp chồng toán tử mới phù hợp. Lý do: khó hiểu ngữ nghĩa đằng sau việc áp dụng toán tử trừ khi việc dùng toán tử trong miền ứng dụng được biết rõ và không gây tranh cãi.
- Luôn tuân thủ ngữ nghĩa nổi tiếng của toán tử. C++ không giới hạn ngữ nghĩa của toán tử nạp chồng. Trình biên dịch sẽ chấp nhận code triển khai toán tử nhị phân
+để trừ toán hạng phải từ trái. Tuy nhiên, người dùng sẽ không bao giờ ngờa + blại trừatừb. - Luôn cung cấp đầy đủ tập các phép toán liên quan. Toán tử liên quan đến nhau và đến các phép toán khác. Nếu kiểu của bạn hỗ trợ
a + b, người dùng sẽ mong đợia += bcũng hoạt động. Nếu hỗ trợ tiền tố++a, họ mong đợia++cũng chạy. Nếu có thể kiểm traa < b, chắc chắn họ mong đợi kiểm traa > b. Nếu có thể copy-construct kiểu của bạn, họ mong đợi gán (assignment) cũng chạy.
Trong hầu hết trường hợp bạn không cần nạp chồng toán tử và chỉ nên nạp chồng khi chúng được định nghĩa rõ ràng và phù hợp với tình huống. Bài viết này lấy cảm hứng từ https://stackoverflow.com/a/4421708/3719089.