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

hen*_*yao 16 c++ static

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

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

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

Mik*_*our 19

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

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

原则上,语言可以完成内联函数的功能,允许将多个定义合并为一个定义.但事实并非如此,所以我们坚持这条规则.

  • 为了完整性,可能需要提及内联静态和 constexpr 静态成员 (2认同)

UpA*_*dam 7

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

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

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


use*_*462 6

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

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

struct X {
     inline static int n = 1; 
};
Run Code Online (Sandbox Code Playgroud)