根据IBM C++知识中心的静态数据成员:
类的成员列表中的静态数据成员的声明不是定义.您必须在命名空间范围内的类声明之外定义静态成员.
这是为什么?关于内存分配的原理是什么?
Mik*_*our 19
这是一种语言规则,称为一种定义规则.在程序中,每个静态对象(如果使用的话)必须定义一次,并且只能定义一次.
类定义通常位于头文件中,包含在多个转换单元中(即来自多个源文件).如果标题中的静态对象声明是一个定义,那么你最终会得到多个定义,每个单元中包含一个标题,这将违反规则.所以相反,它不是一个定义,你必须在其他地方提供一个定义.
原则上,语言可以完成内联函数的功能,允许将多个定义合并为一个定义.但事实并非如此,所以我们坚持这条规则.
这根本不是关于内存分配的.它是关于链接编译单元中的单点定义.@Nick也指出了这一点.
来自Bjarne的网站http://www.stroustrup.com/#in-class
类通常在头文件中声明,并且头文件通常包含在许多翻译单元中.但是,为避免复杂的链接器规则,C++要求每个对象都有唯一的定义.如果C++允许将需要作为对象存储在内存中的实体的类内定义,则该规则将被破坏.
从C++ 17开始,您现在可以在类中定义静态数据成员.见cppreference:
可以内联声明静态数据成员.可以在类定义中定义内联静态数据成员,并可以指定初始化程序.它不需要一个类外的定义:
Run Code Online (Sandbox Code Playgroud)struct X { inline static int n = 1; };
| 归档时间: |
|
| 查看次数: |
6899 次 |
| 最近记录: |