13

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

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

声明还是定义TOTAL_

当我阅读 Scott Meyer 的书时,有人提到在实现文件中我们需要定义如下内容:

const int CodeTest::TOTAL;

为什么需要这个?

4

4 回答 4

11

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

这将违反单一定义规则。结果将是,例如,如果变量在一个翻译单元中发生更改,则该更改对于其他翻译单元将是不可见的。现在,这不是那么相关,因为变量是恒定的。然而,获取它的地址也会在不同的翻译单元中产生不同的指针。

于 2012-06-24T15:05:13.747 回答
4

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

9.4.2/2

如果static数据成员是 const 整数类型 [...]。如果在程序中使用该成员,则该成员仍应在名称空间范围内定义,并且名称空间范围定义不应包含初始值设定项。

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

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

要回答这个问题:

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

于 2012-06-24T15:11:00.400 回答
1

问题的第一部分:

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

TOTAL是一个标识符。

问题的第二部分

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

于 2012-06-24T15:07:17.830 回答
0
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:定义和声明之间有什么区别?

于 2017-12-12T11:07:35.860 回答