我已经扫描了几本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("%d\n", 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}的情况下确保调用单个arg构造函数?由于我的数组大小可能会改变。
答案 0 :(得分:1)
但测试表明,除了第一个元素外,所有元素都是 使用默认构造函数调用。
如果仅初始化数组的某些元素,则将使用默认构造函数初始化任何剩余元素。
答案 1 :(得分:1)
是的,这完全符合预期的行为。
您只为第一个元素指定了初始值设定项。由于未为其余元素指定初始值设定项,因此将调用默认构造函数。
您不能使用相同的语法仅指定一个初始值设定项,并在所有6个元素上使用它。所以我会采取不同的方法。使用旧的C风格构造声明数组后:
BufferElement buffers[10];
元素已经构建完毕。不使用旧的C风格数组,为什么不使用vector
然后可以使用generate
或fill
使用非默认构造的元素填充向量:
(未经测试,应该有效)
#include <vector>
#include <algorithm>
using namespace std;
// ...
vector<BufferElement> buffers;
buffers.fill_n(10,0);
答案 2 :(得分:1)
您只是为第一个元素指定了一个值,因此将使用BufferElement(your-value)
初始化一个元素。其余元素没有指定值,因此它们将使用默认构造函数。这就是类和结构类型的情况。
在内置类型的数组中,如int
,其余的值将是值初始化,这使它们为零。对于类对象不是这样。
答案 3 :(得分:1)
标准不要求只提供一个值({0}
)来初始化数组的所有元素。由于这是struct
s的数组,因此调用它们的默认构造函数来初始化它们。
如果要使用特定值初始化它们,则应列出所有元素,如下所示:{0, 0, 0, 0, ..., 0}
。
您可以使用std::vector
并初始化所有内容:
std::vector<BufferElement> vec(10, BufferElement(0));