在 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 说了什么,但即使它是公开的,那也不是 assignment 和 initialisation
@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 中初始化静态类变量的主要内容,如果未能解决你的问题,请参考以下文章