Surcharge des fonctions en C++

26 Sep 2019 26 Sep 2019 11997 vues ESSADDOUKI Mostafa 3 min de lecture
Introduction et syntaxe de base
1 Introduction au langage C++ 2 Entrée-sortie en C++ - cin et cout 3 Inférence de type avec le mot-clé auto en C++ 4 Classe std::string et les chaînes de caractères en C++ 5 Les structures conditionnelles (if et switch) en C++ (C++17 et C++20) 6 Les boucles en C++ (C++17 et C++20) 7 La gestion des fichiers en C++
Pointeurs et fonctions
8 Introduction aux pointeurs en C++ - Déclaration et interêts 9 Les références en C++ - déclaration et interêts 10 Les tableaux en C++ - Déclaration et interêts 11 Introduction aux fonctions en C++ 12 Passer des arguments à une fonction en C++ 13 Déclarer un paramètre const en C++ 14 Les fonctions Lambda en C++ 15 Fonctions utiles (Mathématiques et caractères) en C++
Programmation OO
16 Classes et objets en C++ 17 Spécificateurs d'accès en C++ 18 Constructeurs et destructeur d'une classe en C++ 19 Fonctions membres en C++ 20 Membres statiques d'une classe en C++ 21 Fonctions en ligne en C++ - inline 22 Fonctions et classes amies en C++ - friend 23 Surcharge des fonctions en C++ 24 Surcharge des opérateurs en C++ 25 Héritage en C++ 26 La gestion d'exceptions en C++ : déclaration, utilisation et personnalisation 27 fonctions et classes templates en C++ 28 Les nouveautés C++20 pour améliorer les templates en C++
Structures de données
29 Introduction aux structures de données 30 Les structures en C++ et la différence avec les structures en C 31 Les listes chaînées en C++ 32 Les piles en C++ 33 File d'attente en C++ 34 Arbre binaire de recherche : définition et mise en oeuvre en C++
La bibliothèque standard (STL)
35 Introduction à la bibliothèque de Template Standard STL 36 Les itérateurs en C++ - définition, déclaration et exemples 37 La classe array en C++ (bibliothèque STL) <array> 38 La classe vector de la bibliothèque STL <vector> 39 La classe deque en C++ ( Bibliothèque STL) 40 La classe list en C++ (bibliothèque STL) <list> 41 La classe stack (Pile) en C++ (bibliothèque STL) <stack> 42 La classe queue (File d'attente) en C++ (bibliothèque STL) <queue> 43 La file d'attente prioritaire (classe priority_queue) - Bibliothèque STL 44 Les ensembles en C++ (Classe set <set> - Bibliothèque STL) 45 Les dictionnaires en C++ : Classe map (Bibliothèque STL) 46 Introduction aux algorithmes de la bibliothèque STL (programmation compétitive) 47 Tri et méthodes associées en C++ - Bibliothèque STL 48 Recherche dichotomique et méthodes associées en C++ - Bibliothèque STL 49 Appliquer un prédicat ou une fonction aux éléments d'une séquence en C++ - Bibliothèque STL 50 Recherche dans une séquence et méthodes associées en C++ - Bibliothèque STL

La surcharge de fonctions est une fonctionnalité de C++ dans laquelle deux fonctions ou plus peuvent avoir le même nom mais des paramètres différents (type ou nombre). Le compilateur sélectionne la version appropriée lors de la résolution de surcharge.

Surcharge de fonctions

Deux fonctions sont surchargées si elles partagent le même nom mais diffèrent par le nombre ou le type de leurs paramètres. Le type de retour seul ne suffit pas à les distinguer.

Règle importante

Vous ne pouvez pas surcharger deux fonctions qui ne diffèrent que par leur type de retour. Le compilateur générera une erreur.

Surcharge de fonctions

L'avantage principal est d'augmenter la lisibilité du code : une même action logique (ex. calculer une moyenne) est exprimée sous un seul nom, quelle que soit la variante appelée.

  Exemple n°1 — Fonction moyenne surchargée

#include <iostream>
using namespace std;

class Utilitaire {
public:
    static float moyenne(int a, int b) {
        return (a + b) / 2.0;
    }
    static float moyenne(float a, float b) {
        return (a + b) / 2;
    }
    static float moyenne(int a, int b, int c) {
        return (a + b + c) / 3.0;
    }
};

int main() {
    cout << "Moyenne (3,4) = "     << Utilitaire::moyenne(3, 4)         << endl;
    cout << "Moyenne (3,4,6) = "   << Utilitaire::moyenne(3, 4, 6)      << endl;
    cout << "Moyenne (6.4,1.25) = " << Utilitaire::moyenne(6.4f, 1.25f) << endl;
    return 0;
}
Sortie
Moyenne (3,4) = 3.5
Moyenne (3,4,6) = 4.33333
Moyenne (6.4,1.25) = 3.825

Surcharge de fonction et ambiguïté

Ambiguïté de surcharge

Il y a ambiguïté lorsque le compilateur ne peut pas déterminer quelle version surchargée appeler. Le programme ne compile pas.

Les trois causes principales d'ambiguïté sont : la conversion de type, les arguments par défaut, et le passage par référence.

Cas 1 — Conversion de type

En C++, les constantes à virgule flottante comme 6.4 sont traitées comme des double, pas des float. Le compilateur ne sait pas s'il doit convertir vers int ou float.

  Exemple n°2 — Ambiguïté par conversion

// Appel ambigu : 6.4 est un double, pas un float ni un int
Utilitaire::moyenne(6.4, 1.25);  // ERREUR

// Solution : forcer le type float avec le suffixe 'f'
Utilitaire::moyenne(6.4f, 1.25f); // OK
Erreur compilateur
error: call to 'moyenne' is ambiguous

Cas 2 — Argument par défaut

  Exemple n°3 — Ambiguïté par argument par défaut

static float moyenne(int a)           { return (a + 7) / 2.0; }
static float moyenne(int a, int b = 2){ return (a + b) / 2.0; }

// Appel ambigu : moyenne(5) correspond aux deux signatures
Utilitaire::moyenne(5); // ERREUR

Cas 3 — Passage par référence

  Exemple n°4 — Ambiguïté par référence

static void Afficher(int a)  { cout << "a = " << a << endl; }
static void Afficher(int &a) { cout << "a = " << a << endl; }

// Ambigu : il n'y a pas de différence syntaxique à l'appel
int a = 2;
Test::Afficher(a); // ERREUR : int ou int& ?
Conseil pratique

Pour éviter les ambiguïtés : ne combinez pas surcharge avec arguments par défaut sur le même nom, et faites attention aux conversions implicites de type numérique (intfloatdouble).

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.