类声明或定义中的静态变量

static variable in the class declaration or definition?

本文关键字:静态 变量 定义 声明      更新时间:2023-10-16

我是C++新手。
我有这样的课程:

class CodeTest
{
private:
    static const int TOTAL=100;
};

TOTAL宣言还是定义

当我阅读 Scott Meyer 的书时,有人提到在实现文件中我们需要定义类似的东西:

const int CodeTest::TOTAL;

为什么需要这样做?

标头之外的实现文件中的声明是必需的,否则包含此标头的每个翻译单元都将定义自己的对象(即,它自己的变量存储)。

这将违反一个定义规则。例如,如果变量在一个翻译单元中更改,则此更改对其他翻译单元不可见。现在,这无关紧要,因为变量是常量。但是,获取其地址也会在不同的翻译单元中产生不同的指针。

由于这引起了一些争议,我查看了标准,@Nawaz是对的,我错了。

9.4.2/2

如果static数据成员是常量整数类型 [...]。该成员 如果在命名空间范围内使用,则仍应在命名空间范围内定义 程序和命名空间范围定义不应包含 初始 化。

所以你有一个声明,变量被初始化为一个值。在类之外,必须定义变量,但不能为其赋值。

具有整型const部分仅适用于此特定情况 - 即您可以在类内部初始化所述类型,但必须在外部定义所有static数据成员。

要回答这个问题:

无论类外部是否需要定义(取决于是否使用成员),类内的任何内容(初始化与否)都只是一个声明

问题的第一部分:

此行:static const int TOTAL=100;是一个声明,后跟初始化。

TOTAL是一个标识符。

问题的第二部分

初始化变量需要const int CodeTest::TOTAL

static const int TOTAL=100; // is a declaration followed by an initialisation.

从C++标准第 3.1 节:

声明

将名称引入翻译单元或重新声明先前声明引入的名称。声明指定这些名称的解释和属性。

下一段指出,声明是一个定义,除非......它在类定义中声明一个静态成员:

struct X
{
    int a;         // defines a
    static int b;  // declares b
};

您可以在此处阅读有关定义和声明的更多信息: SO:定义和声明有什么区别?