为什么需要在类之外定义静态数据成员?

时间:2013-09-11 18:53:55

标签: c++ static

根据IBM C ++知识中心的Static data members

  

类的成员列表中的静态数据成员的声明不是定义。您必须在名称空间范围内的类声明之外定义静态成员。

为什么?关于内存分配的原理是什么?

3 个答案:

答案 0 :(得分:17)

这是一种语言规则,称为一个定义规则。在程序中,每个静态对象(如果使用的话)必须定义一次,并且只能定义一次。

类定义通常包含在头文件中,包含在多个翻译单元中(即来自多个源文件)。如果标题中的静态对象声明是一个定义,那么你最终会得到多个定义,每个单元中包含一个标题,这将违反规则。相反,它不是一个定义,你必须在其他地方提供一个定义。

原则上,语言可以执行内联函数的功能,允许将多个定义合并为一个定义。但它没有,所以我们坚持这条规则。

答案 1 :(得分:7)

根本不是内存分配部分。它是关于链接编译单元中的单点定义。 @Nick也指出了这一点。

来自Bjarne的网站http://www.stroustrup.com/#in-class

  

类通常在头文件中声明,头文件是   通常包含在许多翻译单元中。但是,要避免   复杂的链接器规则,C ++要求每个对象都有唯一的   定义。如果C ++允许在课堂上,则该规则将被破坏   需要作为对象存储在内存中的实体的定义。

答案 2 :(得分:6)

从C ++ 17开始,您现在可以在类中定义静态数据成员。见cppreference

  

可以内联声明静态数据成员。内联静态数据   成员可以在类定义中定义,也可以指定   初始化。它不需要一个类外定义:

struct X {
     inline static int n = 1; 
};