为什么不发生静态数据成员的默认初始化?在以下示例中
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()
答案 0 :(得分:3)
必须在类定义之外定义静态成员。它将在那时被初始化(也可以默认初始化)。
标准草案中关于static
成员变量的以下描述应该解释为什么它不是在类声明中默认初始化。
9.4.2静态数据成员
2
static
数据成员在其类定义中的声明不是定义,除了cv-qualifiedvoid
之外,可能是不完整的类型。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;
答案 3 :(得分:0)
基本答案: 对于班级成员,它与功能一样。 我们有声明和定义。 你&#34;声明&#34;他们的存在是@class级别和&#34;定义&#34;由构造函数构成。 使用静态成员会更复杂。他们不是&#34;实例相关&#34;并且构造函数不会定义&#34;他们。你必须由你自己的课外做:
Type CLASS::member;
顺便说一下使用静态成员的做法。
改为使用静态功能:
class Foo{
public:
Type &getMember(){
static Type member;
return member;
}
};