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 :

constructeur par copie


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Points : 12
    Points
    12
    Par défaut constructeur par copie
    Bonjour,

    J'ai un doute affreux, considérons la classe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class ObjA
    {
    public:
    	ObjA(const CString& strvalue)			{ m_strValue = strvalue; }
    	CString GetText()						{ return m_strValue; }
     
    protected:
    	CString m_strValue;
    };
    PS :si vous n'aimez pas la classe CString vous pouvez remplacer par std:string


    maitenant si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CString strTmp;
    ObjA* a = new ObjA( _T("c++ power") );
    strTmp = a->GetText();
     
    ObjA aCopy(*a);
    delete a;
     
    strTmp = aCopy.GetText();
    est ce valide ou ai-je besoin de déclarer un constructeur par copie ou je ferais un m_strValue = rhs.m_strValue ?

  2. #2
    Membre actif
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Points : 213
    Points
    213
    Par défaut
    Tu me fiche le doute aussi!

    Je dirais que c'est valide (dans cette situation et pas forcément avec des attributs «pointeurs») en conservant le constructeur de copie par défaut ou en créant un personnalisé

    Tu peux le vérifier en changeant CString par une classe de ta conception affichant des messages lors de copie et construction. (Si on printait directement depuis ObjA on changerait le comportement en créant les destructeurs et autre fonctions.)

  3. #3
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Non pas besoin, c'est ce que fais le ctor de recopie créer par le compilo.
    T'en a besoin que quand la gestion est non triviale.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Comme l'indiquent hiura et Goten, le compilateur va générer un constructeur par copie par default, et dans le cas de ta classe simple, tout va bien se passer.

    Mais il faut se méfier comme de la peste du constructeur par copie et de l’opérateur d'assignation par défaut, a un tel point qu'il est recommandé de les 'désactiver' en les déclarant comme privés sans fournir d'implémentation.

    En cherchant, rapidement, j'ai trouvé ce lien qui explique le pourquoi de ce conseil. Si tu as toujours des doutes, je peux t'expliquer avec un exemple concret.

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Diantre, la qualité de la solution compliant #2 est vraiment mauvaise. Et à plus d'un égard[*]. Je suis impressionné pour un site sur le secure coding.
    @xmichelo, on a tout ce qu'il faut, et c'est juste au moins, dans la FAQ.

    [*]
    - non libération sur l'affectation
    - pessimisation avec le test à this dans l'opérateur d'affectation, alors qu'un code exception safe (mais faudrait-il d'abord qu'il soit sans fuite) aurait suffit
    - test à this dans le ... constructeur de copy. Mais WTF ??? Sont-ils conscient que c'est impossible ? (à part peut-être en situation d'héritage, mais à quoi bon alors protéger un code qui ne rime à rien et qui a de lui-même toutes les chances de finir en comportement non défini)
    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. [POO] Constructeur par copie
    Par kacedda dans le forum C++
    Réponses: 16
    Dernier message: 05/05/2007, 12h38
  2. [Debutant] Problème avec un constructeur par copie
    Par Drannor dans le forum Débuter
    Réponses: 5
    Dernier message: 12/03/2007, 09h15
  3. Réponses: 5
    Dernier message: 03/12/2006, 15h55
  4. Constructeur par copie et std::list
    Par Captain_JS dans le forum SL & STL
    Réponses: 5
    Dernier message: 13/12/2005, 19h15
  5. [deb.]Constructeur par copie
    Par Marc_3 dans le forum Débuter
    Réponses: 4
    Dernier message: 19/11/2005, 13h33

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