Je suis un grand fan de laisser le compilateur faire autant de travail que possible pour vous. Lors de l'écriture d'une classe simple, le compilateur peut vous donner les éléments suivants gratuitement:
- Un constructeur par défaut (vide)
- Un constructeur de copie
- Un destructeur
- Un opérateur d'affectation (
operator=
)
Mais il ne semble pas vous donner d'opérateurs de comparaison - comme operator==
ou operator!=
. Par exemple:
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
{ }
Y a-t-il une bonne raison à cela? Pourquoi effectuer une comparaison membre par membre serait un problème? Évidemment, si la classe alloue de la mémoire, vous voudrez être prudent, mais pour une classe simple, le compilateur pourrait sûrement le faire pour vous?
==
, de la même manière qu'il y a une affectation automatique par défaut ( =
) sous certaines conditions. (L'argument sur les pointeurs est incohérent car la logique s'applique à la fois pour =
et ==
, et pas seulement pour le second).