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ę).