静态数据成员的定义

Definition of the static data member

本文关键字:定义 数据成员 静态      更新时间:2023-10-16

我正在阅读斯科特·迈耶斯(Scott Meyers)的C++,遇到了这个例子:

class GamePlayer{
private:
    static const int NumTurns = 5;
    int scores[NumTurns];
    // ...
};

你在上面看到的是NumTurns的声明,而不是定义。

为什么不定义?看起来我们用 5 初始化静态数据成员。

我只是不明白声明但不定义值为 5 的变量是什么意思。我们可以取变量的地址。

class A
{
public:
    void foo(){ const int * p = &a; }
private:
    static const int a = 1;
};
int main ()
{
    A a;
    a.foo();
}

演示

因为它不是一个定义。静态数据成员必须在类定义之外定义。

[类.静态.数据]/2

static数据成员在其类定义中的声明不是 定义,可能属于不符合 CV 标准的不完整类型 void .static数据成员的定义应出现在 包含成员的类定义的命名空间范围。

至于获取静态成员的地址而不实际定义它,它会编译,但它不应该链接。

您需要在源文件中放置NumTurns的定义,例如

const int GamePlayer::NumTurns;