Annonce

Réduire
Aucune annonce.

C++ - cours n°6 -> Surdéfinition ou surcharge de fonction

Réduire
Ceci est une discussion importante.
X
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • C++ - cours n°6 -> Surdéfinition ou surcharge de fonction

    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,

    Code:
    def mult_2(obj):
        return obj * 2
    Résultat

    Code:
    >>> def mult_2(obj):
    ...     return obj * 2
    ... 
    >>> mult_2(5)
    10
    >>> mult_2(5.7)
    11.4
    >>> mult_2("ab")
    'abab'
    >>>
    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

    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;
    }
    Pour la fonction mult_2 retournant un type int et double, ça doit pas poser de problème

    Code:
    int mult_2(int obj) { return obj * 2; }
    
    double mult_2(double obj) { return obj * 2; }
    Remarquez une autre façon d'écrire une fonction

    On aurait pu l'écrire d'une façon standard évidemment.

    Code:
    int mult_2(int obj){
        return obj * 2
    }
    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,

    Code:
    string mult_2(string obj) { return obj * 2; }
    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,

    Code:
    string mult_2(string obj) { return obj + obj; }
    Voilà nous avons résolu notre problème ! Le code fini est donc celui ci-dessous,

    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; }
    Avec le résultat suivant:

    10
    11.4
    abab
    On pourrait aussi définir la même fonction mais avec un nombre de paramètres différents

    Code:
    int mult_2(int obj_1, int obj_2){ return obj_1 + obj_2; }
    avec une exécution du style

    Code:
    cout << mult_2(a, b) << endl;
    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
    Dernière modification par fred, 19 juillet 2016, 19h23.
Chargement...
X