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

时间:2012-06-24 14:52:05

标签: c++ static-members

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

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

TOTAL声明还是定义

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

const int CodeTest::TOTAL;

为什么需要这样做?

4 个答案:

答案 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?