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

Are private variable visible outside of the class if they are static?

本文关键字:外部 变量 如果 静态      更新时间:2023-10-16

在下面的示例中(取自这里),我们有一个私有静态变量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::xStaticTest::count()。为什么这是一个问题呢?

该变量不能在类之外更改。

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

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

x 既不是在类之外初始化,也不是在类之外访问class { }块仅声明类成员。StaticTest::作用域限定符告诉编译器xcount()的后续定义StaticTest类的一部分。

尝试从main()访问x:

int main()
{
    printf_s("%dn", StaticTest::x);
}

您将看到这是不可能的,因为x是私有的。

这样做是为了将声明(在.hpp头文件中)与实现(在.cpp实现文件中)分开。(一旦你开始使用模板,这就打破了,但没有什么是完美的。)