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

根据IBM C ++知识中心的静态数据成员 :

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

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

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

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

原则上,语言可以做到内联函数的function,允许将多个定义合并为一个。 但它不,所以我们坚持这个规则。

这不关乎内存分配片。 这是关于在链接的编译单元中定义一个单一的点。 尼克也指出了这一点。

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

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