结构数组初始化列表的行为

时间:2012-10-26 12:31:30

标签: c++ visual-studio-2010 array-initialization

我已经扫描了几本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构造函数?由于我的数组大小可能会改变。

4 个答案:

答案 0 :(得分:1)

  

但测试表明,除了第一个元素外,所有元素都是   使用默认构造函数调用。

如果仅初始化数组的某些元素,则将使用默认构造函数初始化任何剩余元素。

答案 1 :(得分:1)

是的,这完全符合预期的行为。

您只为第一个元素指定了初始值设定项。由于未为其余元素指定初始值设定项,因此将调用默认构造函数。

您不能使用相同的语法仅指定一个初始值设定项,并在所有6个元素上使用它。所以我会采取不同的方法。使用旧的C风格构造声明数组后:

BufferElement buffers[10];

元素已经构建完毕。不使用旧的C风格数组,为什么不使用vector然后可以使用generatefill使用非默认构造的元素填充向量:

(未经测试,应该有效)

#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));