哪个函数用于初始化静态类成员?

时间:2013-07-17 09:22:21

标签: c++ static-members argument-dependent-lookup

我有一个关于选择哪个函数来初始化静态类成员的问题。

//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查找这样的规则?

1 个答案:

答案 0 :(得分:17)

在您编写int Base::count后,您在班级Base中,因此将调用类的静态函数。这里将使用不合格的查找

从3.4.2 / 13

用于定义类X(9.4.2)的静态数据成员的名称(在static的qualified-id之后) 查找成员),好像名称是在X的成员函数中使用。

从9.4.2开始

静态数据成员的定义应出现在命名空间中 封闭成员类定义的范围。在命名空间范围的定义中,静态的名称 数据成员应使用::运算符通过其类名限定。 中的初始化表达式 静态数据成员的定义属于其类的范围

示例:

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