【问题标题】:Initialization of static class variable inside the main在 main 中初始化静态类变量
【发布时间】:2011-01-15 10:27:02
【问题描述】:

我在课堂上有一个静态变量。 我在全局范围内初始化它,它工作正常。

但是 当我尝试在主链接器中初始化时会引发错误。 为什么会这样。

class Myclass{

    static int iCount;
} ;

int main(){

  int Myclass::iCount=1;

}

在全局范围内为什么我必须指定变量类型 喜欢

int Myclass::iCount=1;

在我的课堂上,我将 iCount 定义为整数类型,为什么不呢。

   Myclass::iCount =1 ; in //Global scope

【问题讨论】:

  • @goreSplatter: Myclass::iCount 不公开,它会失败。
  • @goreSplatter:@peoro 说了什么,但即使它是公开的,那也不是 assignmentinitialisation
  • @peoro : 初始化私有静态数据成员不会失败!!其他访问,如 assignment,将失败。
  • @Nawaz:您没有阅读我正在回复的评论。建议在main 中添加Myclass::iCount=1;
  • @peoro:你说的是赋值还是初始化?

标签: c++ static initialization


【解决方案1】:

C++ 标准的 $9.4.2/7 部分说,

静态数据成员被初始化 并销毁完全像非本地 对象(3.6.2、3.6.3)。

注意短语“初始化”“完全像非本地对象”。希望这能解释为什么你不能这样做。

其实静态成员更像是通过Myclass::iCount访问的全局对象。因此,您必须在全局范围内(与定义类的范围相同)初始化它们,如下所示:

class Myclass{

    static int iCount;
} ;
int Myclass::iCount=1;

int main(){
  /*** use Myclass::iCount here ****/
}

类似话题:

How do static member variables affect object size?

【讨论】:

    【解决方案2】:

    因为 C++ 语法不允许这样做。您需要在某些函数的范围之外实例化您的静态变量。

    除了你忘记了类结束括号后的分号;

    【讨论】:

      【解决方案3】:

      这是正确的 C++。在函数之外,在 cpp 文件中。初始化在可执行文件的开始/启动时完成。 (甚至在调用 main() 之前);

      //main.h
      
      class Myclass{
      
          static int iCount;
      }; // and don't forget this ";" after a class declaration
      
      
      //main.cpp
      
      int Myclass::iCount=1;
      
      int main(){
      
      
      
      }
      

      【讨论】:

        【解决方案4】:

        来自 C++ 标准(第 8.5/10 节):

        An initializer for a static member is in the scope of the member’s class.

        Myclass 类具有全局作用域,您尝试在函数main 的较窄作用域内初始化其静态成员。

        【讨论】:

          【解决方案5】:

          静态初始化发生在之前 main 被运行时初始化调用。

          不允许将它放在函数中,因为这是声明 本地范围 对象的地方。允许这样做会令人困惑和模棱两可。

          【讨论】:

            猜你喜欢
            • 2011-06-28
            • 2017-05-13
            • 2011-08-22
            • 2010-12-22
            • 2018-12-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-11
            相关资源
            最近更新 更多