私はいくつかの 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} をどのように解釈すればよいですか? {0,0,0,0,0,0,0,0,0,0} を使用せずに、単一の引数コンストラクターが呼び出されるようにするにはどうすればよいですか? 配列のサイズが変わる可能性があるため。