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 et operateurs


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut Constructeur par copie et operateurs
    Bonjour,

    ma question est plutôt une demande de précision.

    J'ai un constructeur par copie qui prend (const MaClasse&) en parametre.
    J'ai un operateur+ qui renvoie un const MaClasse.

    J'ai une erreur de compilation ici :
    La solution j'imagine est de faire un constructeur par copie sans référence?
    Dans ce cas, le compilateur pourra-t-il éviter la copie inutile ? Comment le vérifier ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Un temporaire (comme celui renvoyé par c1 + c2) peut tout à fait être pris en paramètre en tant que référence constante. Il faudrait nous montrer les prototypes de ton constructeur par copie ainsi que de ton opérateur +.

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Effectivement j'ai mal fait mon test, l'erreur était ailleurs.
    Au passage, un constructeur par copie sans référence est interdit ce qui semble logique après coup.

    Par contre, l'exemple mis à part, je me demande toujours si il y a une façon de voir lorsqu'un compilateur a évité une copie?

  4. #4
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Foo(const Foo& f) /*: tu initialises les attributs */
    {
    std::cout << "Foo(const Foo&) appelé" << std::endl
    }

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Le fait de mettre du code autre que de l'initialisation dans un constructeur par copie ne va-t-il pas 'forcer' le compilateur à l'appeller justement ?

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Non. Je ne pense pas. Il y a des situations bien précises dans lesquelles un constructeur de copie est appelé. La norme les liste exhaustivement, il me semble.

    Ne les connaissant pas toutes, je te suggère d'utiliser l'affichage de messages pour connaitre les moments où il est appelé.
    Une façon plus ludique est de te lister plusieurs situations où il serait susceptible d'être appelé, incrémenter un compteur dans le constructeur de copie de 1 par appel, et voir la valeur de ce compteur à la fin de ton code. Et là tu réfléchis à quelle instruction appelle le constructeur de copie.
    Le plus rapide et efficace demeurant cependant une recherche efficace sur de bons sites de programmation, entre autres sur ce forum, où quelqu'un a déjà du lister les situations où le constructeur de copie est appelé.

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Au passage, un constructeur par copie sans référence est interdit
    Pas spécialement non. C'est notamment utilisé pour faire du déplacement (ce que fait std::auto_ptr : lorsqu'il est copié il perd la responsabilité du pointeur).

    Par contre, l'exemple mis à part, je me demande toujours si il y a une façon de voir lorsqu'un compilateur a évité une copie?
    Je suppose que le meilleur moyen est de connaître les règles d'optimisation décrites dans la norme.

    Le fait de mettre du code autre que de l'initialisation dans un constructeur par copie ne va-t-il pas 'forcer' le compilateur à l'appeller justement ?
    Possible, là encore il faudrait voir ce que dit la norme (peut-être que l'élimination de la copie n'est possible que si le constructeur par copie est trivial).

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation:
    Au passage, un constructeur par copie sans référence est interdit
    Pas spécialement non. C'est notamment utilisé pour faire du déplacement (ce que fait std::auto_ptr : lorsqu'il est copié il perd la responsabilité du pointeur).
    Et bien mon compilateur m'a rappellé à l'ordre lorsque j'ai voulu écrire le constructeur par copie sans le &.

    Et ça semble logique, car si on ne passe la classe que par valeur, alors une première copie doit être faite, ce qui va appeller le constructeur par copie, et c'est le cercle sans fin. Je ne vois pas trop comment celà se pourrait autrement.

  9. #9
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    En fin de compte il me semble que je me sois emporté...
    Cela me dit quelque chose, le cas du constructeur de copie non trivial. En effet peut-être que cela a des incidences ...
    Probablement faux un bout de ce que j'ai dit plus haut...

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et bien mon compilateur m'a rappellé à l'ordre lorsque j'ai voulu écrire le constructeur par copie sans le &.
    Oups j'avais mal lu... J'avais cru voir "un constructeur par copie qui prend une référence".

  11. #11
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Un constructeur de copie prend nécessairement son premier paramètre par référence (pas nécessairement const, et potentiellement volatile), les autres ayant une valeur par défaut.

    Il est appelé à chaque fois qu'un objet est construit à partir d'un autre du même type (ou d'un type dérivé), mais il y a des cas où le compilateur peut ne pas faire de copie (que cette supression soit détectable par un programme conforme ou pas) et réutiliser en fait l'objet:
    - quand l'objet copié est un temporaire
    - quand la copie est utilisée pour bâtir le résultat d'une fonction, même si l'objet est nommé.

  12. #12
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    - quand la copie est utilisée pour bâtir le résultat d'une fonction, même si l'objet est nommé.
    Du style:
    Celui là je m'en doutais sinon tout l'article sur la métaprog s'effondre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - quand l'objet copié est un temporaire
    Je pensais que c'était la même chose, quelle est la différence ?

    Donc à priori le compilateur ne se préoccupe pas de ce qu'il y a dans le constructeur par copie pour déterminer l'appel ou non de celui-ci.

Discussions similaires

  1. [POO] Constructeur par copie
    Par kacedda dans le forum C++
    Réponses: 16
    Dernier message: 05/05/2007, 13h38
  2. [Debutant] Problème avec un constructeur par copie
    Par Drannor dans le forum Débuter
    Réponses: 5
    Dernier message: 12/03/2007, 10h15
  3. Réponses: 5
    Dernier message: 03/12/2006, 16h55
  4. Constructeur par copie et std::list
    Par Captain_JS dans le forum SL & STL
    Réponses: 5
    Dernier message: 13/12/2005, 20h15
  5. [deb.]Constructeur par copie
    Par Marc_3 dans le forum Débuter
    Réponses: 4
    Dernier message: 19/11/2005, 14h33

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