【问题标题】:Behaviour of Initializer List for Array of Struct结构数组的初始化列表的行为
【发布时间】:2012-10-26 12:31:29
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    在内置类型的数组中,例如int,剩余的值将改为值初始化,这使它们为零。类对象则不然。

    【讨论】:

      【解决方案2】:

      但是测试显示除了第一个元素之外,其他都是 使用默认构造函数调用。

      如果你只初始化一个数组的一些元素,任何剩余的元素都将使用默认构造函数进行初始化。

      【讨论】:

        【解决方案3】:

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

        如果你想用一个特定的值来初始化它们,你应该列出所有的元素,像这样:{0, 0, 0, 0, ..., 0}

        您可以使用std::vector 并像这样初始化所有内容:

        std::vector<BufferElement> vec(10, BufferElement(0));
        

        【讨论】:

          【解决方案4】:

          是的,这正是它应该表现的那样。

          您只为第一个元素指定了初始化程序。由于没有为其余元素指定初始化器,因此调用了默认构造函数。

          您不能使用相同的语法只指定一个初始化程序并在所有 6 个元素上使用它。所以我会采用不同的方法。使用旧的 C 样式构造声明数组后:

          BufferElement buffers[10];
          

          元素已经构建好了。与其使用旧的 C 样式数组,不如使用 vector 然后您可以使用 generatefill 使用非默认构造的元素填充向量:

          (未经测试,应该可以)

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

          【讨论】:

            猜你喜欢
            • 2022-01-13
            • 1970-01-01
            • 2015-07-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多