Bonjour,
Je peine à comprendre à quoi sert la surcharge des opérateurs, quelle utilité ? Qu'est-ce que ça apporte ?
Est-ce que quelqu'un pourrait me donner une explication facile avec un exemple ?
Merci pour votre aide.
Bonjour,
Je peine à comprendre à quoi sert la surcharge des opérateurs, quelle utilité ? Qu'est-ce que ça apporte ?
Est-ce que quelqu'un pourrait me donner une explication facile avec un exemple ?
Merci pour votre aide.
Il y a plusieurs situations dans lesquelles surcharger des opérateurs est pratique:
- La surcharge de operator=
- la surcharge des opérateurs de flux (<< et >>)
- Pour des objets mathématiques: nombres complexes (std::complex), position et vecteur, matrices, polynomes, fonctions...
- Pour foncteurs, c'est à dire des classes ayant un opérateur d'appel de fonction.
- Pour des conteneurs d'objets. Par exemple un quad-tree ou un octree
- Pour des pointeurs intelligents
Les objets mathématiques utiliseront les opérateurs mathématiques (+, -, *, ...) et leurs composés (+=)
L'avantage, c'est de ne pas écrire un code tel que:
mais quelque chose d'autrement plus clair:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 vector2d u(1, 0), v(0, 1); point2d a(7,5), b(8,3); vector2d d = a.moins(b); vector2d diff = difference(a, b); vector2d deplacement = somme ( somme(produit(2,u), oppose(v)), diff); point2d source (11, 34); point2d frere = source; frere.décaler(deplacement);
Les foncteurs servent dans les algorithmes, et peuvent par exemple s'écrire ainsi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 vector2d u(1, 0), v(0, 1); point2d a(7,5), b(8,3); vector2d d = a-b; vector2d diff = a-b; vector2d deplacement = ( (2*u)+ -v) + diff; point2d source (11, 34); point2d frere = source; frere += deplacement;
Note qu'il s'agit précisément de std::less (tel que défini en C++14).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 template<typename T> struct less { constexpr bool operator()( const T& lhs, const T& rhs ) const {return a < b;} };
Pour les conteneurs d'objets, comme une matrice, par exemple, on aura probablement l'un des opérateurs [] ou ().
Pour les pointeurs intelligents, en général, ce sont * et -> qui sont redéfinis.
Il y a d'autres usages, c'est certains, mais ce sont les principaux.
Partager