在main中初始化静态类变量

时间:2011-01-15 10:27:03

标签: c++ static initialization

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

但是 当我尝试在主链接器中初始化时抛出错误。 为什么会如此。

class Myclass{

    static int iCount;
} ;

int main(){

  int Myclass::iCount=1;

}

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

int Myclass::iCount=1;

在我的班级中,我将iCount定义为整数类型,为什么不呢。

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

5 个答案:

答案 0 :(得分:5)

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?

答案 1 :(得分:3)

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

除了你在课程结束括号后忘记了分号;

答案 2 :(得分: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(){



}

答案 3 :(得分:2)

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

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

Myclass具有全局范围,并且您尝试在函数main的较窄范围内初始化其静态成员。

答案 4 :(得分:1)

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

不允许将其放在函数中,因为这是声明本地作用域对象的位置。允许这样做会让人感到困惑和模棱两可。