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

Langage C++ Discussion :

Pourquoi la surcharge de + (binaire) par une fonction à deux paramètres ne peut-elle pas être membre ?


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Pourquoi la surcharge de + (binaire) par une fonction à deux paramètres ne peut-elle pas être membre ?
    Bonjour,

    J'ai lu la FAQ sur les opérateurs et leur surcharge, qui m'a permis de comprendre en quoi la fonction libre à deux paramètres est préférable à la fonction membre à un paramètre utilisant this.

    Par contre, je ne comprends pas ce qui fait que la fonction à deux paramètres ne peut pas être membre de la classe...

    Quelqu'un peut-il m'éclairer ?

    Merci.

    PS: Je suis un honnête programmeur en C, mais je débute en C++...

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonjour,

    Par contre, je ne comprends pas ce qui fait que la fonction à deux paramètres ne peut pas être membre de la classe...
    Parce que cela n'aurait pas de sens. Lorsque tu écris a + b, soit l'opérateur « + » est extérieur aux deux opérandes et, dans ce cas, il faut bien deux paramètres pour passer a et b en même temps, soit tu considères qu'il s'agit d'une extension de a et, dans ce cas, on n'a besoin de connaître que b.

    C'est encore plus flagrant si tu prends le problème à l'envers : si tu considères que « + » est bien une fonction-membre de a, et que a + b est équivalent à a.operator + (b);, par quelle donnée remplacerais-tu les points d'interrogation dans la définition à deux paramètres suivante : a.operator + (b,???); ?

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Ce qu'il faut comprendre, c'est que, pour les fonctions membres, il y a un paramètre implicitement transmis : le pointeur this , qui n'est qu'en définitive que le pointeur sur la structure qui reçoit l'instruction.

    Si tu essayes de créer un opérateur +(type const & un, type const & deux) sous la forme d'une fonction membre, et bien que ce ne soit pas explicitement écrit, tu te retrouves en réalité avec trois arguments, et donc avec un opérateur ressemblant à operator + (type *this, type const & un, type const & deux)Cela ne ferait, ni plus ni moins, qu'un paramètre de trop à ton opérateur, incompatible avec la définition globale de l'opérateur + qui indique qu'il faut deux opérandes

    De plus, l'opérateur += a de bonne raison d'être une fonction membre, pour la simple et bonne raison qu'il a, sémantiquement parlant, la responsabilité de modifier l'opérande de gauche.

    Par contre, l'opérateur + peut s'appliquer avec des types pour lesquels il existe un processus de conversion implicite, sur le deuxième opérande, bien sur, mais aussi sur le premier.

    Tu peux, en effet, envisager, pour une type Type présentant un comportement de conversion implicite avec un entier, d'avoir un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Type first;
    /*...*/
    Type result = first +4;
    mais rien ne t'empêche non plus d'envisager un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Type second;
    Type result = 4 + second;
    voire même un code proche de
    Le seul moyen d'autoriser facilement ces différentes écritures est... de passer par une fonction libre (éventuellement amie )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre à l'essai
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Je comprends mieux
    Bonjour,

    Chacun à sa façon, les contributeurs m'ont permis de mieux comprendre, je crois, le problème:

    - En tant que méthode de la classe (fonction membre), opérateur+ doit pouvoir s'appliquer à un objet et a+b se comprendrait comme a.opérateur+(b). Avec la dissymétrie évoquée dans la FAQ, qui fait préférer:

    - MaClasse opérateur+(MaClasse a, MaClasse b) (ou plutot avec des références constantes), qui est symétrique. Mais si c'était une fonction membre, il y aurait un paramètre de trop, "this" qui est implicite. Ici, pour implanter opérateur+ je vais devoir accéder aux attributs de la classe et donc faire de opérateur+ une fonction amie de MaClasse.

    Merci aux contributeurs. Je n'y suis peut-être pas encore, mais j'ai l'impression que je comprends mieux.

    GG

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Il faut noter que, si tu définis l'opérateur +, il est souvent aussi intéressant d'implémenter l'opérateur += comme fonction membre, et que, pour respecter le principe du DRY (Don't Repeat Yourself), l'opérateur + peut utiliser l'opérateur += (et n'a alors même pas besoin d'être déclaré comme fonction amie )...

    Cela donnerait quelque chose comme
    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
    class MyClass
    {
        public: 
            /* ... */
            MyClass & operator +=(MyClass const & other)
            {
                /* logique à appliquer pour l'addition */
                return *this; 
            }
    };
     
    MyClass operator +(MyClass const & first, MyClass const & second)
    {
        MyClass copy(first); // utilise le constructeur par copie, automatiquement
                             // généré par le compilateur, sauf instruction contraire
        return copy += second;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/06/2012, 12h42
  2. retourner un vector a 2 dimensions par une fonction
    Par Psykotik dans le forum SL & STL
    Réponses: 7
    Dernier message: 18/11/2005, 17h45
  3. Réponses: 11
    Dernier message: 31/10/2005, 17h59
  4. [LG]résultat renvoyé par une fonction
    Par le 27 dans le forum Langage
    Réponses: 3
    Dernier message: 10/12/2003, 10h31
  5. tableau javascript ecrit par une fonction asp
    Par LineLe dans le forum ASP
    Réponses: 4
    Dernier message: 03/11/2003, 08h38

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