在c ++中创建一个常量数组

时间:2011-05-17 20:07:03

标签: c++ arrays codeblocks

有没有理由为什么代码块告诉我我不能制作一个数组?我只是想做:

const unsigned int ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};

它正在给我

  

错误:在'{'标记

之前,不允许使用括号括起的初始值设定项

我已经更改了初始化程序的其他部分,但错误总是说同样的事情。这似乎没有意义,因为这是我在c ++中学到的第一件事。

2 个答案:

答案 0 :(得分:57)

你说你是在一个班级内做的,作为私人变量。

回想一下(目前),成员变量可能不会在您声明它们的同一个地方初始化(除了少数例外)。

struct T {
   std::string str = "lol";
};

不行。它必须是:

struct T {
   std::string str;
   T() : str("lol") {}
};

但是,为了增加对伤害的侮辱,在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};

希望这有帮助。

答案 1 :(得分:7)

由于这是类中的私有成员变量(根据注释),因此在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;
}