[英]Why should I initialize static class variables in C++?
在C和C ++中,所有静态变量默认初始化为ZERO。
这不是静态类数据成员的情况。 这是为什么?
#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声明:
必须在一个编译单元中显式定义静态数据成员。
来自C ++ FAQ http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12
这是回答你的问题,还是在你提到C ++标准之后?
您必须初始化静态类数据变量,因为您必须告诉编译器它们的值是什么。 类不需要具有默认值的概念。
变量类型具有逻辑“零值”,对于int
它为0,对于double
0.0,对于string
“”等。相反,类不一定具有默认值。 考虑一下,例如class Rectangle
。 它的零值是什么 - 零方块的矩形或单位边长的矩形? 对于静态变量,编译器会要求您自己定义静态变量必须具有的值,因为并非每种数据类型都可以通过默认值进行初始化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.