结构阵列的初始化列表的行为



我已经通过几本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,然后使用generatefill使用非默认构造的元素填充矢量:

(未经测试,应起作用)

#include <vector>
#include <algorithm>
using namespace std;
// ...
vector<BufferElement> buffers;
buffers.fill_n(10,0);

相关内容

  • 没有找到相关文章