C++

Surcharge des opérateurs : bonnes pratiques

C++, Opérateurs, Bonnes Pratiques

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

...

Quelle version de C++ pour le cours ?

C++, Visual Studio, Compilateurs

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

...

Surcharge et conversions implicites

C++, Avancé

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 :

RangNomExemples
1Exact matchAucune conversion, ajout de const, lvalue-to-rvalue
2Promotionfloatdouble, shortint, charint
3Conversiondoubleint, doublefloat, intfloat

Exemple concret #

Considérons deux surcharges :

...

© HE-Arc 2020-2026 - Tous droits réservés.