C 中的静态类成员

static class member in c++

本文关键字:成员 静态类      更新时间:2023-10-16

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

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

C 程序中的非本地对象可以初始化静态 dymandyally 。简而言之, static 初始化是微不足道的C风格初始化,其常数表达式基本上是在编译时执行的(因此,没有生成代码)。同时,动态初始化是初始化,涉及一些不平凡的动作,这些动作必须在运行时执行。

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

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

在您的示例中 - 将使用由积分常数表达式初始化的int对象 - static 初始化。可以肯定地假设此int对象以已经初始化的状态开始其寿命。

您几乎击中了头上的指甲。

是否在main之前或之后编写定义都没关系。实际上,除了考虑静态初始化顺序惨败之外,只要您在何处编写它,只要 neparation (即,班级定义中的该行)在哪里可以看到您使用成员,只要您在同一范围内与类定义相同的范围