Wann heißt der Kopierzuweisungsoperator?

Wenn ich über den Kopierkonstruktor und den Kopierzuweisungskonstruktor gelesen habe, habe ich verstanden, dass beide ihre Eigenschaften an andere weitergeben und dass beide implizit vom Compiler deklariert werden (falls nicht definiert). Es muss also beides geben, ob man etwas Nützliches tut oder nicht.

Dann habe ich diesen Code getestet:

#include <iostream>

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;
}

Aber es scheint, dass der Kopierzuweisungsoperator überhaupt nicht aufgerufen wird. Ich habe es mit drei Bedingungen versucht:

lles inbegriffen. Es druckt aus:

// Default constructor
// Copy constructor
// Copy constructor    # Why not prints out "Copy assignment operator"?

Whitout Kopierzuweisungsoperator kopiert nur den Konstruktor. Es druckt aus:

// Default constructor
// Copy constructor
// Copy constructor    # Why it's printed out even though I didn't define it?

Ohne Kopierkonstruktor einfach den Zuweisungsoperator kopieren. Es druckt aus:

// Default constructor # Why "Copy assignment operator" is not printed out?

Nur Konstruktor. Es druckt aus:

// Default constructor # Understandable

Also, es ist dem Compiler egal, ob ich den Kopierzuweisungsoperator definiere oder nicht. Keines der vier obigen Beispiele gibt den Ausdruck "Zuweisungsoperator kopieren" aus. Wann wurde es aufgerufen, wenn es wirklich existiert und eine Bedeutung hat?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage