2014-12-15 3 views
7

Wenn eine Objektvariable in C++ neu zugewiesen wird, was passiert mit dem ursprünglichen Wert? Im folgenden Code wird ein Objekt auf dem Stapel erstellt und in Variable platziert. Dann wird ein neues Objekt auf dem Stapel erstellt und in derselben Variablen platziert. Was passiert mit dem Originalobjekt? Bleibt es auf dem Stapel, bis Variable den Geltungsbereich verlässt?Wenn Objektvariable in C++ neu zugewiesen wird, was passiert mit dem ursprünglichen Objekt?

void foo() { 
    ClassName variable(a, b); // variable created on the stack 
    variable = ClassName(c, d); // new value for variable created on stack 
    ... 
} 
+4

In der Regel wird nur das ursprüngliche Objekt geändert. – juanchopanza

Antwort

9

In diesem Fall wird der Zuweisungsoperator der Klasse aufgerufen. In den meisten Fällen bedeutet das nur, dass der Inhalt des alten Objekts mit Werten aus dem neuen Objekt aktualisiert wird. wenn ClassName so ist:

struct ClassName 
{ 
    int a; 
    int b; 

    ClassName(int a, int b) : a(a), b(b) {} 
}; 

In diesem Fall ist der Standardzuweisungsoperator würde genannt werden, die gleichwertig sein würde:

ClassName& operator=(const ClassName& other) 
    { 
     a = other.a; 
     b = other.b; 
     return *this; 
    } 

Für Klassen, die dynamische Inhalte haben es wäre ein bisschen mehr zu tun, aber die Ergebnisse werden im Allgemeinen die gleichen sein. Da der Zuweisungsoperator außer Kraft gesetzt werden kann, könnte theoretisch alles passieren, aber das erwarten wir.

+0

Großartig, danke! Das macht es klar. – naavis

3

Technisch die operator= von der linken Seitenteil des assignement aufgerufen wird, wie

variable.operator=(ClassName(c,d)); 

In Ihrem Fall, wenn Sie den Zuweisungsoperator nicht explizit definieren, erzeugt der Compiler ein standardmäßig eine für Sie, die die rechte Seite mit den Kopierzuweisungsoperatoren ihrer einzelnen Mitglieder kopiert. So wird die linke Seite (d. H. variable in Ihrem Fall) modifiziert, und ihre einzelnen Mitglieder sind Kopien der Mitglieder der rechten Seite temporär.

4

Tatsächlich passiert nichts mit dem Objekt: Sie verwenden es immer noch!

Die Zuweisung ersetzt nicht das gesamte Objekt durch ein anderes Objekt: Es ruft den Zuweisungsoperator dieses Originalobjekts auf und ermöglicht es dem Objekt, es wie etwas Neues aussehen zu lassen, auch wenn dies nicht der Fall ist.

Zum Beispiel:

int x = 1; 
x = 2; 

Sie haben nur ein Objekt hier erklärt, auch wenn sich sein Wert ändert.

Natürlich gibt es in der Tat mehrere Objekte im Spiel in diesem einfachen Schnipsel — sowohl die 1 als auch die 2 sind Integer-Literale und temporäre Objekte. Sie haben sich jedoch nicht zu diesen Fragen geäußert. Ihr Wert wird in x kopiert.

Auf ähnliche Weise in Ihrem eigenen Code kopieren Sie den „Wert“ des temporären ClassName(c, d) in variable, aber variable ist immer noch die ursprüngliche variable.

Das temporäre ClassName(c, d) geht am Ende der Zeile, in der Sie es verwendet haben, aus dem Gültigkeitsbereich; Die Bytes, die für die Darstellung verwendet werden (sofern sie nicht optimiert wurden), werden sich wahrscheinlich innerhalb des Stack-Rahmens befinden, bis Sie den Funktionsumfang verlassen, obwohl Sie rechtlich nicht in der Lage sein werden, sie zu lesen.

Verwandte Themen