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

我已经通过一些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

上一篇: Behaviour of Initializer List for Array of Struct

下一篇: ZfcTwig is not loading config and fails in bootstrap