C ++: Rückgabe durch Referenz- und Kopierkonstruktoren

Referenzen in C++ sind verwirren mich. 🙂

Die grundlegende Idee ist, dass ich versuche, ein Objekt wieder aus einer Funktion. Ich würde es gerne spielen, ohne Rückgabe einen Zeiger (weil dann müsste ich manuell delete es), und ohne den Aufruf des copy-Konstruktors, wenn möglich (für Effizienz, natürlich Hinzugefügt: und auch da Frage ich mich, ob ich nicht vermeiden können, schreiben Sie einen copy-Konstruktor).

So, alles in allem, hier sind die Möglichkeiten, die ich gefunden habe:

  • Die Funktion der return-Typ kann entweder in der Klasse selbst (MyClass fun() { ... }) oder eine Referenz auf die Klasse (MyClass& fun() { ... }).
  • Die Funktion kann entweder konstruieren die variable in der Zeile return (return MyClass(a,b,c);) oder senden Sie eine bereits vorhandene variable (MyClass x(a,b,c); return x;).
  • Den code, erhält die variable kann auch eine variable entweder: (MyClass x = fun(); oder MyClass& x = fun();)
  • Der code, erhält die variable kann entweder erstellen Sie eine neue variable (MyClass x = fun();) oder ordnen Sie eine bereits vorhandene variable (MyClass x; x = fun();)

Und einige Gedanken auf:

  • Es scheint eine schlechte Idee zu haben, ist der Rückgabetyp MyClass& weil das immer die Ergebnisse in die variable zerstört wird, bevor es zurückgegeben wird.
  • Der copy-Konstruktor nur scheint, sich zu engagieren, wenn ich nach einer existierenden variable. Bei der Rückkehr eine variable konstruiert, die in der Linie der Rücksendung, es wird nie genannt.
  • Wenn ich weisen Sie das Ergebnis auf eine vorhandene variable, der Destruktor auch immer einspringt, bevor der Wert zurückgegeben wird. Auch kein copy-Konstruktor aufgerufen wird, noch Ziel-variable erhält das Mitglied Werte des Objekts von der Funktion zurückgegeben.

Diese Ergebnisse sind so widersprüchlich, dass ich fühle mich Total verwirrt. Also, was GENAU ist hier passiert? Wie sollte ich richtig konstruieren und kehren Sie ein Objekt aus einer Funktion?

Kommentar zu dem Problem
Der Grund der copy-Konstruktor wird nicht aufgerufen, im zweiten Fall als return-Wert-Optimierung, oder RVO. Der compiler erlaubt das weglassen der vorübergehenden + Kopie, auch wenn diese änderungen das Verhalten des Programms. Kommentarautor: GManNickG
@Vilx - Was die Rückkehr zu einer vorhandenen Variablen Problem? Ich habe konfrontiert, aber ich konnte nicht herausfinden, warum Sie den Destruktor kicks in einem no copy-Konstruktor aufgerufen wird. Haben Sie jemals herausfinden, was ist die Ursache? Kommentarautor: Arthur Nunes
@ArthurNunes - Sorry, Nein, ich habe nicht viel gearbeitet mit C++ und ich weiß nicht, die Antwort. Ich denke, dass ich dieses Projekt aufgegeben oder schrieb es anders. (das war vor 5 Jahren, Sie wissen). Kommentarautor: Vilx-

InformationsquelleAutor der Frage Vilx- | 2010-02-16

Schreibe einen Kommentar