2014-12-15 9 views
7

Quando una variabile oggetto viene riassegnata in C++, cosa succede al valore originale? Nel codice seguente un oggetto viene creato nello stack e inserito nella variabile . Quindi un nuovo oggetto viene creato nello stack e inserito nella stessa variabile. Cosa succede all'oggetto originale? Rimane in pila fino a quando la variabile non viene utilizzata?Quando la variabile dell'oggetto viene riassegnata in C++, cosa succede all'oggetto originale?

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

Di solito, tutto ciò che accade è che l'oggetto originale viene modificato. – juanchopanza

risposta

9

Quello che succede è che viene chiamato l'operatore di assegnazione della classe. Nella maggior parte dei casi ciò significa solo che i contenuti del vecchio oggetto vengono aggiornati con i valori del nuovo oggetto. Quindi, se ClassName è:

struct ClassName 
{ 
    int a; 
    int b; 

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

In questo caso l'operatore di assegnazione di default sarebbe chiamato, che sarebbe equivalente a:

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

Per le classi che hanno contenuti dinamici ci sarebbe un po 'più a che fare, ma i risultati saranno generalmente gli stessi. Poiché l'operatore di assegnazione può essere ignorato, tutto potrebbe teoricamente accadere, ma questo è ciò che ci aspettiamo.

+0

Grande, grazie! Questo lo risolve. – naavis

3

Tecnicamente il operator= viene invocato dalla parte sinistra della assegnazione, come ad esempio

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

Nel tuo caso, se non si definisce esplicitamente l'operatore di assegnazione, il compilatore genera un predefinito per te, che copia il lato destro usando gli operatori di assegnazione delle copie dei suoi singoli membri. Quindi il lato sinistro (vale a dire, variable nel tuo caso) viene modificato e i suoi singoli membri sono copie dei membri del lato destro temporaneo.

4

In realtà, non succede nulla all'oggetto: lo stai ancora utilizzando!

L'assegnazione non sostituisce l'intero oggetto con un oggetto diverso: invoca l'operatore di assegnazione dell'oggetto originale, consentendo all'oggetto di farlo sembrare qualcosa di nuovo, anche se non lo è.

Ad esempio:

int x = 1; 
x = 2; 

si è dichiarato solo uno oggetto qui, anche se il suo valore cambia.

Ovviamente ci sono anche più oggetti in gioco anche in questo semplice frammento — sia lo 1 che lo 2 sono letterali interi e oggetti temporanei. Tuttavia, non sono questi che hai chiesto. Il loro valore viene copiato in x.

Allo stesso modo, nel proprio codice di copiare il "valore" della temporanea ClassName(c, d) in variable, ma variable è ancora l'originale variable.

Il temporaneo ClassName(c, d) esce dal campo di applicazione alla fine della riga in cui è stato utilizzato; i byte usati per rappresentarlo (a meno che non siano ottimizzati) risiederanno probabilmente all'interno dello stack frame fino a quando non abbandonerai l'ambito della funzione, sebbene non sarai legalmente in grado di leggerli.

Problemi correlati