在我的C ++程序中,我试图用全0来初始化一个3 * 3 * 3类型的double数组。 在类头文件中,我声明了一个成员
double list[3][3][3];
当我打印出这个数组的内容时,我发现并非所有条目都是0,正如我预期的那样。例如list [1] [1] [1]的值为4.03158e-321
因此我手动将此数组初始化为构造函数中的所有0:
list = {{{0,0,0},{0,0,0},{0,0,0}},
{{0,0,0},{0,0,0},{0,0,0}},
{{0,0,0},{0,0,0},{0,0,0}}};
这使我的程序工作,但是,我得到了编译器警告:
warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x
因此我的问题是
我的编译器是g ++(Ubuntu / Linaro 4.5.2-8ubuntu4)4.5.2,gcc版本4.5.2(Ubuntu / Linaro 4.5.2-8ubuntu4)
答案 0 :(得分:5)
在C ++ 03中,您只能在定义数组时使用该初始化:
double list[3][3][3] = {{{0,0,0},{0,0,0},{0,0,0}},
{{0,0,0},{0,0,0},{0,0,0}},
{{0,0,0},{0,0,0},{0,0,0}}};
编译器警告说,根据当前标准,它不应接受您的代码,即使它能够通过应用即将出现的标准规则来处理它,其中{...}
被称为外部 - 初始化
在这种特殊情况下,如果数组是成员并且您想将其初始化为全零,则可以在C ++ 0x中使用 value-initialization :
struct test {
double list[3][3][3];
test() : list()
{}
};
对于POD类型的成员(double
的数组是),初始化列表中的上述语法(list()
)表示该成员将被值初始化有效地意味着所有值都将设置为0
答案 1 :(得分:3)
我错过了什么,或者你不能做到
class Class {
public:
double array[3][3][3];
Class() : array() { }
};
答案 2 :(得分:2)
在标题中没有初始化,它只是声明了。如果它们不是全局变量(实际上,它具有静态存储持续时间),则由于性能原因,内置类型(以及一般POD中的更多内容)不会自动进行零初始化(因为C ++中的许多内容,初始化是一个选择加入,只有在需要时才支付费用。)
该语法仅在初始化数组时有效,而该指令是赋值。相反,该语法可用于新C ++标准中的更多位置(以前是C ++ 0x,现在是C ++ 11,因为它刚被批准)。
在我看来,解决问题的最快方法就是:
double * firstElem=&list[0][0][0];
std::fill(firstElem, firstElem+27, 0.);
将list
视为27 double
s的单维数组,并用零填充(有关该技巧的更多信息here)。
请注意,此参数也会简要地处理到array FAQ。
答案 3 :(得分:1)
有一种更简单的方法。以下内容适用于C或C ++,仅用于初始化变量(即不在赋值中):
double list[3][3][3] = {0};
{0}是一个特殊的初始值设定项,几乎可以将任何结构设置为全零。
答案 4 :(得分:0)
为什么不用memset
或循环?