这段代码以我想要的方式编译和工作,但为什么呢?
#include <iostream>
class Test {
private:
static bool _inited;
static bool _init() {
std::cout << "init!" << std::endl;
return true;
}
};
bool Test::_inited = Test::_init();
int main(int argc, char** argv) {
}
如果我认为这是一个无关的改变:
bool _inited = Test::_init();
它不再编译,给我一个关于尝试调用私有方法的预期错误。
答案 0 :(得分:4)
这段代码以我想要的方式编译和工作,但为什么呢?
因为您正在使用它,所以您在课程范围内操作,作为课程的一部分。
如果你写的话会是一样的:
static void Test::foo() {
Test::_init(); // or just _init();
}
此处,函数foo
显然是该类的一部分,因此您可以访问其中Test
的每个成员(无论是私有还是公共)。
你甚至可以删除Test::
,这是多余的,因为当初始化Test
时,编译器已经在_init()
范围内寻找_inited
(因为它是Test
)的一部分。
答案 1 :(得分:1)
我认为以下总结相当不错。采取形式http://www.cplusplus.com/doc/tutorial/classes/
范围运算符(::)指定要声明的成员所属的类,授予完全相同的范围属性,就好像此函数定义直接包含在类定义中一样。
我认为同样适用于Class中的所有内容,包括静态字段。
答案 2 :(得分:1)
答案很简单。当你写
bool Test::_inited = Test::_init();
这意味着类Test的私有静态变量的值等于_init()函数返回的值。它完全有效,因为您没有尝试从其范围之外访问私有函数。 Class_Name ::前缀将它们放在类中。他们只是不在班级宣言中。所以在某种程度上它就像将整个语句放在类中一样。
现在当你写 -
bool _inited = Test::_init();
变量_inited与类Test不同。因此,除非使用getter函数进行赋值,否则它将从禁止的类的私有数据方法中获取其值。