wake-up-neo.com

Copy Constructor in C++ wird aufgerufen, wenn ein Objekt von einer Funktion zurückgegeben wird.

Ich verstehe, dass der Kopierkonstruktor in drei Instanzen aufgerufen wird

  1. Wenn ein Objekt instanziiert und mit Werten eines anderen Objekts initialisiert wird.
  2. Beim Übergeben eines Objekts nach Wert.

3. Wenn ein Objekt von einer Funktion nach Wert zurückgegeben wird.

Ich habe die Frage mit Nr. 3, ob der Konstruktor copy aufgerufen wird, wenn ein Objektwert zurückgegeben wird. Sollte er keine Probleme verursachen, wenn das Objekt lokal in der Funktion deklariert wird?.

ich meine, der Copy-Konstruktor ist ein Deep-Copy-Konstruktor und nimmt die Referenz eines Objekts als Parameter

23
Kazoom

Es heißt genau, um Probleme zu vermeiden. Ein neues Objekt, das als Ergebnis dient, wird vom lokal definierten Objekt aus initialisiert und anschließend das lokal definierte Objekt zerstört.

Im Fall eines benutzerdefinierten Konstruktors mit Tiefenkopie ist das alles dasselbe. Zunächst wird dem Objekt, das als Ergebnis dienen soll, Speicher zugewiesen, dann wird der Kopierkonstruktor aufgerufen. Es verwendet den übergebenen Verweis, um auf das lokal definierte Objekt zuzugreifen und das Notwendige auf das neue Objekt zu kopieren.

16
sharptooth

Die Kopie wird ausgeführt, bevor die aufgerufene Funktion beendet wird, und kopiert die dann vorhandene lokale Variable in den Rückgabewert.

Die aufgerufene Funktion hat Zugriff auf den Speicher, den der Rückgabewert belegen wird, auch wenn dieser Speicher beim Erstellen der Kopie nicht "im Gültigkeitsbereich" ist, er steht jedoch weiterhin zur Verfügung.

12
unwind

Gemäß einer Antwort auf meine Frage kann der Kopierkonstruktor kann aufgerufen werden sogar zweimal: einmal, um ein lokales Objekt auf das zurückgebende 'Objekt' zu kopieren, und einmal, um das zurückgegebene Objekt auf die Variable zu kopieren es wurde zugewiesen.

Es muss jedoch muss nicht sein! Der Compiler kann beide Kopierkonstruktionen wegoptimieren.

5
xtofl

Nein, es heißt, bevor die Einheimischen zerstört werden. Sie können dies mit einem Objekt testen, das die Zerstörung und die Konstruktion von Konstruktionen protokolliert, oder indem Sie den generierten Assembly-Code anzeigen.

0
Lou Franco