在 main 中初始化静态类变量

Posted

技术标签:

【中文标题】在 main 中初始化静态类变量【英文标题】:Initialization of static class variable inside the 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:你说的是赋值还是初始化? 【参考方案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 被运行时初始化调用。

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

【讨论】:

以上是关于在 main 中初始化静态类变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在Python中定义静态变量

类初始化和实例初始化

java中成员变量代码块构造函数运行顺序

java中成员或类变量自动初始化是啥意思

java中为啥要把main方法定义为一个static方法

Java面试细节:静态变量和静态块静态方法静态类的底层实现原理