在c ++中创build一个常量数组
有什么理由为什么codeblocks告诉我,我不能做一个数组? 我只是想做:
const unsigned int ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
这是给我的
错误:在'{'标记之前,不允许使用大括号初始化程序
我已经改变了初始化器的其他部分,但错误总是说同样的事情。 这似乎没有道理,因为这是我在c ++中学到的第一件事情之一。
你说你在一个class里做了这个,作为一个私人variables。
回想一下(现在),成员variables可能不会在声明它们的地方初始化 (有一些例外)。
struct T { std::string str = "lol"; };
不好。 它一定要是:
struct T { std::string str; T() : str("lol") {} };
但是,为了增加伤害,pre-C ++ 0x你不能初始化ctor-initializer
中的数组!
struct T { const unsigned int array[10]; T() : array({0,1,2,3,4,5,6,7,8,9}) {} // not possible :( };
而且,因为你的数组的元素是const
,所以你不能依赖赋值:
struct T { const unsigned int array[10]; T() { for (int i = 0; i < 10; i++) array[i] = i; // not possible :( } };
然而,正如一些其他的贡献者已经正确地指出,如果你不能修改它的元素,那么对每个T
实例拷贝一个数组似乎没有什么意义。 相反,你可以使用static
成员。
所以,下面最终将解决你的问题 – 可能 – 最好的方法:
struct T { static const unsigned int array[10]; }; const unsigned int T::array[10] = {0,1,2,3,4,5,6,7,8,9};
希望这可以帮助。
由于这是一个类中的私有成员variables(根据注释),这在C ++ 03中确实是不允许的。
部分被现代编译器支持的C ++ 0x允许编译以下代码:
class C { const unsigned int ARRAY[10]; public: C() : ARRAY{0,1,2,3,4,5,6,7,8,9} {} }; int main() { C obj; // contains a non-static const member: non-assignable }
但是,非静态const成员只有在类的不同实例中包含不同的值时才有意义。 如果每个实例都包含相同的{0,1,2,3,4,5,6,7,8,9}
,那么应该使其成为static
,这也使得在C ++ 98中可以做到这一点:
class C { static const unsigned int ARRAY[10]; public: C() {} }; const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9}; int main() { C obj; }