为什么我在这里需要静态?
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
保证在程序的其余部分保持不变。对象的存储在程序开始时分配,在程序结束时释放。该对象仅存在一个实例。在命名空间范围(包括全局命名空间)声明的所有对象都具有此存储持续时间。
为什么我可以这样写:
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
保证在程序的其余部分保持不变。对象的存储在程序开始时分配,在程序结束时释放。该对象仅存在一个实例。在命名空间范围(包括全局命名空间)声明的所有对象都具有此存储持续时间。