静态数据成员的初始化

时间:2014-07-10 17:01:20

标签: c++ storage-duration

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

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 个答案:

答案 0 :(得分:3)

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

标准草案中关于static成员变量的以下描述应该解释为什么它不是在类声明中默认初始化。

  

9.4.2静态数据成员

     

2 static数据成员在其类定义中的声明不是定义,除了cv-qualified void之外,可能是不完整的类型。 static数据成员的定义应出现在包含成员类定义的命名空间范围内。在命名空间作用域的定义中,static数据成员的名称应使用::运算符通过其类名限定。

答案 1 :(得分:2)

static数据成员在class定义中声明。它们需要在其外部定义(一次),通常在相应的cpp文件中:

data_member Y::m;

这是您可以看到它的默认ctor。

答案 2 :(得分:2)

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 :(得分:0)

基本答案: 对于班级成员,它与功能一样。 我们有声明和定义。 你&#34;声明&#34;他们的存在是@class级别和&#34;定义&#34;由构造函数构成。 使用静态成员会更复杂。他们不是&#34;实例相关&#34;并且构造函数不会定义&#34;他们。你必须由你自己的课外做:

Type CLASS::member;

顺便说一下使用静态成员的做法。

改为使用静态功能:

class Foo{
public:
     Type &getMember(){
         static Type member;
         return member;
     }
};