在 class 之外初始化一个私有静态字段(本例中 private 的含义)并调用静态函数

Initialize a private static field outside the class (the meaning of private in this case) and calling to static functions

如果我会在class中定义一个私有静态字段。鉴于它是一个私有字段,我不能在 class 之外初始化它吗?

class X{
    static int private_static_field;
public:
    static void setPrivateStaticField(int val);
};

void X::setPrivateStaticField(int val) {
    private_static_field = val;
}


int X::private_static_field(0); // something like that it's ok? if yes, I must write this line? why? can I write it in main?

看起来没问题(根据编译器),但如果是这样,我不明白private的概念 - 如果它在class之外怎么办?


此外,鉴于上面的class,以及下一个代码:

int main() {
    X x1();
    x1.setPrivateStaticField(3);
    return 0;
}

x1.setPrivateStaticField(3); 是什么意思,毕竟这个函数是static,因此它与某些对象无关。
因此,我不明白如何用对象 (x1) 调用 setPrivateStaticField ?
(我认为 X::setPrivateStaticField(3); 就可以, x1.setPrivateStaticField(3); 会出错)

在 class 定义中声明了静态数据成员但未定义。所以他们甚至可以有一个不完整的类型。

所以这条记录

int X::private_static_field(0);

是在class定义中声明的静态数据成员的定义,如

class X{
    static int private_static_field;
    // ...

这条记录

x1.setPrivateStaticField(3);

表示访问 class 成员。静态成员也是 class 成员。使用此访问方法,编译器将知道在 class 定义中搜索名称 setPrivateStaticField,因为名称 x1 定义了 class X 的对象。

另一种访问静态成员的方法是使用下面的记录

X::setPrivateStaticField

I don't understand the concept of private - How it's ok if it's outside the class?

这里没有矛盾。 Prior to C++ 17 静态成员变量需要一个与 class 声明分开的定义。

尽管定义的文本放在 class 之外,成员变量仍然是声明它的 class 的一部分,并根据其在内部的声明保留其可访问性class。这包括私人可访问性。

What is the meaning of x1.setPrivateStaticField(3); , after all, this function is static and hence it's not related to some object.

虽然 C++ 编译器允许您在对象上调用静态成员函数,但使用范围解析运算符 :: 和 class 名称调用它们更清晰:

X::setPrivateStaticField(3);

允许或禁止 class 实例上的方法调用取决于语言的设计者。 C++ 设计者决定允许它;其他编程语言的设计者不允许,或要求编译器发出警告。