【问题标题】:static class member in c++C++中的静态类成员
【发布时间】:2012-10-29 17:41:24
【问题描述】:

我有一个与 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;
    }

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

【问题讨论】:

  • using namespace std: 带冒号?这是实际代码吗?
  • 这些根本不是重复的。问题甚至不一样。

标签: c++


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    你几乎一针见血。

    main 之前或之后写定义都没有关系。事实上,除了考虑the static initialisation order fiasco 之外,你在哪里写它并不重要,只要声明(即类定义中的那一行)在你使用的地方是可见的成员,并且只要您在与类定义相同的范围内进行

    【讨论】:

    • 感谢 cmets,但为什么 **// int C::Value = 2; //错误! main() 函数中的**会失败?
    • @feelfree:嗯,你不能在函数内部定义它。因为那样它将是main()::C::Value,而不是C::Value
    • 你不能在函数内声明静态类范围的变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多