Surcharge d'une fonction
Pré-Requis
- Les fonctions en C
Problématique
Imaginons que l'on souhaite créer une fonction permettant de multiplier par 2 quelque soit le type d'argument,
Par exemple si on a:
Un entier comme le nombre 5, on aura 5x2=10
Un flottant comme le nombre 5.7, on aura 5.7x2=11.4
Une chaîne de caractères comme "ab", on aura "ab"x2="abab"
Cette fonction dans un langage de script comme python par exemple est enfantin,
Résultat
Simple non? Eh bien en C++, ce n'est pas possible de faire de la sorte, le langage est dit fortement typé, par définition, il a besoin de connaître le type d'argument de la fonction et son retour, sans ça, c'est niet... Il faudra pour cela surcharger une fonction.
Comment faire en C++ ?
Eh bien on va créer 3 fonctions avec le même nom mais avec un type d'argument différent et un type de retour de fonction différent.
Là pour le test, on va faire simple, ça doit concrètement ressembler à cela
Pour la fonction mult_2 retournant un type int et double, ça doit pas poser de problème
Remarquez une autre façon d'écrire une fonction
On aurait pu l'écrire d'une façon standard évidemment.
Bref cette manière est souhaitable, il est rare de n'avoir qu'une seule ligne à écrire dans une fonction...
Revenons à notre problème, où il faut faire cette fonction avec un type string, ça donnerait logiquement,
Eh bien... c'est loupé, vous aurez droit à une erreur sur cette ligne. Pour résoudre c'est une petite astuce, il suffit de concaténer la chaîne une fois,
Voilà nous avons résolu notre problème ! Le code fini est donc celui ci-dessous,
Avec le résultat suivant:
On pourrait aussi définir la même fonction mais avec un nombre de paramètres différents
avec une exécution du style
Nous verrons que certaines fois ce genre de problème peut être résolu plus simplement avec les patrons (template), mais cela sera un autre cours
Pré-Requis
- Les fonctions en C
Problématique
Imaginons que l'on souhaite créer une fonction permettant de multiplier par 2 quelque soit le type d'argument,
Par exemple si on a:
Un entier comme le nombre 5, on aura 5x2=10
Un flottant comme le nombre 5.7, on aura 5.7x2=11.4
Une chaîne de caractères comme "ab", on aura "ab"x2="abab"
Cette fonction dans un langage de script comme python par exemple est enfantin,
Code:
def mult_2(obj): return obj * 2
Code:
>>> def mult_2(obj): ... return obj * 2 ... >>> mult_2(5) 10 >>> mult_2(5.7) 11.4 >>> mult_2("ab") 'abab' >>>
Comment faire en C++ ?
Eh bien on va créer 3 fonctions avec le même nom mais avec un type d'argument différent et un type de retour de fonction différent.
Là pour le test, on va faire simple, ça doit concrètement ressembler à cela
Code:
#include <iostream> using namespace std; int mult_2(int obj); double mult_2(double obj); string mult_2(string obj); int main(){ int a = 5; double b = 5.7; string c = "ab"; cout << mult_2(a) << endl; cout << mult_2(b) << endl; cout << mult_2(c) << endl; return 0; }
Code:
int mult_2(int obj) { return obj * 2; } double mult_2(double obj) { return obj * 2; }
On aurait pu l'écrire d'une façon standard évidemment.
Code:
int mult_2(int obj){ return obj * 2 }
Revenons à notre problème, où il faut faire cette fonction avec un type string, ça donnerait logiquement,
Code:
string mult_2(string obj) { return obj * 2; }
Code:
string mult_2(string obj) { return obj + obj; }
Code:
#include <iostream> using namespace std; int mult_2(int obj); double mult_2(double obj); string mult_2(string obj); int main(){ int a = 5; double b = 5.7; string c = "ab"; cout << mult_2(a) << endl; cout << mult_2(b) << endl; cout << mult_2(c) << endl; return 0; } int mult_2(int obj){ return obj * 2; } double mult_2(double obj) { return obj * 2; } string mult_2(string obj) { return obj + obj; }
10
11.4
abab
11.4
abab
Code:
int mult_2(int obj_1, int obj_2){ return obj_1 + obj_2; }
Code:
cout << mult_2(a, b) << endl;