Tôi là một fan hâm mộ lớn của việc để trình biên dịch làm nhiều việc cho bạn nhất có thể. Khi viết một lớp đơn giản, trình biên dịch có thể cung cấp cho bạn những thứ sau đây là 'miễn phí':
- Một constructor mặc định (trống)
- Một constructor sao chép
- Một kẻ hủy diệt
- Một toán tử gán (
operator=
)
Nhưng nó dường như không thể cung cấp cho bạn bất kỳ toán tử so sánh nào - chẳng hạn như operator==
hoặc operator!=
. Ví dụ:
class foo
{
public:
std::string str_;
int n_;
};
foo f1; // Works
foo f2(f1); // Works
foo f3;
f3 = f2; // Works
if (f3 == f2) // Fails
{ }
if (f3 != f2) // Fails
{ }
Có một lý do tốt cho việc này? Tại sao thực hiện so sánh giữa các thành viên là một vấn đề? Rõ ràng nếu lớp phân bổ bộ nhớ thì bạn muốn cẩn thận, nhưng đối với một lớp đơn giản chắc chắn trình biên dịch có thể làm điều này cho bạn?
==
, giống như cách có gán tự động mặc định ( =
) trong một số điều kiện nhất định. (Đối số về con trỏ không nhất quán vì logic áp dụng cho cả =
và ==
và không chỉ cho lần thứ hai).