我已经通过几本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来调用构造函数。除了第一个元素外,所有这些元素都被默认构造函数调用。这是标准行为吗?当数组类型为struct时,我应该如何解释数组初始器{0}?如何确保我的单个ARG构造函数被调用,而无需使用{0,0,0,0,0,0,0,0,0,0,0}?由于我的数组大小可能会改变。
您仅指定第一个元素的值,以便使用BufferElement(your-value)
初始化一个元素。其余元素没有指定值,因此它们将使用默认构造函数。这就是类和结构类型的情况。
在内置类型的数组(例如int
)中,其余值将为 value-initialized ,这使它们零。班级对象并非如此。
但是测试表明,除了第一个元素,所有这些都是 使用默认构造函数调用。
如果仅初始化数组的某些元素,则将使用默认构造函数初始化其余元素。
标准不需要一个值({0}
)来初始化数组的所有元素。由于这是struct
s的数组,因此称他们的默认构造函数来初始化它们。
如果您想用特定值初始化它们,则应列出所有元素,例如: {0, 0, 0, 0, ..., 0}
。
您可以使用std::vector
并以这样的初始化:
std::vector<BufferElement> vec(10, BufferElement(0));
是的,这完全与应有的行为一样。
您仅针对第一个元素指定了初始化器。由于未针对其余元素指定初始化器,因此称为默认构造函数。
您不能使用相同的语法仅指定一个初始化器,并在所有6个元素上使用它。因此,我会采取不同的方法。一旦您使用旧的C风格结构声明数组:
BufferElement buffers[10];
元素已经构造。而不是使用旧的C风格数组,为什么不使用vector
,然后使用generate
或fill
使用非默认构造的元素填充矢量:
(未经测试,应起作用)
#include <vector>
#include <algorithm>
using namespace std;
// ...
vector<BufferElement> buffers;
buffers.fill_n(10,0);