Jestem wielkim fanem pozwalania kompilatorowi na wykonanie dla ciebie jak największej pracy. Pisząc prostą klasę, kompilator może dać ci następujące za „za darmo”:
- Domyślny (pusty) konstruktor
- Konstruktor kopii
- Destruktor
- Operator przypisania (
operator=
)
Ale wydaje się, że nie daje żadnych operatorów porównania - takich jak operator==
lub operator!=
. Na przykład:
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
{ }
Czy jest na to dobry powód? Dlaczego przeprowadzanie porównania poszczególnych członków byłoby problemem? Oczywiście, jeśli klasa przydzieli pamięć, to powinieneś być ostrożny, ale dla prostej klasy z pewnością kompilator mógłby to zrobić za Ciebie?
==
, podobnie jak w przypadku domyślnych automatycznych przypisań ( =
). (Argument o wskaźnikach jest niespójna, ponieważ logika ma zastosowanie zarówno do =
i ==
, a nie tylko na sekundę).