C++ 为什么静态变量在类外用静态变量的重新声明来初始化?Can';我们不只是初始化它而不是重新声明它吗? #包括 使用名称空间std; 类框 { 公众: 静态int对象计数; } //初始化类框的静态成员 int-Box::objectCount=0;

C++ 为什么静态变量在类外用静态变量的重新声明来初始化?Can';我们不只是初始化它而不是重新声明它吗? #包括 使用名称空间std; 类框 { 公众: 静态int对象计数; } //初始化类框的静态成员 int-Box::objectCount=0;,c++,C++,您似乎混淆了变量的声明和定义 声明只告诉编译器一个名称。 因此,在你的情况下: #include <iostream> using namespace std; class Box { public: static int objectCount; } // Initialize static member of class Box int Box::objectCount = 0; 这只是告诉编译器有一个名为objectCount的变量 但现在你仍然需要一

您似乎混淆了变量的声明和定义

声明只告诉编译器一个名称。 因此,在你的情况下:

#include <iostream>

using namespace std;

class Box
{
   public:
      static int objectCount;
}

// Initialize static member of class Box
int Box::objectCount = 0;
这只是告诉编译器有一个名为
objectCount
的变量
但现在你仍然需要一个定义

class Box
{
    public:
        static int objectCount;
};
简化了链接器需要的定义。

因此,作为一个简单的规则,静态成员变量必须在类中声明,然后在类外部定义

原始类型,如<代码> int >代码>,实际上可以在声明<代码>静态< /COD>类成员的位置初始化。这是早期C++标准中的一个遗漏,它已被固定在标准的后版本中。为了应对前面的注释,GCC拒绝在类初始化中使用“错误:ISO C++禁止在非静态静态成员的类初始化”,CLAN与“错误:非constatic static数据成员必须离线进行初始化”。两者都不考虑
-std=*
选项。哪个标准应该允许这样做?
int Box::objectCount = 0;