为什么_have_初始化C++静态成员变量?

Lee*_*ton 9 c++ static static-members

我知道你通常在.cpp文件中初始化一个静态成员变量.但我的问题是:为什么你什么?

这是一个例子:

#include <vector>

using namespace std;

class A {
    public:
        static vector<int> x;
};

main() {
    int sz = A::x.size();
}
Run Code Online (Sandbox Code Playgroud)

这给出了编译器错误: undefined reference to 'A::x'

但是,这个:

#include <vector>

using namespace std;

class A {
    public:
        static vector<int> x;
};

// Initialize static member
vector<int> A::x;

main() {
    int sz = A::x.size();
}
Run Code Online (Sandbox Code Playgroud)

编译并运行良好.

我能理解我是否使用默认构造函数之外的其他东西来初始化向量,但我不是.我只想创建一个大小为0的向量.当然,任何静态成员都必须在程序初始化时分配内存,那么编译器为什么不使用默认构造函数呢?

Kla*_*aim 16

不是关于初始化,而是关于定义.或者更确切地说:它是关于知道哪个编译单元(.cpp)将保存对象(必须唯一定义的某个地方)

所以,需要的是简单地将定义放在某个地方,在一个独特的地方,即cpp,让编译器知道当调用类的静态对象时,它在那里定义,而不是在其他地方定义.(如果您尝试在标题中定义静态,则每个包含此标题的cpp将具有定义,无法知道应在何处定义 - 并且如果您需要使用它,则手动初始化).

  • +1但你应该删除其中一个副本.对于对象,RAII进行初始化(即使只是默认构造函数)定义的结果.这适用于原始指针,内置类型如`int`吗? (2认同)

Mar*_*ork 9

您正在从单个编译单元的角度来看它.

但是语言必须假设可能存在多个编译单元.那么现在哪个编译单元是创建的静态对象?基本上,编译器不允许做出该决定,工程师必须做出决定.