Exercice 1 | Exercice 2 | Exercice 3 | Exercice 4 | Exercice 5 | Exercice 6 | Exercice 7 |
En C++, une fonction est identifiée par son nom et par les types de ses paramètres. On peut en effet imaginer que certaines fonctions se comportent différemment selon le type de paramètre transmis : on n'inverse par exemple pas une matrice de la même manière que l'on inverse un nombre réel.
Dans cet exercice par contre, le contenu de la fonction n'est pas modifié car on échange toujours 2 objets de la même façon. Ce qui change par contre ici, c'est le type des paramètres et de la variable intermédiaire.
void echange(double& a, double& b) { double copie(a); a=b; b=copie; } void echange(char& a, char& b) { char copie(a); a=b; b=copie; }
![]() |
Notez que le langage C++ offre une possibilité de
faire ce genre de surcharges plus facilement : définir des fonctions
indépendamment du type de leurs arguments.
Ce sont les templates, que nous verrons au second semestre.
C'est un peu comme si on écrivait la fonction générique : void echange(<type>& a, <type>& b) { <type> copie(a); a = b; b = copie; } justement sans avoir à préciser le type. La façon correct de l'écrire en C++ est : template<typename Type> void echange(Type& a, Type& b) { Type copie(a); a = b; b = copie; } |
![]() |
![]() template<typename Type> void echange(Type& a, Type& b) { Type tmp(std::move(a)); // Cela rend a invalide (mais peu importe ici puisqu'on l'écrase à la ligne suivante) a = std::move(b); // Cela rend b invalide (mais peu importe ici puisqu'on l'écrase à la ligne suivante) b = std::move(tmp); // Cela rend tmp invalide (mais peu importe ici puisqu'on ne l'utilise plus) } |