2016-09-13 11 views
-1

verwendet wird mir bitte korrigieren, wenn ich falsch bin, aber mein Verständnis ist, dass eine Kopie Konstruktor wird verwendet, wenn Sie dies tun:(C++) Zuweisungsoperator vs Copykonstruktor: wenn jeder implizit

myClass newInstant = oldInstant; 

während einer Zuordnung Operator wird verwendet, wenn Sie dies tun:

myClass newInstant; 
newInstant = oldInstant; 

ich glaube, beide das gleiche Ergebnis erzielen, aber die erste ist direkter, weil es einen Konstruktor zu vermeiden, mit zuerst, dann das Kopieren über den neuen Daten.

Woran ich mich nicht sicher bin: Wenn eine Funktion nicht sofort durch Verweis übergeben wird, wird sie mit dem Kopierkonstruktor oder dem Zuweisungsoperator kopiert. Zusätzlich, das verwendet wird, wenn ein Moment von der Funktion zurückgegeben wird.

Im Allgemeinen, in welchen Fällen werden der Kopierkonstruktor und der Zuweisungsoperator verwendet?

Eine letzte Frage, wie würde ich einen Wert zurückgeben, ohne es zu kopieren? Wenn ein zurückgegebener Instant eine Kopie ist und der alte Instant gelöscht wird, wie würde ich das umgehen, um effizienter zu sein?

Dank

+2

Der Kopierkonstruktor wird verwendet, wenn eine neue Instanz mit einer vorhandenen Instanz erstellt wird und ein Zuweisungsoperator zum Überschreiben einer vorhandenen Instanz durch eine andere Instanz verwendet wird. Wenn also etwas wertmäßig an eine Funktion übergeben wird, wird eine neue Instanz aus einer bestehenden erzeugt, also .......... Wenn Sie bei der Rückgabe nach Wert Kopien vermeiden möchten, stellen Sie sicher, dass der Code eine Rückgabewertoptimierung ermöglicht, oder verschieben Sie, was immer teuer zu kopieren ist. –

+0

die "letzte Frage" ist eine separate Frage. Bitte halte dich an 1 Frage pro Frage. Sie sollten in der Lage sein, Antworten auf diese Frage zu finden, indem Sie die Site durchsuchen –

Antwort

1

Copykonstruktor wird verwendet, wenn Sie ein Objekt eines exisiting ein wie in Ihrem Beispiel initialisieren:

ist
vClass oldInstant; 
yClass newInstant = oldInstant; // invoking copy constructor 

Zuweisungsoperator etwas zuweisen verwendet sagen wir mal, ein vorhandenes Objekt an einen anderen bestehenden .

myClass newInstant; // invoking myClss constructor. so from now and on newInstant is already existing object; 
newInstant = oldInstant; //oldInstant is also an already existing object. now assign one object to another. (assigning oldInstant to newInstant) 

Denken Sie daran, dass ihre Verwendung völlig anders ist, aber jeder hat seine eigene Verwendung. *** manchmal wollen wir ein Objekt erstellen und ihm ein anderes existierendes (Kopierkonstruktor) zuweisen, weil wir vielleicht das ursprüngliche Objekt speichern und etwas auf der Kopie machen wollen.

*** Zuweisungsoperator können wir nicht vermeiden, es zu verwenden !! Können Sie in Mathe Berechnungen ohne Gleichheitsoperator '=' durchführen?

Dinge Kopierkonstruktor und Zuweisungsoperator tun soll:

*** Copykonstruktor „tiefe Kopie“ nicht „flache Kopie“ verwenden soll, wenn einige es Speicher auf dem Heap (Zeiger mit ‚neuem‘ Schlüsselwort zugeordnet)

Dies sind nur einige Erklärungen, aber Sie sollten mehr suchen, bevor Sie fragen, weil die Mitglieder über Sie abstimmen werden.

0

Technisch der Kopierkonstruktor wird in den folgenden Fällen aufgerufen:

  1. explizite Kopie Bau
  2. call by value
  3. Rückkehr nach Wert

Der Zuweisungsoperator implementiert ist ein auszulöschen den alten Inhalt der Instanz mit neuen beenden.Wie Sie ein Beispiel vorstellen:

myClass newInstant; 
newInstant = oldInstant;//assignment operator 

Denken Sie daran, dass sie anders funktionieren. Copy-Swap ist im Zuweisungsoperator enthalten.

In Bezug auf Ihre letzte Frage, wenden moderne Compiler kopieren Konstruktor Elision, um unnötige Kopie Konstruktor Aufruf zu elide.

Verwandte Themen