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 :

[deb.]Constructeur par copie


Sujet :

C++

  1. #1
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut [deb.]Constructeur par copie
    Bonjour
    Je saisis pas tout a fait le role et l'utilisation d'un constructeur par copie.
    On s'en sert pour faire des copies et eventuellement des copies surchargee d'objet. Voila jusque la ca va a peut pres mais j'aimerai savoir ce qui se passe au niveau en dessous apres un return ou a la fermeture d'un bloc etc.
    Est_ce quelqu'un peut me dire ou trouver des info ou un tuto a ce sujet

    D'avance merci

    Marc_3

  2. #2
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut,

    ben le constructeur par copy reste un constructeur donc tout depend de la maniere dont tu as declaré ta copie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Objet obj;
     
    Objet * copie = new Objet( &obj );
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Objet copie( &obj );
    XXiemeciel
    XXiemeciel

  3. #3
    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
    Un constructeur de copie est un constructeur particulier à la signature bien précise. Il prend en entrée soit une référence constante (forme majoritaire), soit une référence vers un objet du même type.
    Soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct T
        T(T const& rhs); // forme principale qui déclare ne pas modifier rhs
        T(T & rhs); // forme qui déclare s'autoriser à modifier rhs
    };
    (Corrolaire: cela ne prendra jamais un pointeur en paramètre)

    Les constructeurs de recopie sont utilisé pour construire un nouvel objet à partir de celui passé en paramètre -- en supposant qu'il n'y a pas d'héritage.

    (je me restreins à la sémantique de valeur et de fait ignore les problèmes d'héritage. Chercher sur le forum des posts de la semaine dernière sur le comment ils doivent être utilisés lorsque l'héritage public est de la partie)
    Typiquement, ils seront appelés dans les situations suivantes:
    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
    ...{
        T toto;
        T titi = toto; // ici
        T tata(toto); // ici aussi, autre écriture globalement équivalente
     
        toto = titi; // pas ici, il s'agit d'une affectation qui repose cette fois
           // sur l'opérateur d'affectation.
     
        T & ref = toto; // pas ici, c'est une référence
        T * ptr = &toto; // pas ici, pointeur, rien à voir avec le smilblick
        T *p2 = &tata; // toujours pas
     
        *ptr = *p2; // pas ici, c'est une affectation
        ptr = &titi; // rien à voir, ptr pointe maintenant sur titi
     
        T tutu(*ptr); // ici, on construit à partir du T pointé par ptr.
    }
    ...
    void f(T t); // ici une copie est réalisé => constructeur de recopie utilisé
    void f2(T &t); // pas ici
    void f3(T const& t); // ici non plus
     
    T g(); // ici, une copie sera réalisée au moment du return
      // sauf optimisations parfois réalisées par certains compilos
    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...

  4. #4
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 491
    Points : 245
    Points
    245
    Par défaut
    merci pour les reponses cela m'aide a rentrer dans le sujet, je suis particulierement interresse par la derniere variante

    Cad celle-ci et ses implications
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    T g(); // ici, une copie sera réalisée au moment du return
      // sauf optimisations parfois réalisées par certains compilos
    Si vous avez des complements la dessus je serai ravi de bucher ca.

    Encore merci et
    D'avance merci

    marc_3

  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
    Ce n'est pas une variante. C'est une signature de fonction renvoyant un T par valeur.
    Pour avoir plus d'info : google -> "return value optimization" ou "RVO". Son support varie d'un compilateur à l'autre.
    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. Constructeur par copie et operateurs
    Par NiamorH dans le forum C++
    Réponses: 11
    Dernier message: 07/07/2007, 17h37
  2. [POO] Constructeur par copie
    Par kacedda dans le forum C++
    Réponses: 16
    Dernier message: 05/05/2007, 12h38
  3. [Debutant] Problème avec un constructeur par copie
    Par Drannor dans le forum Débuter
    Réponses: 5
    Dernier message: 12/03/2007, 09h15
  4. Réponses: 5
    Dernier message: 03/12/2006, 15h55
  5. Constructeur par copie et std::list
    Par Captain_JS dans le forum SL & STL
    Réponses: 5
    Dernier message: 13/12/2005, 19h15

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