Kopierkonstruktor wird durch direkte Initialisierung aufgerufen
Im bereitgestellten Codeausschnitt können Sie erwarten, dass der Kopierkonstruktor aufgerufen wird, wenn A(5 zugewiesen wird ) zu a. Der Code ruft jedoch niemals den Kopierkonstruktor auf. Dieses Verhalten ist kein Ergebnis der Compileroptimierung, sondern eine dokumentierte Funktion von C.
Wenn Sie ein Objekt mithilfe der direkten Initialisierung (A a = A(5);) initialisieren, führt der Compiler eine Kopierelision durch. Durch diese Optimierung entfällt die unnötige Erstellung eines temporären Objekts, gefolgt von der Kopie dieses Objekts in die initialisierte Variable. Stattdessen wird die initialisierte Variable direkt mit dem Argument für den Konstruktor initialisiert.
Dieses Verhalten ist im C-Standard (§12.8.15, S. 211) dokumentiert, der besagt, dass die direkte Initialisierung dem Erstellen des entspricht Objekt direkt mit den Argumenten für den Konstruktor:
T x; // Default initialization T x = y; // Direct initialization
In diesem Fall wird a direkt mit den Argumenten für den A-Konstruktor initialisiert, Umgehen des Kopierkonstruktors. Um den Compiler zu zwingen, den Kopierkonstruktor aufzurufen, müssen Sie zunächst standardmäßig a konstruieren:
A a; // A is now a fully constructed object, // so it can't call constructors again: a = A(5);
Dadurch wird sichergestellt, dass der Kopierkonstruktor aufgerufen wird, wenn a der Wert A(5) zugewiesen wird.
Das obige ist der detaillierte Inhalt vonWarum wird der Kopierkonstruktor während der direkten Initialisierung in C nicht aufgerufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!