结构数组的初始化列表行为
我已经通过一些C ++书籍进行了扫描,但没有一篇详细描述这一点:
在VC ++ 2010中,我创建了一个结构体,并有意添加了用于测试的构造函数:
struct BufferElement {
size_t currentAllocationSize;
BufferElement() {
currentAllocationSize=50;
}
BufferElement(size_t size) {
if (size==0)
currentAllocationSize=20;
else
currentAllocationSize=1;
}
};
我有一个这种结构类型的数组:
int _tmain(int argc, _TCHAR* argv[])
{
BufferElement buffers[10]={0};
buffers[6]=0;
for (int i=0; i<sizeof buffers/ sizeof buffers[0]; i++) {
printf("%dn", buffers[i].currentAllocationSize);
}
return 0;
}
结果:
20
50
50
50
50
50
20
50
50
50
我期望我的数组初始化列表{0}应该将所有元素初始化为0.由于这是一个struct数组,因此0应该表示使用0调用构造函数。但是测试显示除了第一个元素之外,它们都是用默认的构造函数调用。 这是一个标准的行为? 当数组类型是结构时,我应该如何解释数组初始值设定项{0}? 我如何确保我的单一参数构造函数被调用而不必使用{0,0,0,0,0,0,0,0,0,0}? 由于我的数组大小可能会改变。
您只为第一个元素指定一个值,以便一个元素将使用BufferElement(your-value)
进行初始化。 其余的元素没有指定值,所以他们将使用默认的构造函数。 这就是类和结构类型发生的情况。
在内置类型的数组中,如int
,其余的值将被初始化,这使得它们为零。 对于类对象不是这样。
但是测试表明,除了第一个元素外,所有这些元素都使用默认构造函数调用。
如果仅初始化数组的某些元素,则其余元素将使用默认构造函数进行初始化。
标准不要求通过给出一个值( {0}
)来初始化数组的所有元素。 由于这是一个struct
s数组,所以调用它们的默认构造函数来初始化它们。
如果你想用特定的值初始化它们,你应该列出所有的元素,例如: {0, 0, 0, 0, ..., 0}
。
你可以使用一个std::vector
并初始化所有的像这样:
std::vector<BufferElement> vec(10, BufferElement(0));
链接地址: http://www.djcxy.com/p/67783.html