Partage
  • Partager sur Facebook
  • Partager sur Twitter

Surcharge d'operateurs: type du retour?

    15 octobre 2007 à 0:10:40

    Bonsoir a tous, je suis en train d'etudier la surcharge d'operateurs et j'ai trouve de nombreux exemples differents de leur utilisation.
    Entre autre je ne comprends pas ce qu'une fonction doit retourner:

    Objet Objet::operator=(const& rhs)
    ou bien
    Objet& Objet::operator=(const& rhs)

    Autrement dit, doit on retourner l'objet lui meme (je pense que dans ce cas la ce sera le constructeur de copie qui sera appele pour retourner les champs "by value") ou alors une REFERENCE de l'objet?

    Merci d'avance de m'eclairer
    • Partager sur Facebook
    • Partager sur Twitter
      15 octobre 2007 à 0:17:33

      çà doit dépendre de l'opérateur en question.
      par exemple += renvoit une référence sur "this" mais + renvoie un objet temporaire (donc pas de référence sinon plantage assuré).

      ps : dites le si ce n'est pas çà.
      • Partager sur Facebook
      • Partager sur Twitter
        15 octobre 2007 à 0:18:55

        Juste pour t'embeter, je ne vais pas te donner la réponse, mais je vais te
        suggérer de mettre, dans ton constructeur par recopie :

        1. cout << "Constructeur par recopie appele !" << endl;


        (ou alors un breakpoint si tu utilises le debugueur)

        et de voir ce que ça fait si tu mets le & ou pas :)
        • Partager sur Facebook
        • Partager sur Twitter

        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

          29 octobre 2007 à 19:14:25

          Objet& Objet::operator=(Objet const& rhs){.... return *this;} //affectation
          Objet(Objet const & Source)//construction ne renvoie rien
          • Partager sur Facebook
          • Partager sur Twitter
            30 mars 2008 à 19:57:26

            la méthode operator= renvoie toujours un OBJET (pas une référence) qui est une instance de la classe courrante...
            1. Objet Objet::operator=(Objet &objetARecopier);

            est le prototype de toute méthode operator=()... et il retourne toujours *this...
            • Partager sur Facebook
            • Partager sur Twitter
              30 mars 2008 à 20:09:47

              Citation : Thomthom

              la méthode operator renvoie toujours un OBJET (pas une référence) qui est une instance de la classe courrante...

              1. Objet Objet::operator+=(Objet &objetARecopier);


              est le prototype de toute méthode operator=()... et il retourne toujours *this...


              faux

              les operateurs modifiants la classe elle-meme (=, +=, -=, /=, *=, %=) sont de la forme
              1. O &operator=(const O &Other);


              les operateurs "simples" (+, -, /, *, %) doit etre implementé en fonction libre et appelle de preference leurs equivalent "compliqué" (pour + se sera +=)
              ps: ici je parle de facon general
              1. O operator+(const O &Me, const O &Other)
              2. {
              3.    return O(Me) += Other;
              4. }


              ensuite il y a les operateurs d'incrementation et de decrementation
              1. O &operator++(void); // prefix
              2. O operator++(int); // suffix


              et les operateurs d'indicage
              1. Type &operator[](int i); // ecriture
              2. const Type &operator[](int i) const; // lecture
              3. // ou suivant "Type"
              4. Type operator[](int i) const; // lecture


              et il y a encore plein d'autres operateurs...
              • Partager sur Facebook
              • Partager sur Twitter
                30 mars 2008 à 21:00:12

                je n'avais jamais remarqué, mais dans la liste, tu dis que operator() n'est pas surchargeable, alors que si
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  30 mars 2008 à 21:02:21

                  Y'en a trois type : seul "Conversion de type" le peut.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    31 mars 2008 à 0:13:36

                    Citation : hiura

                    Y'en a trois type : seul "Conversion de type" le peut.


                    http://cpp.developpez.com/faq/cpp/?page=surcharge#SURCHARGE_matrix_index :-° (d'après tes "mots" celui ci serait un "appel de fonction")
                    • Partager sur Facebook
                    • Partager sur Twitter
                      31 mars 2008 à 2:30:53

                      @ Chlab: Tu m'as surement mal lu, je voulais dire dans toute fonction =. j'ai jamais parlé de += ou de -= ou de tout autre chose... mais il me semble qu'il serait bien difficile de surcharger un jour l'operateur = sans que ça ne donne ce protorype...

                      EDIT: oups, c'est vrai... j'ai mal écrit mon message... c'est vrai, la methode operator=() renvoie toujours une instance de la classe courrante...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        31 mars 2008 à 12:03:12

                        Citation : minirop

                        Citation : hiura

                        Y'en a trois type : seul "Conversion de type" le peut.


                        http://cpp.developpez.com/faq/cpp/?page=surcharge#SURCHARGE_matrix_index :-° (d'après tes "mots" celui ci serait un "appel de fonction")



                        il me semble que l'on parle de foncteurs
                        • Partager sur Facebook
                        • Partager sur Twitter
                          31 mars 2008 à 17:17:42

                          operator() est effectivement surchargeable et la ligne "Appel de fonction" devrait comporter un "oui". Mea Culpa.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                            31 mars 2008 à 17:41:15

                            le retour de l'opérateur permet les lignes comme :

                            1. MaClasse a;
                            2. MaClasse b;
                            3. MaClasse c;
                            4. a = b += c;


                            puisqu'on veut affecter à a ce que b est devenu, il est inutile de retourner une copie de b à l'opérateur = de a.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              31 mars 2008 à 18:04:22

                              Je pense que lui il veut savoir comment retenir ce que retournent les op'.
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Surcharge d'operateurs: type du retour?

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown