是私有变量,如果它们是静态的,则在类外部可见
Are private variable visible outside of the class if they are static?
在下面的示例中(取自这里),我们有一个私有静态变量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("%dn", StaticTest::count());
}
这不是"改变变量",而是定义它。
每个static
成员必须在类之外定义 (static int x;
只是一个声明;如果您删除int StaticTest::x = 9;
,将有一个链接器错误说类似"未定义的引用StaticTest::x
")。
尝试在main
中更改它,例如:
StaticTest::x = 13;
,你会得到错误,你期望的(error: ‘int StaticTest::x’ is private
)。
访问控制不影响可见性类在任何地方都是可见的,不管它们是否存在静态或非静态
访问控制影响对名称或对象的"访问"(而不是可见性)符号,而不是它们所管理的实体,这会影响访问给所有人,不管他们叫什么名字。因为访问控件不影响可见性,名称查找将找到名称,但如果您没有访问权限,它将是一个错误(甚至)如果存在与您拥有相同名称的实体访问)。
关于你的例子,我不明白这个问题。只有在成员函数中才能访问StaticTest::x
StaticTest::count()
。为什么这是一个问题呢? 该变量不能在类之外更改。
考虑这个稍微修改过的例子:
class StaticTest
{
private:
static int x;
public:
static int count();
};
int StaticTest::x = 9;
int StaticTest::count()
{
return x;
}
x
既不是在类之外初始化,也不是在类之外访问。class { }
块仅声明类成员。StaticTest::
作用域限定符告诉编译器x
和count()
的后续定义是StaticTest
类的一部分。
尝试从main()
访问x
:
int main()
{
printf_s("%dn", StaticTest::x);
}
您将看到这是不可能的,因为x
是私有的。
这样做是为了将声明(在.hpp头文件中)与实现(在.cpp实现文件中)分开。(一旦你开始使用模板,这就打破了,但没有什么是完美的。)
相关文章:
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 堆栈/帧指针作为外部变量
- const_cast const 方法中的"this"将"this"分配给外部变量?
- 外部变量的初始化
- 如何在命名空间中初始化外部变量
- 将全局外部变量的私有版本与 OpenMP 结合使用
- 使用外部变量会导致"unsigned char"错误LNK2001
- 为什么通过复制捕获 lambda 具有与外部变量相同的地址
- 我们是否应该在项目中包含的所有文件中声明外部变量
- 如何将 Wifi.localIP() 转换为字符串并将其存储到外部变量
- 具有仅在某些情况下引用外部变量的属性的类
- C 中的外部变量
- Xcode C++外部变量链接器错误
- 使用外部变量时的多重定义错误
- C 和 C++ 中的外部变量有什么区别
- 默认情况下,非常量变量不被视为外部变量吗?
- 当外部变量在其他文件中声明不同时,如何使G 产生警告
- 是初始化为其默认值的外部变量
- 将外部变量传递给类 c++
- C++中有更多的类和外部变量