代码之家  ›  专栏  ›  技术社区  ›  user2953119

初始化静态数据成员

  •  0
  • user2953119  · 技术社区  · 11 年前

    为什么不发生静态数据成员的默认初始化?在以下示例中

    struct data_member
    {
        data_member(){ cout << "data_member\n"; }
        ~data_member(){ cout << "~data_member\n"; }
    };
    
    struct Y
    {
        static data_member m;
        Y(){ cout << "Y\n"; }
        ~Y(){ cout << "~Y\n"; }
    };
    
    Y y; //call constructor of Y 
    

    但如果我们删除 static 说明符来自 data_member m 它将被默认初始化。

    struct data_member
    {
        data_member(){ cout << "data_member\n"; }
        ~data_member(){ cout << "~data_member\n"; }
    };
    
    struct Y
    {
        data_member m;
        Y(){ cout << "Y\n"; }
        ~Y(){ cout << "~Y\n"; }
    };
    
    Y y; //call Y() and data_member()
    
    4 回复  |  直到 11 年前
        1
  •  4
  •   Community Mohan Dere    5 年前

    静态成员必须在类定义之外定义。它将在那时初始化(也可以默认初始化)。

    标准草案中关于 static 成员变量应该解释为什么它没有在类声明中默认初始化。

    9.4.2静态数据成员

    2声明 静止的 其类定义中的数据成员不是定义,可能是不完整的类型,而不是cv限定的类型 void 静止的 数据成员应出现在包含成员类定义的命名空间范围中。在命名空间范围的定义中 静止的 数据成员应使用::运算符通过其类名进行限定。

        2
  •  2
  •   T.C. Yksisarvinen    11 年前
    struct Y
    {
        static data_member m;
        Y(){ cout << "Y\n"; }
        ~Y(){ cout << "~Y\n"; }
    };
    

    仅此 声明 m 就编译器所知, Y::m 在另一翻译单元中定义。由于静态数据成员是每个类一个,因此必须能够在不定义它们的情况下声明它们,否则在将头包含在不同的转换单元中时,将无法在不违反“一个定义规则”的情况下将类定义放在头文件中。

    data_member Y::m;
    

    这定义了m和 will cause a constructor call .

        3
  •  2
  •   Paul Evans    11 年前

    static 数据成员是 宣布 class 释义他们需要 定义 (一次)在那之外,通常在相应的 cpp 文件:

    data_member Y::m;
    

    在这里,您将看到默认的ctor被调用。

        4
  •  0
  •   Yaje    11 年前

    基本答案: 对于类成员,就像函数一样。 我们有声明和定义。 您在class级别“声明”它们的存在,并且“定义”由构造函数生成。 静态成员更复杂。它们不是“实例相关”的,构造函数不会“定义”它们。你必须在课外自己动手:

    Type CLASS::member;
    

    顺便说一句,使用静态成员是一种很好的做法。

    改用静态函数:

    class Foo{
    public:
         Type &getMember(){
             static Type member;
             return member;
         }
    };
    
    推荐文章