在 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++ 设计者决定允许它;其他编程语言的设计者不允许,或要求编译器发出警告。
如果我会在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++ 设计者决定允许它;其他编程语言的设计者不允许,或要求编译器发出警告。