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.
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.
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;
}Moyenne (3,4) = 3.5 Moyenne (3,4,6) = 4.33333 Moyenne (6.4,1.25) = 3.825
Surcharge de fonction et ambiguïté
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); // OKerror: 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); // ERREURCas 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& ?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 (int ↔ float ↔ double).
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.