此代码编译并运行时没有错误:
class foo{
static foo *ref;
foo(){}
public:
static foo *getRef(){
return ref;
}
void bar(){}
};
foo* foo::ref = new foo; // the construcrtor is private!
int main(int argc, const char *argv[])
{
foo* f = foo::getRef();
f->bar();
return 0;
}
有人可以解释为什么可以调用构造函数吗?
答案 0 :(得分:15)
该范围不是全局的 - 静态成员在类范围内,因此它们的初始化表达式也在类范围内。
答案 1 :(得分:10)
答案是它在全球范围内不可用。静态成员的初始化程序被定义为在类范围内,因此它可以访问私有成员。
§9.4.2/ 2 [...]静态数据成员定义中的初始化表达式在其类的范围内(3.3.6)。
答案 2 :(得分:-2)
在旧的c ++中,这种静态成员的初始化形式不是必需的。它们在c ++的后期版本中被强制执行。
并且,这种形式的静态成员初始化通常用于在创建任何类对象之前初始化静态成员。
(E.g) int MyClass::objectsCounter=0;
但是,
foo* foo::ref = new foo;
这个语句你只是通过创建一个新对象来初始化一个静态成员(它是指针类型)。
在这种情况下,您通过调用其自己的类的私有方法来初始化私有成员。
因此,全球范围内没有角色。