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.cpp で定義されたものではなく、でBase::count初期化されます。しかし、はローカルによって初期化されます。では、この場合、 Koenig ルックアップのようなルールがあるのだろうか?Base::countInit()countInit()local_countcountInit

4

1 に答える 1

17

あなたが書いた後、int Base::countあなたはクラスBaseにいるので、クラスの静的関数が呼び出されます。ここでは非修飾ルックアップが使用されます

3.4.2/13 から

クラス X (9.4.2) の静的データ メンバーの定義で使用される名前 (静的メンバーの修飾 ID の後) は、その名前が X のメンバー関数で使用されたかのように検索されます。

9.4.2から

静的データ メンバーの定義は、メンバーのクラス定義を囲む名前空間スコープに表示されます。名前空間スコープでの定義では、静的データ メンバーの名前は、:: 演算子を使用してそのクラス名で修飾されます。静的データ メンバーの定義の初期化式は、そのクラスのスコープ内にあります

例:

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

于 2013-07-17T09:26:28.983 に答える