2014-06-26 13 views
5

Supponiamo che io ho la seguente classe:Cosa succede se non si utilizza "questo" all'interno di una classe?

class foo{ 
public: 
     int someNum; 
     void calculation(int someNum); 

}; 

Definizione:

void foo::calculation(int someNum){ 
     someNum = someNum; 
} 

Ora nella linea someNum = someNum, che someNum si sta riferendo? Se faccio:

this->someNum = someNum 

Allora qual è la seconda someNum?

Qual è uno stile di denominazione valido per evitare questo problema? Ad esempio, nell'obiettivo-c, un prefisso "_" prima di un nome di variabile membro. (ad esempio: _someNum);

risposta

9

All'interno di una funzione membro il nome del parametro nasconde nomi utente classe identici, così in

void foo::calculation(int someNum){ 
     someNum = someNum; 
} 

entrambi someNum s si riferiscono al parametro. È un autoassegnazione che non cambia this->someNum.

In this->someNum = someNum;, il secondo someNum si riferisce al parametro funzione. Quindi assegna il valore del parametro funzione someNum al membro della classe someNum.

Le convenzioni di denominazione comuni includono un prefisso m o m_ o un suffisso _ per i membri della classe. Un carattere di sottolineatura del prefisso può essere problematico perché il C++ riserva nomi che iniziano con un trattino basso seguito da una lettera maiuscola.


Nota che le liste membro di inizializzazione nei costruttori è un caso speciale:

foo(int someNum) : someNum(someNum) { someNum = someNum; } 
       ^ ^  ^  ^
        |  |   |   | 
        |  ---------------------- 
        |  These three all refer to the parameter 'someNum', 
        |  and not the class member. 
        | 
    The language requires this name to be referring 
    to a class member (or a base class) and so the 
    parameter called 'someNum' is not considered. 
+5

Vale la pena notare che questa regola non si applica ai elenco dei membri di inizializzazione di un costruttore. 'foo (int someNum): someNum (someNum) {}' fa la cosa giusta. – sbabbi

+0

@sbabbi Grazie, aggiunto. –

1

La variabile dichiarata nello scope più interno ombreggia le variabili negli ambiti esterni. Pertanto, someNum = someNum' in foo::calculation non ha alcun effetto sulla variabile membro someNum. Invece, someNum si riferisce all'argomento passato. Per contribuire ad alleviare questo problema, gli standard di denominazione suggeriscono il prefisso delle variabili membro con un identificatore coerente - "m_", per esempio.

Problemi correlati