2016-06-30 43 views
6

Supponiamo che io ho la seguente classe:È definito?

struct A{ 
    void method(A& otherA) const{ 
    /* Mutate otherA */ 
    } 
}; 

E poi ho questo:

A myA; 
myA.method(myA); 

Ho detto al compilatore che method non cambierà l'istanza this, ma fa il compilatore rendersi conto che Potrei passare l'istanza this come parametro?

Potrei interrompere le cose facendo questo? Questo comportamento definito?

+0

Sì, puoi farlo. Il compilatore non poteva sapere se sono la stessa istanza. Dovresti impostare il tipo di parametro 'const' se non vuoi che il parametro passato sia cambiato. – songyuanyao

+0

@songyuanyao No .... ma voglio cambiarlo – DarthRubik

+0

Quindi andrà bene. Puoi cambiarlo tramite argomenti passati. – songyuanyao

risposta

10

Questo è assolutamente soddisfacente, e non è un problema. Quello che stai facendo in questo esempio è talvolta chiamato "aliasing" - quando due argomenti si riferiscono effettivamente allo stesso oggetto.

Si consideri il caso ancora più semplice in pianura C:

void foo(int* a, const int* b) { *a += *b; } 

Tale funzione prende due puntatori a int s, e aggiunge il secondo al primo. E, naturalmente, questo codice per utilizzare la mia funzione foo è perfettamente valida:

int x = 10; 
foo(&x, &x); // now x is 20 

Se non ti piace che il comportamento in questo caso, la cosa migliore da fare sarebbe probabilmente per aggiungere un controllo all'interno del vostro metodo come

void A::method(A& otherA) const { 
    if (this == &otherA) { /* aliasing detected */ } 
    else { /* proceed as normal */ } 
} 
+0

La mia preoccupazione principale era che il mio programma potesse basarsi su "comportamenti non definiti", quindi volevo solo ricontrollare ..... grazie – DarthRubik