C++ 为什么我需要静电?

C++ 为什么我需要静电?,c++,static,constants,init,C++,Static,Constants,Init,为什么我可以写这个: class VoiceManager { public: static const int mMaxNumOfVoices = 16; Voice mVoices[mMaxNumOfVoices]; private: }; 但我不能用这个: class VoiceManager { public: const int mMaxNumOfVoices = 16; Voice mVoices[mMaxNumOfVoices]; privat

为什么我可以写这个:

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
init之前是init(编译器遵循声明顺序,否?)


但它需要
静态
。为什么?

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

const关键字表示只读,而不是常量,就像是程序特定部分的不可更改承诺。如果您有一个指向const的指针,那么程序的其他部分可能会在您不查看时更改该值


但是可以保证
静态常量在程序的其余部分保持不变。对象的存储在程序开始时分配,在程序结束时解除分配。该对象只存在一个实例。在名称空间作用域(包括全局名称空间)中声明的所有对象都具有此存储持续时间。

请输入上下文和错误消息。可能是因为它在运行时之前不知道
mMaxNumOfVoices
将是什么?使用
static
会强制知道这个值。我认为只有
const
不会使它成为编译时常量,而
static const
不理解向下的投票。关于
const
语义的微妙之处,这是一个很好的问题。@StoryTeller我刚刚对这个问题投了赞成票。有时,快速的否决投票令人沮丧。我理解它为什么会出现,但有时会令人沮丧。”它可以在运行时被构造函数覆盖“嗯,不!这是一个常数。它不能被覆盖(或者至少不应该被覆盖)。@paizza-。非静态成员变量始终可以在构造函数中设置其值,即使它提供了默认初始值设定项。@paizza:初始值设定项可以被重写,正如StoryTeller所演示的。我不知道如果“init”作为CTOR/成员初始值设定项列表,我可以重新初始化常量。这就是为什么!很高兴知道。谢谢。@paizza对于非静态成员,仅当该成员没有ctor初始值设定项时才使用类内初始值设定项。在这种情况下,它相当于提供与ctor初始值设定项相同的值。使用
const
还可以保证变量在其生命周期内保持不变;指针指向常量的情况不适用于此代码。而且,如果不使用odr,静态常量可能根本没有存储空间;但任何有存储的静态变量,其初始化可能会延迟到首次使用,并且可能不是常量表达式。这段代码(不在类中)表明您的解释不正确:
static const int x=foo();int y[x]-错误