Ich verstehe, dass der Kopierkonstruktor in drei Instanzen aufgerufen wird
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
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.
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.
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.
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.