2013-07-17 13 views
13

Ho una domanda su quale funzione è stata scelta per avviare un membro di classe statico.Quale funzione viene utilizzata per inizializzare il membro della classe statico?

//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 

La variabile Base::count viene inizializzato con Base::countInit() anziché countInit() definito Base.cpp. Ma il local_count viene inizializzato dal locale countInit. Quindi, mi chiedo, c'è una regola come Koenig lookup all'interno di questo caso?

+0

Così 'int Base :: count = countInit() ; 'chiama il membro? –

+1

@LuchianGrigore, Sì, lo fa. Non ero a conoscenza di quello che è successo. – chris

+0

dove è "int Base :: count = countInit();" invocato? causa la funzione membro statico Base :: countInit() il conteggio non può essere invocato solo da countInit() al di fuori dell'ambito della classe Base. – lulyon

risposta

17

Dopo aver scritto int Base::count sei nella classe Base, verrà chiamata la funzione statica della classe. Unqualified ricerca sarà usato qui

da 3.4.2/13

Un nome utilizzato nella definizione di un membro dati statico della classe X (9.4.2) (dopo il qualificato-id della statica membro) viene cercato come se il nome è stato utilizzato in una funzione membro di X.

da 9.4.2

la definizione di un membro di dati statici devono apparire in un ambito spazio dei nomi racchiude del membro definizione della classe. Nella definizione allo scope namespace, il nome del membro statico deve essere qualificato dal suo nome di classe usando l'operatore ::. L'espressione di inizializzazione nel definizione di un membro di dati statico è nel campo di applicazione della sua classe

Esempio:

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

+0

Grazie. molto chiaro. – Donglei

Problemi correlati