Dans quelles situations le C++ constructeur de copie appelé?

Je sais que les situations suivantes en c++ où le constructeur de copie serait invoquée:

  1. lorsqu'un objet est attribuée à un objet de sa propre classe

    MyClass A,B;
    A = new MyClass();
    B=A; //copy constructor called 
  2. si une des fonctions reçoit comme argument, passé par valeur, un objet d'une classe

    void foo(MyClass a);
    foo(a); //copy constructor invoked
  3. lorsqu'une fonction retourne (en valeur) d'un objet de la classe

    MyClass foo ()
       {
          MyClass temp;
          ....
          return temp; //copy constructor called
       } 

N'hésitez pas à corriger les éventuelles erreurs que j'ai fait; mais je suis plus curieux de savoir si il y a d'autres situations dans lesquelles le constructeur de copie est appelé.

  • J'ai pensé A=B; appelle la copie opérateur d'affectation.
  • Lire aussi à propos de la valeur de retour d'optimisation (RVO), votre dernier exemple, pourrait ne pas copier quoi que ce soit.
  • En outre, A = new MyClass(); ne compile pas.
  • Ce n'est pas valide en C++.
  • seulement c'est fait après la déclaration de A. Par exemple: A a; ... a=b;. Si c'est fait à la déclaration elle-même, puis A a=b est équivalent à A a(b).
  • intéressant. Je suppose que ça ne ferait pas de sens de le construire, de le supprimer, puis de le copier.
  • J'ai roulé en arrière à la version précédente de la question parce que les réponses et les commentaires ont été basés sur elle.
  • En fait, A a = b; est équivalent à A a(A(b)); si je me souviens bien, et a donc besoin d'une copie accessible constructeur sur le dessus d'une conversion implicite.
  • Excusez-moi, mais votre java est à l'affiche.
  • Prowl ne pourrait-elle pas compiler si MyClass avait une surcharge de l'opérateur d'affectation de la prise d'un MyClass* comme argument?
  • Ah, nice (ou plutôt moche!) 😉 Oui, il serait, cependant il n'y a pas de raison de considérer que la possibilité ici, comme l'OP est surtout concerné par les principes de base de la copie et de l'affectation. Mais oui, votre observation est correcte.
  • double possible de C++ constructeur de copie comportement

InformationsquelleAutor Pandrei | 2014-01-18