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

2023-12-03C/C++开发问题
4

本文介绍了为什么需要在类之外定义静态数据成员?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

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

According to Static data members on the IBM C++ knowledge center:

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

The declaration of a static data member in the member list of a class is not a definition. You must define the static member outside of the class declaration, in namespace scope.

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

Why is that? What's the schematic behind that regarding the memory allocation?

推荐答案

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

It's a rule of the language, known as the One Definition Rule. Within a program, each static object (if it's used) must be defined once, and only once.

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

Class definitions typically go in header files, included in multiple translation units (i.e. from multiple source files). If the static object's declaration in the header were a definition, then you'd end up with multiple definitions, one in each unit that includes the header, which would break the rule. So instead, it's not a definition, and you must provide exactly one definition somewhere else.

原则上,该语言可以对内联函数执行它所做的事情,允许将多个定义合并为一个.但事实并非如此,所以我们坚持这条规则.

In principle, the language could do what it does with inline functions, allowing multiple definitions to be consolidated into a single one. But it doesn't, so we're stuck with this rule.

这篇关于为什么需要在类之外定义静态数据成员?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

无法访问 C++ std::set 中对象的非常量成员函数
Unable to access non-const member functions of objects in C++ std::set(无法访问 C++ std::set 中对象的非常量成员函数)...
2024-08-14 C/C++开发问题
17

从 lambda 构造 std::function 参数
Constructing std::function argument from lambda(从 lambda 构造 std::function 参数)...
2024-08-14 C/C++开发问题
25

STL BigInt 类实现
STL BigInt class implementation(STL BigInt 类实现)...
2024-08-14 C/C++开发问题
3

使用 std::atomic 和 std::condition_variable 同步不可靠
Sync is unreliable using std::atomic and std::condition_variable(使用 std::atomic 和 std::condition_variable 同步不可靠)...
2024-08-14 C/C++开发问题
17

在 STL 中将列表元素移动到末尾
Move list element to the end in STL(在 STL 中将列表元素移动到末尾)...
2024-08-14 C/C++开发问题
9

为什么禁止对存储在 STL 容器中的类重载 operator&()?
Why is overloading operatoramp;() prohibited for classes stored in STL containers?(为什么禁止对存储在 STL 容器中的类重载 operatoramp;()?)...
2024-08-14 C/C++开发问题
6