2013-07-17 10 views
13

Ich habe eine Frage darüber, welche Funktion gewählt wird, um ein statisches Klassenmitglied zu initiieren.Welche Funktion wird zum Initialisieren des statischen Klassenmembers verwendet?

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

Die Variable Base::count mit Base::countInit() initialisiert statt der countInit() in Base.cpp definiert. Aber die local_count wird von der lokalen countInit initialisiert. Also, ich frage mich, gibt es eine Regel wie Koenig Lookup in diesem Fall?

+0

So 'int Basis :: count = countInit() ; 'ruft das Mitglied an? –

+1

@LuchianGrigore, Ja, tut es. Ich war mir nicht bewusst, dass das passiert ist. – chris

+0

wo ist "int Base :: count = countInit();" aufgerufen? Ursache statische Elementfunktion Base :: countInit() count wird nicht nur von countInit() außerhalb des Bereichs der Klasse Base aufgerufen. – lulyon

Antwort

17

Nachdem Sie int Base::count schreiben, befinden Sie sich in Klasse Base, so dass statische Funktion der Klasse aufgerufen wird. Unqualifiziert lookup wird hier verwendet wird

von 3.4.2/13

ein Namen in der Definition eines statischen Datenelementes der Klasse X (9.4.2) (nach der qualifizierten-ID der statischen verwendet Mitglied) nachgeschlagen, als ob der Name in einer Member-Funktion von X. Mitglied

von 9.4.2

die Definition für ein statisches Daten verwendet wurde, wird in einem Namespace Umfang erscheint das umschließende Element der Klassendefinition. In der Definition im Namespacebereich muss der Name des statischen Datenelements anhand seines Klassennamens mithilfe des Operators :: qualifiziert werden. Der Initialisierer Ausdruck in der Definition eines statischen Datenelement ist im Rahmen seiner Klasse

Beispiel:

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

+0

Danke. sehr deutlich. – Donglei

Verwandte Themen