静态数据成员的定义 我正在读Scott Meyers的C++,遇到这个例子: class GamePlayer{ private: static const int NumTurns = 5; int scores[NumTurns]; // ... };

静态数据成员的定义 我正在读Scott Meyers的C++,遇到这个例子: class GamePlayer{ private: static const int NumTurns = 5; int scores[NumTurns]; // ... };,c++,static-members,C++,Static Members,您在上面看到的是NumTurns的声明,而不是定义 为什么没有一个定义?看起来我们用5初始化了静态数据成员 我只是不明白声明是什么意思,但是不定义一个值为5的变量。我们可以把变量的地址取细 class A { public: void foo(){ const int * p = &a; } private: static const int a = 1; }; int main () { A a; a.foo(); } 您需要在源文件中放置NumTu

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

为什么没有一个定义?看起来我们用5初始化了静态数据成员

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

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

int main ()
{
    A a;
    a.foo();
}

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

const int GamePlayer::NumTurns;

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

[class.static.data]/2

类定义中的
静态
数据成员的声明无效 定义,可能是不完整的类型,而不是cv限定类型
void
静态
数据成员的定义应出现在 包含成员的类定义的命名空间范围


至于在没有实际定义的情况下获取静态成员的地址,它将编译,但不应该链接。

那么我们通过编写
static const int NumTurns=5
做了什么?看起来我们只是用声明一个变量并用值5初始化它。@St.Antario Scott Meyers刚刚告诉您,您在类定义中声明了成员,但这并没有定义它,因为它是
静态的
。我认为OP将初始化与定义混为一谈。美国联邦法规。另外,
foo
的主体也在不断优化。尝试打印
a
的地址,您将遇到链接器错误。或者用
-O0
而不是
-O2
来编译您的示例,说明了一些非常有用的事情:您有声明、定义和初始化。