我有一个与C ++中的静态类成员相关的问题。根据我对C ++的理解,静态类编号应该在创建类的实例之前存在。可以初始化const静态成员变量,但对于非const静态成员,我们无法在类中初始化它。因此,我的问题是我们应该在哪里初始化非const静态类。在我看来,非const静态类的唯一阶段是在主程序运行之前,如下面的代码所示:
using namespace std;
class C
{
public:
static int Value;
};
int C::Value = 2;
int main()
{
// int C::Value = 2; //ERROR!
cout<<C::Value<<endl;
return 0;
}
还有其他方法可以初始化吗?谢谢!
答案 0 :(得分:2)
C ++程序中的非本地对象可以静态和动态初始化。简单来说, static 初始化是具有常量表达式的简单C样式初始化,它基本上是在编译时执行的(因此,不生成代码)。同时动态初始化是初始化,涉及一些必须在运行时执行的非平凡操作。
您可以假设静态初始化对象在已初始化状态下开始生命。即从概念上讲,它们会在程序启动时立即初始化。
对于 dynamic 初始化时间和顺序,静态类成员的处理方式与任何其他命名空间范围对象相同。该语言不保证在main
之前初始化具有静态存储持续时间的所有对象。相反,该语言保证在第一次使用在同一翻译单元中定义的任何函数或对象之前的某个时间初始化此类静态对象。在同一翻译单元中定义的静态对象按其定义的顺序初始化。动态初始化的规则允许已经提到的“初始化顺序惨败”。
在您的示例中 - 将使用由整数常量表达式初始化的int
对象 - static 初始化。可以安全地假设这个int
对象在已经初始化的状态下开始生命。
答案 1 :(得分:1)
你几乎击中了头部。
是否在main
之前或之后写出定义并不重要。事实上,除了考虑the static initialisation order fiasco之外,只要声明(即类定义中的那一行)在哪里可见,你写它的地方并不重要您使用该成员,并且只要您在与类定义相同的范围内 。