如果我在课堂上定义私有静态字段。鉴于它是一个私有领域,我不能在课外初始化它吗?
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
的概念 - 如果它在课外的话怎么样?
另外,鉴于上面的类,以及下一个代码:
int main() {
X x1();
x1.setPrivateStaticField(3);
return 0;
}
x1.setPrivateStaticField(3);
的含义是什么,毕竟这个函数是static
,因此它与某个对象无关。
因此,我不明白如何用对象(setPrivateStaticField
)调用x1
?
(我认为只有X::setPrivateStaticField(3);
才行,而x1.setPrivateStaticField(3);
将会出错)
答案 0 :(得分:1)
在类定义中,静态数据成员已声明但未定义。所以他们甚至可以有一个不完整的类型。
所以这条记录
int X::private_static_field(0);
是在类定义中声明的静态数据成员的定义,如
class X{
static int private_static_field;
// ...
此记录
x1.setPrivateStaticField(3);
表示访问类成员。静态成员也是类成员。使用此访问方法,编译器将知道在类定义中搜索名称setPrivateStaticField
,因为名称x1
定义了类X
的对象。
访问静态成员的另一种方法是使用以下记录
X::setPrivateStaticField
答案 1 :(得分:1)
我不明白私人的概念 - 如果它在课外的话怎么样?
这里没有矛盾。 Prior to C++ 17静态成员变量需要一个与类声明分开放置的定义。
尽管定义的文本放在类之外,但成员变量仍然是声明它的类的一部分,并根据其在类中的声明保留其可访问性。这包括私人无障碍。
x1.setPrivateStaticField(3);
的含义是什么,毕竟这个函数是静态的,因此它与某个对象无关。
虽然C ++编译器允许您在对象上调用静态成员函数,但使用范围解析运算符::
和类名称来调用它们更为清晰:
X::setPrivateStaticField(3);
允许或禁止实例上的类方法调用取决于该语言的设计者。 C ++设计师决定允许它;其他编程语言的设计者不允许这样做,或者要求编译器发出警告。