初始化类外部的私有静态字段(在本例中为private的含义)并调用静态函数

时间:2018-03-13 11:04:31

标签: c++ class static private

如果我在课堂上定义私有静态字段。鉴于它是一个私有领域,我不能在课外初始化它吗?

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);将会出错)

2 个答案:

答案 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 ++设计师决定允许它;其他编程语言的设计者不允许这样做,或者要求编译器发出警告。