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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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
    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 confirmé

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    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
    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 confirmé

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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).

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