在下面的示例中(取自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());
}
答案 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::
范围限定符告诉编译器x
和count()
的后续定义是{{1}的一部分}。class。
尝试从StaticTest
:
x
main()
您将看到这是不可能的,因为int main()
{
printf_s("%d\n", StaticTest::x);
}
是私有的。
这样做是为了能够从实现(在.cpp实现文件中)中分隔声明(在.hpp头文件中)。 (一旦你开始使用模板,这会中断,但没有什么是完美的。)
答案 2 :(得分:0)
访问控制不影响可见性:私有成员 任何地方都可以看到一个班级,无论他们是否如此 是否静止。
访问控制会影响名称或“访问”(不可见) 符号,而不是它们管理的实体,它会影响访问 所有的名字,无论他们的名字是什么。因为访问 控件不会影响可见性,名称查找会找到 名称,但如果您没有访问权限,那将是一个错误(甚至 如果存在与您具有相同名称的实体 访问)。
关于你的例子,我不明白这个问题。
StaticTest::x
的唯一访问权限在成员函数中
StaticTest::count()
。为什么这会成为问题?