IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Norme et surcharge


Sujet :

C++

  1. #1
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut Norme et surcharge
    Bonjour,

    j'aimerais savoir quels types de surcharge autorise la norme?

    Par exemple, on a coutume d'écrire ce genre de choses pour certains accesseurs/mutateurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mon_type & operator()(size_t); 
    mon_type const & operator()(size_t) const;
    Or, ça peut choquer à première vue parce que les paramètres d'entrée sont identiques : seul le mot-clé const semble jouer un rôle déterminant dans la distinction des deux opérateurs.

    D'autres mots-clés ont-ils cette vertu?

    Merci bien!

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Les fonctions doivent varier d'au - un des éléments :
    => le type d'un des paramètres (const/volatile font partis du type - enfin, les plus 'enfouis' pour reprendre le terme de la norme, c'est à dire que celui le plus à droite est ignoré)
    => le nombre de paramètres
    => const/volatile (pour lequel on pourrait par analogie dire qu'il s'agit d'une variation du type du paramètre implicite this)
    => le namespace (pour les fonctions libres)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    struct s
    {
    void f(int);
    void f(int &);
    void f(int const &);
    void f(int) const;
    void f(int &) const;
    void f(int const &) const;
    void f(int)volatile;
    void f(int &)volatile;
    void f(int const &)volatile;
    void f(int) volatile const;
    void f(int &) volatile const;
    void f(int const &) volatile const;
    // et il doit m'en manquer
    };
    typedef n'est pas un type différent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef int MyInt;
    void f(int);
    void f(MyInt); // pas une surcharge
    Ceci dit d'autres phénomènes peuvent venir perturber : masquage, fonction virtuelle, fonction statique, template, arguments par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct s
    {
    static void f();
    void f(); //erreur à cause de static
    void f() const; // erreur à cause de static
     
    void f(int ); // OK un paramètre différent 
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void f(); // 1
    void f(int =0); // 2 Ceci est bien une surcharge mais :
    f(1); // OK => appel 2
    f(); // => KO appel ambigüe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void f(int ); // 
    void f(int const);// Ceci n'est pas une surcharge
    void f(int volatile);// Ceci n'est pas une surcharge
    void f(int const &); // Ceci est bien une surcharge mais :
    f(1); // KO appel ambigue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    void f(int ); // 1
    namespace
    {
        void f(int); //2
        void dummy ()
        {
            f(2); // Appel de 2
            ::f(1); // Appel de 1
        }
    }
     
    namespace d
    {
        void f(int); // 3
        void dummy ()
        {
            f(3); // appel de 3
            ::f(1);// appel de 1
        }
    }
     
     
    int main()
    {
        ::f(1); // appel de 1
        f(0); // Erreur => appel ambigue
        dummy();
        d::f(3);
        d::dummy();
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    void f( ); // 1
    namespace
    {
        void f(int); //2
        void dummy()
        {
            f(2);
            f(); // erreur //1 est masquée
            ::f(); // ok
        }
    }
    int main()
    {
        f(); // ok 1
        f(2); // ok 2
     
    return 0;
    }
    Je pense qu'il y a matière à un tuto au - aussi long que celui sur les fonctions virtuelles

Discussions similaires

  1. wxWindows et DevC++ : taille de l'exe énorme !
    Par ovh dans le forum Dev-C++
    Réponses: 7
    Dernier message: 19/11/2003, 17h01
  2. Réponses: 5
    Dernier message: 24/04/2003, 11h47
  3. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 11h42
  4. Normes EDI
    Par f-demu01 dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 14/03/2003, 08h22
  5. Réponses: 8
    Dernier message: 20/11/2002, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo