【问题标题】:Private static declaration and subsequent initialization私有静态声明和后续初始化
【发布时间】:2012-07-10 15:34:03
【问题描述】:

一个 .cpp 文件有一堆类定义。一个类有一个私有静态成员,如下所示:

class SomeClass:public SomeParentClass
{
   private:
     static int count;
};

在类被定义之后,count属性初始化为零,如下所示:

int SomeClass::count = 0;

来自 Java/C# 世界,我无法理解 count 在什么时候初始化为零?是在SomeClass 被实例化的时候吗?还有,类定义有count类型为int,为什么SomeClass::count前面必须有int

我的最后一个问题是,既然 count 属性是私有的,当它在类定义之外初始化时,它的可见性不应该受到限制吗?

谢谢

【问题讨论】:

    标签: c++ types static initialization access-modifiers


    【解决方案1】:

    类静态变量的行为就像程序启动时初始化为 0 一样。它独立于类实例化。

    C++ 语言要求在声明中的标识符之前有一个类型。

    初始化类静态变量的 C++ 语法使其看起来像一个全局变量,但在编译期间强制访问该变量。

    【讨论】:

      【解决方案2】:
      是SomeClass被实例化的时候吗?

      不,您可以在任何实例化之前通过SomeClass::count 访问它(假设该函数有权访问SomeClass 的私​​有成员)。在您开始制作对象之前,它是完全可用的。


      为什么 SomeClass::count 前面必须有一个 int?

      好吧,因为它是int。想想你什么时候制作函数原型和定义:

      int func (int);
      int func (int i) {return 1;} //you still need the int and (int i) here
      func {return 1;} //NOT VALID - this is what count would be without int
      

      既然 count 属性是私有的,它的可见性不应该是
      在类定义之外初始化时受限?

      根据this answer,当以正常方式定义时,静态变量定义是访问说明符的例外。

      【讨论】:

        【解决方案3】:
        1. 类的静态成员在程序启动时初始化in arbitrary order
        2. 类中的static int count; 是静态变量的声明,而int SomeClass::count = 0; 是它的定义。 C++ 中的所有定义都需要指定类型。
        3. 计数的定义似乎发生在文件范围内,SomeClass::count 的实际范围仍然是私有的,正如声明的那样。

        【讨论】:

        • 顺序有时但并不总是任意的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多