我是C ++的新手 我有一个这样的课:
class CodeTest
{
private:
static const int TOTAL=100;
};
TOTAL
是声明还是定义?
当我阅读Scott Meyer的书时,有人提到在实现文件中我们需要定义类似的东西:
const int CodeTest::TOTAL;
为什么需要这样做?
答案 0 :(得分:10)
标题之外的实现文件中的声明是必需的,否则包含此标题的每个翻译单元都将定义自己的对象(即,它自己的变量存储)。
这会违反One Definition Rule。结果将是例如如果变量在一个翻译单元中更改,则此更改对其他翻译单元不可见。现在,由于变量是常数,因此不相关。但是,获取其地址也会在不同的翻译单元中产生不同的指针。
答案 1 :(得分:4)
由于这激起了一些争议,我看了标准,@ Nawaz是对的,我错了。
<强> 9.4.2 / 2 强>
如果
static
数据成员是const整数类型[...]。会员 仍然应在命名空间作用域中定义,如果它在 程序和命名空间范围定义不应包含 初始化程序。
那么你所拥有的是一个声明,并将变量初始化为一个值。在课堂之外,必须定义变量,但不为其赋值。
const
整数类型的部分仅适用于此特定情况 - 即您可以在类中初始化所述类型,但所有static
数据成员必须在外面定义。
无论在课堂外是否需要定义(取决于你是否使用成员),班级内部的任何内容(已初始化或未初始化)是只是声明。
答案 2 :(得分:1)
问题的第一部分:
这一行:static const int TOTAL=100;
是一个声明,然后是初始化。
TOTAL
是一个标识符。
问题的第二部分
const int CodeTest::TOTAL
是初始化变量所必需的。
答案 3 :(得分: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: What is the difference between a definition and a declaration?