为什么要在C++中初始化静态类变量?
在C和C++中,所有静态变量默认初始化为零。为什么要在C++中初始化静态类变量?
这不是静态类数据成员的情况。这是为什么?
#include <iostream>
using namespace std;
int var;
class MyClass
{
public:
static int classVar;
};
int MyClass::classVar = 0; // Why I have to init it here?
int main(void)
{
cout << ::var << endl; // this is initalized to ZERO by default
static int var;
cout << var << endl; // and this also is initalized to Zero
cout << MyClass::classVar << endl;
return 0;
}
类范围,
int MyClass::classVar = 0; // Why I have to init it here?
是定义和
static int classVar;
是声明,即。承诺该变量将被定义为某处:您必须定义恰好一次您声明的变量。
基本原理是类声明可能会包含在多个源文件中。它的一部分是一个定义,它会发生倍增:这是错误的(例外是内联[成员]函数)。
注意的是,根据值初始化规则,你可以用
int MyClass::classVar; // Zero-initialized !
的定义相处。
在命名空间内声明的变量定义太(除非他们是extern
合格):
int var;
是一个声明,以及一个定义:如果你把它放到头并将其包含在多个翻译单位,你有一个错误(“乘法定义的符号”,或沿着这些线)。
[注意,在C++(而不是在C)中,如果上述var
是const
,它自动成为static
并且没有扰定义规则违反应该它被放入一个乘法包含的头。这又稍微偏离主题,但随时问细节]认为
C++ FAQ 10.12状态:
静态数据成员必须在一个编辑单元中被明确定义。
From C++ FAQ http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12
是否回答你的问题还是你的C++标准本身的引用之后?
您必须初始化您的静态类数据变量,因为您必须告诉编译器它们的值是什么。类不需要具有默认值的概念。
变量类型具有逻辑“零值”,对于int
它是0,对于double
0.0,对于string
“”等。相反,类不一定具有默认值。考虑一下,例如class Rectangle
。它的零点值是多少? - 一个长方形的零方形或长方形的单位边长?对于静态变量,编译器会要求您自己定义静态变量必须具有的值,因为不是每个数据类型都可以通过默认值进行初始化。
您不确定** var **是否已初始化为0.可能,有时很可能,但不确定。 –
@AlessandroPezzato:实际上,在执行动态初始化之前,标准显式地为所有全局变量清零内存......除了受字面值影响的内置函数,我认为可以直接影响(在因为它是不可观测的。 –