1

我浏览了几本 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}?因为我的数组大小可能会改变。

4

4 回答 4

1

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

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

于 2012-10-26T12:36:59.317 回答
1

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

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

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

BufferElement buffers[10];

元素已经构建好了。为什么不使用旧的 C 样式数组,而不是使用 avector 然后您可以使用generatefill使用非默认构造的元素填充向量:

(未经测试,应该工作)

#include <vector>
#include <algorithm>
using namespace std;

// ...

vector<BufferElement> buffers;
buffers.fill_n(10,0);
于 2012-10-26T12:38:13.397 回答
1

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

在内置类型的数组中,例如int,其余值将改为value-initialized,这使它们为零。对于类对象不是这样。

于 2012-10-26T12:38:50.187 回答
1

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

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

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

std::vector<BufferElement> vec(10, BufferElement(0));
于 2012-10-26T12:39:18.200 回答