Я великий фанат, щоб дозволити компілятору зробити якомога більше роботи за вас. Коли ви пишете простий клас, компілятор може дати вам наступне для "безкоштовно":
- Конструктор за замовчуванням (порожній)
- Конструктор копій
- Руйнівник
- Оператор призначення (
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
{ }
Чи є для цього вагома причина? Чому проведення порівняння по одному члену може бути проблемою? Очевидно, якщо клас виділяє пам'ять, то ви хочете бути обережними, але для простого класу напевно компілятор міг би це зробити для вас?
==
, таким же чином, як і автоматичне призначення за замовчуванням =
за певних умов. (Аргумент про покажчиках суперечливий , тому що логіка може бути застосована як для =
і ==
, а не тільки для другого).