Quand appelle-t-on l’opérateur d’affectation de copie?

Quand j’ai lu sur le constructeur de copie et le constructeur d’affectation de copie, ce que j’ai compris, c’est que les deux donnent leurs propriétés l’une à l’autre, et que les deux sont déclarés implicitement par le compilateur (si non défini). Il faut donc que les deux existent, que l’on fasse quelque chose d’utile ou non.

Ensuite, j’ai testé ce code:

#include  using namespace std; class Test { public: Test () { cout << "Default constructor" << endl; } Test (const Test& empty) { cout << "Copy constructor" << endl; } Test& operator=(const Test& empty) { cout << "Copy assignment operator" << endl; } private: }; int main () { Test a; // Test default constructor Test b (a); // Test copy constructor Test c = b; // Test copy assignment constructor system ("pause"); return 0; } 

Mais il semble que l’opérateur d’atsortingbution de copie ne soit pas appelé du tout. J’ai essayé avec trois conditions:

  1. Tout est inclus Il imprime:

     // Default constructor // Copy constructor // Copy constructor # Why not prints out "Copy assignment operator"? 
  2. L’opérateur d’affectation de copie sans copie vient de copier le constructeur Il imprime:

     // Default constructor // Copy constructor // Copy constructor # Why it's printed out even though I didn't define it? 
  3. Le constructeur de copie sans copie ne fait que copier l’opérateur d’affectation. Il imprime:

     // Default constructor # Why "Copy assignment operator" is not printed out? 
  4. Seul constructeur. Il imprime:

     // Default constructor # Understandable 

Donc, c’est comme si le compilateur ne se souciait même pas de définir ou non l’opérateur d’atsortingbution de copie. Aucun des quatre exemples ci-dessus n’imprime “Opérateur d’affectation de copie”. Alors, quand a-t-il été appelé, s’il existe réellement et a un sens?

Test c = b est une initialisation , pas une affectation.

Si vous aviez fait ceci:

 Test c; c = b; 

Ensuite, il aurait appelé l’opérateur d’affectation de copie.