2014-06-26 11 views
5

Załóżmy, że mam następujące klasy:Co się stanie, jeśli nie użyjesz "tego" w klasie?

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

}; 

Definicja:

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

Teraz w linii someNum = someNum, który someNum jest, o którym mowa? Jeśli to zrobię:

this->someNum = someNum 

Co to jest drugie słowo?

Jaki jest dobry styl nazywania, aby uniknąć tego problemu? Na przykład w celu-c przedrostek "_" przed nazwą zmiennej składowej. (np .: _someNum);

Odpowiedz

9

Wewnątrz funkcji członka nazwa parametru ukrywa identyczne imiona członków klasy, więc w

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

someNum s oba odnoszą się do parametru. To jest samo-przydział, który nie zmienia się this->someNum.

W this->someNum = someNum; drugi someNum odnosi się do parametru funkcji. Przypisuje to wartość parametru funkcji someNum do elementu klasy someNum.

Typowe konwencje nazewnictwa obejmują prefiks m lub m_ lub postfix _ dla członków klasy. Podkreślenie podkreślenia może być problematyczne, ponieważ C++ rezerwuje nazwy zaczynające się od podkreślenia poprzedzonego wielką literą.


Zauważ, że wykazy członkiem initializer w konstruktorów jest szczególnym przypadkiem:

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

Warto zauważyć, że zasada ta nie ma zastosowania do listy członkiem inicjatora konstruktor jest. 'foo (int someNum): someNum (someNum) {}' robi właściwą rzecz. – sbabbi

+0

@sbabbi Dzięki, dodałem. –

1

Zmienna zadeklarowana w najgłębszym zakresie cienie zmiennych w zakresach zewnętrznych. Tak więc someNum = someNum' w foo::calculation nie ma wpływu na zmienną składową someNum. Zamiast tego, someN odnosi się do przekazanego argumentu. Aby pomóc w złagodzeniu tego, standardy nazewnictwa sugerują przedrostek twoich zmiennych członkowskich za pomocą stałego identyfikatora - "m_", na przykład.

Powiązane problemy