2

在下面的示例中(取自此处),我们有一个私有静态变量 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());
}
4

3 回答 3

4

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

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


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

StaticTest::x = 13;

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

于 2013-04-10T08:08:46.387 回答
0

变量在类外没有改变。

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

class StaticTest
{
    private:
        static int x;

    public:
        static int count();
};

int StaticTest::x = 9;

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

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

尝试x从您的访问main()

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

你会发现这是不可能的,因为它x是私有的。

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

于 2013-04-10T08:12:44.910 回答
0

访问控制不影响可见性:类的私有成员在任何地方都是可见的,无论它们是否是静态的。

访问控制影响对名称或符号的“访问”(而不是可见性),而不影响它们管理的实体,并且它影响对所有名称的访问,无论它们的名称是什么。因为访问控制不影响可见性,名称查找会找到名称,但如果您没有访问权限,则会出错(即使存在您有权访问的同名实体)。

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

于 2013-04-10T08:12:49.343 回答