Warum der Kopierkonstruktor umgangen wird, wenn einem vorhandenen Objekt ein neuer Wert zugewiesen wird
Im bereitgestellten Codeausschnitt wird ein Objekt a mit initialisiert der Wert 5. Der Standard-A-Konstruktor wird wie erwartet aufgerufen. Allerdings wird der Kopierkonstruktor entgegen der Annahme nicht beim Zuweisen des neu konstruierten Objekts aufgerufen.
Dieses Verhalten ist weder das Ergebnis einer Compileroptimierung noch ein Versäumnis in der Sprachspezifikation. Es ist explizit im C-Standard dokumentiert (§12.8.15, S. 211). Der Standard besagt, dass es „völlig akzeptabel“ ist, dass die folgenden Zuweisungen semantisch äquivalent sind:
T = x; T(x);
Daraus folgt logischerweise, dass eine redundante Zuweisung wie T(T(x)) aus der Codeoptimierung entfernt werden kann . Daher ruft der Compiler automatisch den Standardkonstruktor auf, um a zu initialisieren, und weist dann das neu erstellte Objekt direkt zu.
Um den Aufruf des Kopierkonstruktors zu erzwingen, muss vor der Zuweisung explizit a standardmäßig erstellt werden:
A a; // Default-construct 'a' // Copy constructor will be called to // copy data from the newly constructed object. a = A(5);
Das obige ist der detaillierte Inhalt vonWarum wird der Kopierkonstruktor beim Zuweisen zu einem vorhandenen Objekt in C nicht aufgerufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!