C++ 在类外定义静态变量时,为什么需要再次指定数据类型

C++ 在类外定义静态变量时,为什么需要再次指定数据类型,c++,oop,static,C++,Oop,Static,我一直在解决黑客的问题。我遇到了一个虚拟函数问题,我被要求创建一个名为Student的类。此类必须有一个名为cur\u id(当前id)的int变量。这是课堂 class Student: public Person{ public: static int id; Student(){ cur_id = ++id; } }; int Student::id = 0; 我被要求在创建类的每个新对象时增加cur_id+1。因此,我决定增加

我一直在解决黑客的问题。我遇到了一个虚拟函数问题,我被要求创建一个名为Student的类。此类必须有一个名为cur\u id(当前id)的int变量。这是课堂

class Student: public Person{

    public:

    static int id;

    Student(){
        cur_id = ++id;
    }


};

int Student::id = 0;

我被要求在创建类的每个新对象时增加cur_id+1。因此,我决定增加构造函数中的
cur\u id
。如您所见,我已将类中的
static int
变量声明为
static int id
。然后我想用类外的零来初始化它的值。但是当我试着用
Student::id=0
,我无法访问
id
变量。我需要再次指定它的数据类型,就像我再次将变量声明为
int Student::id=0。原因是什么,为什么我需要两次声明一个静态变量?我知道这是一个新手问题,可能有一个简单的答案,但我无法在其他主题中找到我的答案。提前感谢。

第二次您不申报。你定义它。这就是为什么这通常是在实现文件(.cpp)中完成的,而类声明是在头文件(.h)中完成的。

这似乎是相关的。您还应该澄清您询问的是什么类型的“为什么”。是关于基本原理,还是关于指出需要它的语言规范的特定部分?@StoryTeller,我想学习需要它的语言规范化。为什么我们要申报两次呢?@OzanYurtsever这是另一个问题。要么你的问题改进它,要么问另一个问题。@OzanYurtsever,看看这里的好答案。细微的挑剔:每个定义都是一个声明;)
::Student::id
id声明了两次,定义了一次。但是为什么我们在第二次定义int类型时再次指定它呢?@OzanYurtsever如果您在头文件中声明一个“普通”全局变量(例如
extern int i;
),那么您需要它在单个编译单元中定义此变量(通常在单个源文件中,例如,
inti=0;
)。声明和定义都需要写入变量的类型。@OzanYurtsever这不是真的。您不能在函数体外部写入
var=5;
。在函数体内部,这不是初始化,而是赋值。@OzanYurtsever我看不到任何区别。请告诉我们您的意思。编辑您的问题以提供示例代码。头文件和源文件。静态成员变量和“正常”变量。