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

hot*_*ang 37 c++ arrays codeblocks

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

const unsigned int ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
Run Code Online (Sandbox Code Playgroud)

它给了我

错误:在'{'标记之前,不允许使用括号括起的初始值设定项

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

Lig*_*ica 57

你说你在一个类中做了这个,作为一个私有变量.

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

struct T {
   std::string str = "lol";
};
Run Code Online (Sandbox Code Playgroud)

不行.它一定要是:

struct T {
   std::string str;
   T() : str("lol") {}
};
Run Code Online (Sandbox Code Playgroud)

但是,为了增加对伤害的侮辱,在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 :(
};
Run Code Online (Sandbox Code Playgroud)

而且,因为你的数组的元素是const,你不能依赖于赋值:

struct T {
   const unsigned int array[10];
   T() {
       for (int i = 0; i < 10; i++)
          array[i] = i; // not possible :(
   }
};
Run Code Online (Sandbox Code Playgroud)

但是,正如其他一些贡献者已经非常正确地指出的那样,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};
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 很好的答案!很好,你解释了所有的场景.为此+1.:) (2认同)

Cub*_*bbi 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 
}
Run Code Online (Sandbox Code Playgroud)

但是,非静态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;
}
Run Code Online (Sandbox Code Playgroud)