为什么我在这里需要静态?

Why do I need static here?

为什么我可以这样写:

class VoiceManager
{
public:
    static const int mMaxNumOfVoices = 16;
    Voice mVoices[mMaxNumOfVoices];

private:
};

但是我不能用这个:

class VoiceManager
{
public:
    const int mMaxNumOfVoices = 16;
    Voice mVoices[mMaxNumOfVoices];

private:
};

它说:“非静态成员引用必须相对于特定对象

但在这两种情况下,mMaxNumOfVoices 是一个 const 并且将在 mVoices 初始化之前进行初始化(编译器遵循声明顺序,不是吗?)。

但它需要 static。为什么?

数组边界必须在 compile-time 处已知。尽管您的初始化是在代码中编写的,但它可以在运行时被构造函数覆盖。因此,您的非 static 成员变量不是 compile-time 常量。

const关键字的意思是read-only,不是常数,就像是对程序特定部分的not-be-changed承诺。如果您有一个 pointer-to-const,那么程序的其他部分可能会在您不注意时更改该值。

但是static const保证在程序的其余部分保持不变。对象的存储在程序开始时分配,在程序结束时释放。该对象仅存在一个实例。在命名空间范围(包括全局命名空间)声明的所有对象都具有此存储持续时间。