2013-07-17 1 views
13

静的なクラスメンバーを初期化するために選択された関数について質問があります。静的なクラスメンバーを初期化するために使用される関数はどれですか?

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

変数Base::countBase::countInit()なくBase.cppで定義さcountInit()で初期化されます。しかし、local_countはローカルcountInitによって初期化されます。だから、この場合、Koenigルックアップのようなルールがありますか?

+0

したがって 'INTベースは(= countInitを数::) ; 'メンバーに電話しますか? –

+1

@LuchianGrigoreはい、そうです。私は起こったことを知らなかった。 – chris

+0

は "int Base :: count = countInit();"です。呼び出された?原因静的メンバー関数Base :: countInit()countは、class Baseの範囲外のcountInit()によってのみ呼び出されることはありません。 – lulyon

答えて

17

int Base::countと書いた後では、あなたはクラスBaseにいるので、クラスの静的関数が呼び出されます。 クラスX(9.4.2)の静的データメンバーの定義に使用される名前

3.4.2/13からここで

使用される非修飾ルックアップ(静的の修飾-IDの後名前を囲​​む名前空間 スコープに表示されなければなら

9.4.2

静的データメンバーの定義からXのメンバ関数で使用されたかのように 部材)が検索され会員クラス定義。名前空間スコープの定義では、静的 データメンバの名前は、:: operatorを使ってそのクラス名によって修飾されなければならない。静的データメンバの 定義における初期発現は、そのクラスの範囲内にある

例:

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

+0

ありがとうございます。非常に明確な。 – Donglei