Sono un grande fan di lasciare che il compilatore faccia il maggior lavoro possibile per te. Quando si scrive una classe semplice, il compilatore può fornire quanto segue come "gratuito":
- Un costruttore predefinito (vuoto)
- Un costruttore di copie
- Un distruttore
- Un operatore di assegnazione (
operator=
)
Ma non può darti alcun operatore di confronto - come operator==
o operator!=
. Per esempio:
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'è una buona ragione per questo? Perché eseguire un confronto tra i membri sarebbe un problema? Ovviamente se la classe alloca memoria allora vorresti stare attento, ma per una semplice classe sicuramente il compilatore potrebbe fare questo per te?
==
, allo stesso modo in cui esiste un compito automatico predefinito ( =
) in determinate condizioni. (L'argomento sui puntatori è incoerente perché la logica si applica sia per =
e ==
, e non solo per il secondo).