为什么我可以这样写:
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(编译器遵循声明顺序,不是吗?)。
但它需要static
。为什么呢?
答案 0 :(得分:16)
必须在编译时知道数组边界。尽管您的初始化是在代码中编写的,但它可以在运行时由构造函数覆盖。因此,您的非static
成员变量不是编译时常量。
答案 1 :(得分:1)
const
关键字表示只读,而不是常量,就像是程序特定部分的不可更改的承诺。如果你有一个指向const的指针,那么程序的其他部分可能会在你不看时改变它。
但保证static const
对于程序的其余部分保持不变。程序开始时分配对象的存储空间,程序结束时分配存储空间。只存在一个对象实例。在命名空间作用域(包括全局命名空间)声明的所有对象都有此存储持续时间。