我是 C++ 新手。
我有这样的课:
class CodeTest
{
private:
static const int TOTAL=100;
};
是声明还是定义?TOTAL
_
当我阅读 Scott Meyer 的书时,有人提到在实现文件中我们需要定义如下内容:
const int CodeTest::TOTAL;
为什么需要这个?
我是 C++ 新手。
我有这样的课:
class CodeTest
{
private:
static const int TOTAL=100;
};
是声明还是定义?TOTAL
_
当我阅读 Scott Meyer 的书时,有人提到在实现文件中我们需要定义如下内容:
const int CodeTest::TOTAL;
为什么需要这个?
头文件之外的实现文件中的声明是必需的,因为否则每个包含此头文件的翻译单元都将定义自己的对象(即,它自己的变量存储)。
这将违反单一定义规则。结果将是,例如,如果变量在一个翻译单元中发生更改,则该更改对于其他翻译单元将是不可见的。现在,这不是那么相关,因为变量是恒定的。然而,获取它的地址也会在不同的翻译单元中产生不同的指针。
由于这引起了一些争议,我查看了标准,@Nawaz 是对的,我错了。
9.4.2/2
如果
static
数据成员是 const 整数类型 [...]。如果在程序中使用该成员,则该成员仍应在名称空间范围内定义,并且名称空间范围定义不应包含初始值设定项。
所以你有一个声明,变量被初始化为一个值。在类之外,您必须定义变量,但不能为其赋值。
具有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:定义和声明之间有什么区别?