私有变量是否在类外是可见的,如果它们是静态的?

时间:2013-04-10 08:06:08

标签: c++ static visibility private

在下面的示例中(取自here),我们有一个私有静态变量x,然后我们在类之外更改它的名称。令我困惑的是为什么允许在课堂外更改私有变量?那么将其声明为private的原因是什么。

// static_member_functions.cpp
#include <stdio.h>

class StaticTest
{
private:
    static int x;
public:
    static int count()
    {
        return x;
    }
};

int StaticTest::x = 9;

int main()
{
    printf_s("%d\n", StaticTest::count());
}

3 个答案:

答案 0 :(得分:3)

这不是“改变变量”,它是定义它。

每个static成员必须在类之外定义static int x;只是一个声明;如果删除int StaticTest::x = 9;,将会出现链接器错误比如“StaticTest::x的未定义引用”。


尝试在main中更改它,例如:

StaticTest::x = 13;

你会得到错误,你期望(error: ‘int StaticTest::x’ is private)。

答案 1 :(得分:0)

在课堂外不改变变量。

考虑这个稍微修改过的例子:

class StaticTest
{
    private:
        static int x;

    public:
        static int count();
};

int StaticTest::x = 9;

int StaticTest::count()
{
    return x;
}

x 在类*之外没有初始化,也没有之外访问。class { }块只是声明类成员。StaticTest::范围限定符告诉编译器xcount()的后续定义是{{1}的一部分}。class。

尝试从StaticTest

访问x
main()

您将看到这是不可能的,因为int main() { printf_s("%d\n", StaticTest::x); } 是私有的。

这样做是为了能够从实现(在.cpp实现文件中)中分隔声明(在.hpp头文件中)。 (一旦你开始使用模板,这会中断,但没有什么是完美的。)

答案 2 :(得分:0)

访问控制不影响可见性:私有成员 任何地方都可以看到一个班级,无论他们是否如此 是否静止。

访问控制会影响名称或“访问”(不可见) 符号,而不是它们管理的实体,它会影响访问 所有的名字,无论他们的名字是什么。因为访问 控件不会影响可见性,名称查找会找到 名称,但如果您没有访问权限,那将是一个错误(甚至 如果存在与您具有相同名称的实体 访问)。

关于你的例子,我不明白这个问题。 StaticTest::x的唯一访问权限在成员函数中 StaticTest::count()。为什么这会成为问题?