2013-07-17 17 views
13

Mam pytanie dotyczące tego, która funkcja jest wybrana do inicjowania statycznego członka klasy.Której funkcji używa się do inicjowania statycznego członka klasy?

//Base.h 

class Base 
{ 
private: 
    static int count; 
    static int countInit() 
    { 
     return 10; 
    } 
public: 
    Base() 
    { 
    } 
}; 

//and Base.cpp 
static int countInit() 
{ 
    return 0; 
} 
int Base::count=countInit();//member function is used. 
static int local_count=countInit();//the local one in Base.cpp 

Zmienna Base::count inicjowany jest Base::countInit() aniżeli countInit() określonej w Base.cpp. Ale local_count jest inicjowany przez lokalny countInit. Zastanawiam się więc, czy istnieje reguła taka jak Koenig lookup w tym przypadku?

+0

więc 'Int podstawowa liczyć :: = countInit() ; 'dzwoni do członka? –

+1

@LuchianGrigore, Tak, robi. Nie wiedziałem, że to się stało. – chris

+0

gdzie jest "int Base :: count = countInit();" odwołany? wywoływać funkcję statycznego członka Funkcja Base :: countInit() nie może być wywoływana tylko przez funkcję countInit() poza zakresem klasy Base. – lulyon

Odpowiedz

17

Po napisaniu int Base::count jesteś w klasie Base, więc statyczna funkcja klasy zostanie wywołana. Nieuwarunkowany odnośników będą stosowane tutaj

od 3.4.2/13

nazwę stosuje się w definicji statycznego elementu danych klasy X, (9.4.2), (po kwalifikowanej ID statyczne członek) jest wzrok, jakby nazwa była używana w funkcji składowej X.

od 9.4.2

definicja statycznego członka danych powinien pojawić się w zakresie nazw załączając posła definicja klasy. W definicji w zakresie przestrzeni nazw nazwa statycznego elementu danych jest kwalifikowana nazwą klasy za pomocą operatora ::. Wyrażenie inicjatora w definicji statycznego elementu danych wchodzą w zakres tej klasy

przykład:

class process { 
static process* run_chain; 
static process* running; 
}; 
process* process::running = get_main(); 
process* process::run_chain = running; 

+0

Dzięki. bardzo czyste. – Donglei