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 :

Surcharge d'operateurs et theorie..


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 17
    Par défaut Surcharge d'operateurs et theorie..
    Bonjour a tous, me revoila a la charge pour de nouvelles questions de type theorique sur la surcharge d'operateurs en C++.
    C'est pas passionnant mais bon c'est un passage oblige pour bien comprendre la logique des programmes complexes!
    Ci-dessous des extraits de questions recommandees par l'universite pour une etude autonome du C++:

    1/ Nous avons une classe Complex qui represente des nombres complexes (x+iy) et on surcharge l'operateur "-" de la facon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const Complex operator-() const {
         return Complex(-_re , -_im);
    }
    On me propose deux autres implementations, et on me demande leurs defauts par rapport a la 1ere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    const Complex& operator-() const {      
        _re = -_re;
        _im = -_im;
        return *this;
    }
     
    const Complex& operator-() const {
        Complex* c_ptr = new Complex(-_re, -_im);
        return *c_ptr;
    }
    2/ On implemente l'operateur + comme une fonction friend :
    friend const Complex operator+ (const Complex &c1, const Complex &c2);
    Pourquoi la definition de cette fonction comme fonction membre (et non pas friend) aurait echoue? (const Complex operator+(const Complex &c);
    Si possible donner un exemple...

    3/ On propose une autre implementation de l'operateur "-" comme fonction globale friend:
    friend const Complex operator-(const Complex &c)
    Est-ce que ce code passera sans probleme?

    4/ Expliquer pourquoi il est preferable d'utiliser : c1 *= c2 au lieu de c1 = c1*c2; (c1, c2 de type Complex).

    =====================================================================
    On decide maintenant d'implementer notre propre classe d'objets string (MyString) qui comprend
    - pointeur vers char (char*)
    - size
    - memoire pour le tableau de char est alloue dynamiquement.

    Les questions sont les suivantes:
    1/ Doit on obligatoirement implementer par nous meme un operateur de copie (operator=) ou peut on se contenter de l'operateur par defaut?

    2/ Supposons que l'on veuille implementer l'operator= de la facon suivante:
    MyString& operator=(const MyString &n1)
    Cet operateur effectue un delete de la memoire deja alloue et alloue de la memoire pour le nouveau tableau de chars, met a jour le size.
    Expliquez quel est le probleme pose par le code suivant:
    MyString n1("my string");
    n1 = n1;
    Proposez un moyen de corriger ce probleme.


    Merci beaucoup d'avance pour toute aide...

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Je suis de bonne humeur ce matin:
    1. Les défauts de ces deux implémentations:
      1. Ne compilera pas, car brise la const-correctness.
      2. Retourne une référence vers un objet alloué sur le tas. Quand on joue avec le tas, mieux vaut rester explicite jusqu'au bout et retourner un pointeur (ce qui est impossible ici). Cette fonction est une usine à fuites de mémoire.
    2. C'est l'opérateur + unaire ou binaire ?
    3. Je ne sais pas.
    4. L'opérateur *= ne nécessite aucune construction ni appel à l'opérateur d'affectation, dandis que le =c1*c2 exige la construction d'un résultat intermédiaire et l'affectation dans c1.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    1. Oui. Affectation ET constructeur de copie.
    2. Le delete supprimera la mémoire en cas d'auto-affectation. Le mieux est de détecter l'auto-affectation et de ne rien faire dans ce cas-là.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 17
    Par défaut
    Merci beaucoup pour tes reponses precises ca m'aide vraiment beaucoup!!!
    Pour ce qui est de la question 2/ il s'agit bien de l'operateur + binaire.

    Merci encore!

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    2. Je ne vois pas en quoi cela poserait problème, la seule utilité en utilisant une fonction externe (qui n'est pas obligatoirement friend d'ailleurs) est d'étendre les opérateurs d'une classe que tu ne peux modifier. C'est utile par exemple pour étendre ostream et istream, mais la ça ne sert à rien. Edit: Ha si, il y a le fait que cette méthode n'est pas const.
    3. A priori oui, mais en même temps on défini rarement un opérateur unaire à l'extérieur de la classe Faudrait tester pour être sur.

    Soit dit en passant, je ne comprend pas pourquoi ton prof renvoie des const Complex partout, à partir du moment où c'est une copie c'est plus utile en non-const.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par zais_ethael Voir le message
    Soit dit en passant, je ne comprend pas pourquoi ton prof renvoie des const Complex partout, à partir du moment où c'est une copie c'est plus utile en non-const.
    C'est pour éviter de se servir de la valeur de retour en tant que l-value modifiable par mégarde, voir par exemple le point (4) dans le GotW #6.

    MAT.

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Je crois que Sutter en parle dans XC++ (-> GOTW pour ceux qui n'ont pas le bouquin), il y a deux écoles à ce sujet.
    Cela permet de ne pas enchainer des mutations sur les résultats temporaires non encore nommés.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. est ce possible de surcharger les operateurs
    Par dietrich dans le forum Delphi
    Réponses: 5
    Dernier message: 26/08/2006, 11h15
  2. Surcharge d operateur ==
    Par flipper203 dans le forum C++
    Réponses: 15
    Dernier message: 05/07/2006, 01h54
  3. [POO] surcharge d'operateur
    Par wamania dans le forum Langage
    Réponses: 6
    Dernier message: 20/04/2006, 14h31
  4. surcharge des operateurs de flux
    Par icer dans le forum C++
    Réponses: 6
    Dernier message: 22/02/2006, 09h02
  5. [POO] Surcharge d'opérateurs []
    Par Amnesiak dans le forum Langage
    Réponses: 28
    Dernier message: 11/11/2005, 12h44

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