为什么在初始化私有静态成员时允许调用私有静态方法?

时间:2017-01-24 19:03:34

标签: c++

这段代码以我想要的方式编译和工作,但为什么呢?

#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();

它不再编译,给我一个关于尝试调用私有方法的预期错误。

3 个答案:

答案 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函数进行赋值,否则它将从禁止的类的私有数据方法中获取其值。

相关问题