Я большой поклонник того, чтобы компилятор делал для вас как можно больше работы. При написании простого класса компилятор может дать вам «бесплатно» следующее:
- Конструктор по умолчанию (пустой)
- Конструктор копирования
- Деструктор
- Оператор присваивания (
operator=
)
Но это не может дать вам никаких операторов сравнения - таких как operator==
или operator!=
. Например:
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
{ }
Есть ли для этого веская причина? Почему выполнение сравнения между членами будет проблемой? Очевидно, что если класс выделяет память, вам следует быть осторожным, но для простого класса наверняка компилятор может сделать это за вас?
==
, так же как и автоматическое назначение по умолчанию ( =
) при определенных условиях. (Аргумент о указателях противоречив, потому что логика применяется как для, так =
и для ==
, а не только для второго).