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 :

contructeur de copie et surcharge d opérateur


Sujet :

C++

  1. #1
    Membre très actif
    Homme Profil pro
    En rupture avec la societé
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : En rupture avec la societé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Par défaut contructeur de copie et surcharge d opérateur
    bonjour,
    Comment puis je définir le constructeur de copie avec la surcharge d'opérateur et l'utilisation du pointeur this.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #include <iostream>
     
    using namespace std;
     
    class Compteur{
        public:
            Compteur();
            Compteur(const Compteur&);
            ~Compteur(){}
            int GetVal() const {return saVal;}
            void setVal(int x){saVal = x;}
            void Increment(){++saVal;}
            const Compteur& operator++();
     
        private:
            int saVal;
    };
     
    Compteur::Compteur():saVal(0){};
     
     
    const Compteur& Compteur::operator++(){
        ++saVal;
        return *this;
    }
     
    Compteur::Compteur(const Compteur&){
        cout << "Constructeur de copie !" << endl;
        ++*this;
    }
     
    int main()
    {
        Compteur i;
        cout << "La valeur de i est " << i.GetVal() << endl;
        i.Increment();
        cout << "La valeur de i est " << i.GetVal() << endl;
        ++i;
        cout << "La valeur de i est " << i.GetVal() << endl;
        Compteur a = ++i;
        cout << "La valeur de a " << a.GetVal();
        cout << " et de i " << i.GetVal() << endl;
        return 0;
    }
    Au passage dans la constructeur de copie je me retrouve avec un comportement indéfini.

    Merci

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    C'est normal : il n'y a nul part ou tu indique la valeur de départ de ton int dans le constructeur de copie. Si tu veux que sa marche, je pense que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Compteur::Compteur(const Compteur& c){
        cout << "Constructeur de copie !" << endl;
        saVal=c.saVal;
        ++(*this);
    }

    En espérant que sa marche...

  3. #3
    Membre très actif
    Homme Profil pro
    En rupture avec la societé
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : En rupture avec la societé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Par défaut
    dans ce cas la, je supprime le pointeur.
    Je pensais que lors de la copie 'this' passait a toute les fonctions membres.
    La copie fonctionne

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 634
    Par défaut
    Salut,

    De prime abord, je dirais que tu n'a strictement rien à faire ni au niveau du constructeur par copie, ni à celui de l'opérateur d'affectation ni à celui du destructeur:

    Comme tu ne manipule absolument aucun pointeur à l'intérieur de la classe, tu peux laisser le compilateur générer automatiquement ces trois fonctions particulières

    Pour information, l'utilisation de this est implicite dans les fonctions membres (pour tout ce qui est effectivement accessible depuis l'objet, comme les membres et fonctions membre de la classe), et tu peux donc le laisser purement et simplement tomber (sauf cas particuliers qu'il serait trop long d'évoquer ici )

    Ceci dit, il ne me semble absolument pas utile d'exposer le mutateur "setval" dans le sens où, en toute logique, tu définis une bonne fois pour toute la valeur de départ de ton compteur, puis qu'elle évoluera en fonction des opérations que tu effectuera dessus

    Enfin, je me demande s'il est vraiment utile d'avoir un opérateur ++ et une fonction increment dans la même classe.

    Pour quand même te permettre de comprendre le constructeur par copie, il faut comprendre que c'est une fonction particulière qui ne renvoie strictement rien (même pas void).

    Si tu voulais effectivement définir toi même ce constructeur, il faudrait déjà veiller à... passer réellement un objet du type adéquat comme paramètre.

    Il prendrait alors la forme simple de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Compteur::Compteur(Compteur const & c):saVal(c.saVal){}
    C'est l'opérateur d'affectation qui renvoie une référence sur l'objet en cours.

    Etant donné que l'on ne travaille avec aucun pointeur, il prendrait la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Compteur & Compteur::operator = (Compteur const & c)
    {
        saVal = c.saVal;
        return *this;
    }
    (si ta classe compteur venait à manipuler un pointeur en interne, l'idiome copy and swap serait la solution idéale et la plus sécurisante )

    Je tiens à rappeler une fois de plus qu'il ne sert à rien d'implémenter ces deux fonctions (opérateur d'affectation et constructeur par copie), car elles font toutes deux partie du Big Four: les quatres fonctions qui sont automatiquement implémentées pour toute structure et toute classe par le compilateur si le développeur ne les déclare pas lui-même

    Le code que je viens de donner pour celles-ci est, en définitive, fort proche de ce que le compilateur aurait lui-même implémenté, dés lors, pourquoi se fatiguer à le faire soi-même

    Si je l'ai donné, c'est essentiellement pour te permettre de comprendre ce qu'il faudrait faire
    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

  5. #5
    Membre très actif
    Homme Profil pro
    En rupture avec la societé
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : En rupture avec la societé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Par défaut
    bonsoir,

    Merci pour cette réponse koala1, qui est toujours aussi bien détaillé.
    Le morceau de code posé dans le topic est le résultat des divers tests de ma formation et j'aurais du peut être le préciser.

    Le principal pour moi était de comprendre le rôle et le résultat avec le constructeur de copie et la surcharge d'opérateur.

    merci

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

Discussions similaires

  1. [C#] Tri d'objet et surcharge d'opérateur
    Par Royd938 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 17/12/2007, 00h26
  2. Petit probléme de surcharge d'opérateur .
    Par Clad3 dans le forum C++
    Réponses: 20
    Dernier message: 11/04/2005, 20h15
  3. Problème de surcharge d'opérateurs
    Par Hell dans le forum C++
    Réponses: 17
    Dernier message: 17/01/2005, 16h01
  4. Cumul de surcharges d'opérateurs
    Par Nats dans le forum C++
    Réponses: 2
    Dernier message: 11/10/2004, 13h37
  5. [VB .NET] Surcharge d'opérateur
    Par Franckintosh dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/09/2004, 19h05

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