operator=
#
Membre obligatoire
Le standard C++ exige que l’operator= soit défini comme une fonction membre de la classe.
Il doit retourner *this pour permettre le chaînage (a = b = c).
Il doit aussi empêcher l’auto-affectation.
Sans cette condition, alors on a un UB (Undefined Behavior).
NamedPoint& NamedPoint::operator=(const NamedPoint& p)
{
if (this == &p)
{
return *this;
}
...
return *this;
}
📝 À NOTER
Cet opérateur est obligatoire pour les classes qui gèrent des ressources dynamiques (pointeurs bruts, allocations).
Dans le cas contraire, alors operator= = default est suffisant.
operator<< et operator>>
#
Non-membres obligatoires
...Durant le cours, nous utiliserons le C++23.
Dans certains cas, si la version du compilateur utilisé est trop ancienne, alors certaines fonctionnalités de C++23 ne seront pas disponibles.
À l’inverse, il est aussi possible que certaines “possibilités” aient été enlevées dans les versions les plus récentes du C++.
Par exemple, la possibilité de lire, depuis std::cin dans un char* a été supprimée depuis C++20, pour des raisons de sécurité (risque de dépassement de buffer).
...Lorsqu’un appel de fonction ne correspond pas exactement à une signature, le compilateur C++ effectue des conversions implicites pour tenter de trouver une correspondance.
Ce mécanisme est au coeur de la résolution de surcharge (overload resolution).
Les 3 rangs de conversion
#
Le compilateur C++ classe les conversions implicites en 3 rangs, du plus prioritaire au moins prioritaire :
| Rang | Nom | Exemples |
|---|
| 1 | Exact match | Aucune conversion, ajout de const, lvalue-to-rvalue |
| 2 | Promotion | float → double, short → int, char → int |
| 3 | Conversion | double → int, double → float, int → float |
Exemple concret
#
Considérons deux surcharges :
...