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

Muh*_*edy 15 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;
}
Run Code Online (Sandbox Code Playgroud)

Ale*_* C. 26

在课堂范围内,

int MyClass::classVar = 0;  // Why I have to init it here?
Run Code Online (Sandbox Code Playgroud)

是一个定义

static int classVar;
Run Code Online (Sandbox Code Playgroud)

宣言,即.保证变量将在某处定义:您必须准确定义一次您声明的变量.

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

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

int MyClass::classVar;  // Zero-initialized !
Run Code Online (Sandbox Code Playgroud)

作为一个定义.

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

int var;
Run Code Online (Sandbox Code Playgroud)

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

[请注意,在C++中(而不是在C中),如果varconst,则它会自动变为static并且如果将其放入包含多个的标头中,则不会违反单定义规则.这有点偏离主题,但随意询问细节]

  • 我不确定这是什么问题.我读到这个"我为什么要把`= 0;`放在那里?" (3认同)
  • 那么,如果你只需要零初始化,`int MyClass :: classVar;`应该已经足够了?从来没有尝试过,但根据Std和删除的答案,它确实如此. (3认同)

Tal*_*lin 6

C++ FAQ 10.12声明:

必须在一个编译单元中显式定义静态数据成员.

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

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