0

我有一个与 C++ 中的静态类成员有关的问题。根据我对 C++ 的理解,静态类号应该在创建类的实例之前就存在。可以初始化 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;
    }

还有其他方法来初始化它吗?谢谢!

4

2 回答 2

2

C++程序中的非局部对象可以静态初始化,也可以动态初始化。简单来说,静态初始化是简单的 C 风格初始化,带有常量表达式,基本上在编译时执行(因此不生成代码)。同时,动态初始化是涉及一些必须在运行时执行的重要动作的初始化。

您可以假设静态初始化的对象在已经初始化的状态下开始它们的生命。即从概念上讲,它们会在您的程序启动时立即初始化。

当涉及到动态初始化时间和顺序时,静态类成员的处理方式与任何其他命名空间范围对象相同。该语言不保证所有具有静态存储持续时间的对象都在之前初始化main。相反,该语言保证此类静态对象在首次使用同一翻译单元中定义的任何函数或对象之前的某个时间进行初始化。在同一个翻译单元中定义的静态对象按照它们的定义顺序进行初始化。动态初始化的规则允许已经提到的“初始化顺序失败”。

在您的示例中 - 一个int由整数常量表达式初始化的对象 -将使用静态初始化。可以安全地假设这个int对象在已经初始化的状态下开始它的生命。

于 2012-10-29T23:26:47.400 回答
1

你几乎一针见血。

定义是 before 还是 after 都没有关系main。事实上,除了考虑静态初始化顺序惨败之外,你在哪里写它并不重要,只要声明(即类定义中的那一行)在你使用成员的地方是可见的,并且作为只要您在与类定义相同的范围内执行此操作。

于 2012-10-29T17:44:16.720 回答