我有一个与C ++数组和结构相关的问题。我有一个结构:
struct npc_next_best_spot{
npc_next_best_spot(): x({0}),
y({0}),
value(-1),
k(0),
i({0}),
triple_ress({0}),
triple_number({0}),
bigI(0)
{}
int x[3];
int y[3];
double value;
int k;
int i[3];
int triple_ress[3];
int triple_number[3];
int bigI;
};
但这会发出警告
"非类类型的list-initializer不能带括号"。
那么如何确保这些数组的初始值为0
所有值?
答案 0 :(得分:7)
你可以按照错误的建议去做。您可以为数组使用大括号初始值设定项,例如
npc_next_best_spot() : x{}, y{}, value(-1), k(0), i{}, triple_ress{}, triple_number{}, bigI(0) {}
保留列表空白可以正常工作,因为任何缺少的初始值设定项都会初始化数组中的元素。
答案 1 :(得分:4)
你可以完全不使用parens来实现这一点:
struct npc_next_best_spot{
npc_next_best_spot(): x{0},
y{0},
value(-1),
k(0),
i({0}),
triple_ress({0}),
triple_number({0}),
bigI(0)
{}
由于您使用的是统一初始值设定项,因此值得注意的是,您可以使用list-initializer以多种方式将数组初始化为零:
int a[3] = {0}; // valid C and C++ way to zero-out a block-scope array
int a[3] = {}; // invalid C but valid C++ way to zero-out a block-scope array
请注意,如果要将数组设置为值c!=0
,则以前的语法不起作用。
int a[3] = {-1}
意味着将a
的第一个元素设置为-1
(只是第一个元素)。另一个例子是,int a[5] = { 1, 2 };
将导致1,2,0,0,0
C ++有一套很好的功能可以用来封装容器,类似下面的东西可以完成这项工作:
std::fill_n(a, 3, -1);
如果你的编译器是GCC并且你在c99
工作,你也可以使用以下语法:int a[1024] = {[0 ... 1023] = 5};
将数组的一部分初始化为一个值(尽管这导致了生成的代码大小与初始化数组的大小成比例。)
I strongly suggest to take a look at this page on array initialization.