结构数组的初始值设定项列表的行为 我已经浏览过一些C++书籍,但没有一个详细描述:

结构数组的初始值设定项列表的行为 我已经浏览过一些C++书籍,但没有一个详细描述:,c++,visual-studio-2010,array-initialization,C++,Visual Studio 2010,Array Initialization,使用VC++2010,我创建了一个结构,其中特意添加了用于测试的构造函数: struct BufferElement { size_t currentAllocationSize; BufferElement() { currentAllocationSize=50; } BufferElement(size_t size) { if (size==0) currentAllocationSize=20;

使用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;
}
我希望我的数组初始值设定项列表{0}应该将所有元素初始化为0。由于这是一个struct数组,0应该意味着使用0调用构造函数。但是测试表明,除了第一个元素外,所有元素都使用默认构造函数调用。这是标准行为吗?当数组类型为结构时,如何解释数组初始值设定项{0}?如何确保调用单个参数构造函数而不必使用{0,0,0,0,0,0,0,0,0}?因为我的数组大小可能会改变

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

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

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


如果只初始化数组的某些元素,则所有剩余元素都将使用默认构造函数进行初始化。

是的,这与它的预期行为完全相同

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

不能使用相同的语法只指定一个初始值设定项并在所有6个元素上使用该初始值设定项。所以我会选择一种不同的方法。使用旧的C样式构造声明数组后:

BufferElement buffers[10];
这些元素已经构建好了。与其使用旧的C样式数组,不如使用
向量
,然后可以使用
生成
填充
使用非默认构造元素填充向量:

(未经测试,应该有效)

#包括
#包括
使用名称空间std;
// ...
向量缓冲器;
缓冲区。填充n(10,0);

是的,这正是它应该表现的

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

不能使用相同的语法只指定一个初始值设定项并在所有6个元素上使用该初始值设定项。所以我会选择一种不同的方法。使用旧的C样式构造声明数组后:

BufferElement buffers[10];
这些元素已经构建好了。与其使用旧的C样式数组,不如使用
向量
,然后可以使用
生成
填充
使用非默认构造元素填充向量:

(未经测试,应该有效)

#包括
#包括
使用名称空间std;
// ...
向量缓冲器;
缓冲区。填充n(10,0);

您只为第一个元素指定了一个值,这样一个元素将被初始化为
缓冲元素(您的值)
。其余元素没有指定值,因此它们将使用默认构造函数。这就是类和结构类型的情况


在内置类型的数组中,如
int
,其余的值将被值初始化,从而使它们为零。类对象不是这样。

您只是为第一个元素指定了一个值,这样一个元素将被初始化为
缓冲元素(您的值)
。其余元素没有指定值,因此它们将使用默认构造函数。这就是类和结构类型的情况


在内置类型的数组中,如
int
,其余的值将被值初始化,从而使它们为零。对于类对象则不是这样。

标准不要求只给出一个值(
{0}
)来初始化数组的所有元素。由于这是一个
struct
s数组,因此会调用它们的默认构造函数来初始化它们

如果您想用一个特定的值初始化它们,那么应该列出所有元素,如下所示:
{0,0,0,…,0}

您可以使用
std::vector
并按如下方式初始化:

std::vector<BufferElement> vec(10, BufferElement(0));
std::向量向量向量(10,缓冲元素(0));

标准不要求通过只给出一个值(
{0}
)来初始化数组的所有元素。由于这是一个
struct
s数组,因此会调用它们的默认构造函数来初始化它们

如果您想用一个特定的值初始化它们,那么应该列出所有元素,如下所示:
{0,0,0,…,0}

您可以使用
std::vector
并按如下方式初始化:

std::vector<BufferElement> vec(10, BufferElement(0));
std::向量向量向量(10,缓冲元素(0));