C++ 为什么您必须初始化C++;静态成员变量?

C++ 为什么您必须初始化C++;静态成员变量?,c++,static,static-members,C++,Static,Static Members,我知道您通常从.cpp文件中初始化静态成员变量。但我的问题是:你为什么要这样做 下面是一个例子: 编译并运行良好 我可以理解我是不是在用默认构造函数以外的东西初始化向量,但我不是。我只想创建一个大小为0的向量。当然,任何静态成员都必须在程序初始化时分配内存,那么为什么编译器不使用默认构造函数呢?您称之为初始化的是定义。您需要在某个地方定义静态成员。类中的部分只是一个声明 这主要是因为在头中有一个定义会导致巨大的问题(因为你不能在不产生多个定义的情况下将该头包含到多个翻译单元中)。你是从单个编

我知道您通常从.cpp文件中初始化静态成员变量。但我的问题是:你为什么要这样做

下面是一个例子:

编译并运行良好


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

您称之为初始化的是定义。您需要在某个地方定义静态成员。类中的部分只是一个声明


这主要是因为在头中有一个定义会导致巨大的问题(因为你不能在不产生多个定义的情况下将该头包含到多个翻译单元中)。

你是从单个编译单元的角度来看它的


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

对“A::x”的未定义引用
不是编译器错误;这是一个链接器错误。这意味着在链接在一起以形成程序的任何翻译单元中都找不到
a::x
的定义。静态成员变量具有外部链接,必须在一个转换单元中定义。任何带有外部链接的东西都不会有编译器生成的定义,除非您编写一个。

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

因此,只需将定义放在某个地方,在一个唯一的地方,即cpp,让编译器知道当调用类的静态对象时,它是在那里定义的,而不是在其他地方。(如果您试图在标题中定义static,则包含此标题的每个cpp都将有一个定义,这使得您无法知道应该在哪里定义它-如果您需要使用它,则手动初始化)
.

+1但您应该删除其中一个DUP。对于对象,RAII使初始化(即使只是默认构造函数)成为定义的结果。这是否适用于原始指针、内置类型,如
int
?我的意思是,如果需要,可以在那里添加初始化。我将添加精度。@史提夫POD类型构造函数只是语法的,所以是的,它确实有效,但是它实际上没有做任何事情(或者更精确地说,它是不允许的——通过C++标准)。谢谢,现在有很多意义。我想我被认为头文件中的声明足以保留内存的想法所困扰。但当然不能,因为头文件包含在许多对象文件中。您必须通过在一个.cpp文件中给出静态定义来明确说明哪个对象文件将分配内存,这是有道理的。当来自其他语言时,这可能仍然很奇怪,因为原因与旧的文件编译单元系统有关。不确定它是否会在未来十年内保留。对于C++15-16或更高版本的基于模块的系统,人们似乎很感兴趣。
#include <vector>

using namespace std;

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

main() {
    int sz = A::x.size();
}
#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();
}