0

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

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

4 回答 4

4

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

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

9.4.2 静态数据成员

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

于 2014-07-10T17:09:03.967 回答
2

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

data_member Y::m;

这是你会看到它被调用的默认 ctor 的地方。

于 2014-07-10T17:07:30.220 回答
2
struct Y
{
    static data_member m;
    Y(){ cout << "Y\n"; }
    ~Y(){ cout << "~Y\n"; }
};

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

data_member Y::m;

这定义了 m并将导致构造函数调用

于 2014-07-10T17:08:16.677 回答
0

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

Type CLASS::member;

顺便说一句,使用静态成员是非常糟糕的做法。

改用静态函数:

class Foo{
public:
     Type &getMember(){
         static Type member;
         return member;
     }
};
于 2014-07-11T09:05:03.763 回答