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()而不是countInit()在 Base.cpp 中定义的进行初始化的。但是local_count是由本地初始化的countInit。所以,我想知道,在这种情况下是否有像Koenig 查找这样的规则?

4

1 回答 1

17

写完后int Base::count你就在 class 中Base,所以 class 的静态函数将被调用。此处将使用不合格的查找

从 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 回答