2013-07-17 48 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::count被初始化为Base::countInit()而非Base.cpp定义的countInit()。但local_count由本地countInit初始化。所以,我想知道,在这种情况下是否有像Koenig lookup的规则?

+0

所以'INT基准::计数= countInit() ;'调用成员? –

+1

@LuchianGrigore,是的,它的确如此。我不知道发生了什么事。 – chris

+0

其中是“int Base :: count = countInit();”被调用?导致静态成员函数Base :: countInit()计数不会仅由countInit()超出Base类的作用域调用。 – lulyon

回答

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; 

+0

谢谢。非常清楚。 – Donglei