为什么要在C ++中初始化静态类变量?

时间:2011-11-25 10:40:29

标签: c++ static-members

在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;
}

3 个答案:

答案 0 :(得分:25)

在班级范围内,

int MyClass::classVar = 0;  // Why I have to init it here?

定义

static int classVar;

声明,即。承诺变量将在某处定义:您必须完全定义一次您声明的变量。

基本原理是类声明可能包含在多个源文件中。如果它的一部分是定义,它会发生多次:这是错误的(例外是内联[成员]函数)。

请注意,根据值初始化规则,您可以与

相处
int MyClass::classVar;  // Zero-initialized !

作为定义。

在命名空间范围内声明的变量也是定义(除非它们是extern限定的):

int var;

是一个声明和一个定义:如果你把它放在一个标题中并将它包含在多个翻译单元中,你会有一个错误(“多重定义的符号”,或者沿着那些行的东西)。

[请注意,在C ++中(而不是在C中),如果上面的varconst,则会自动static并且不会违反“一个定义”应将规则放入多重包含的标题中。这有点偏离主题,但随时可以询问详情]

答案 1 :(得分:6)

C ++ FAQ 10.12声明:

  

静态数据成员必须在一个编译单元中明确定义。

From C++ FAQ http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12

这是回答你的问题,还是在你引用C ++标准之后?

答案 2 :(得分:2)

您必须初始化静态类数据变量,因为您必须告诉编译器它们的值是什么。类不需要具有默认值的概念。

变量类型具有逻辑“零值”,对于int,它为0,对于double 0.0,对于string“”等。相反,类不一定具有默认值。例如,考虑class Rectangle。它的零值是什么 - 零方块的矩形或单位边长的矩形?对于静态变量,编译器会要求您自己定义静态变量必须具有的值,因为不是每个数据类型都可以通过默认值初始化。