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

4

4 に答える 4

1

しかし、テストは、最初の要素を除いて、それらすべてがデフォルトのコンストラクターで呼び出されることを示しています。

配列の一部の要素のみを初期化すると、残りの要素はデフォルトのコンストラクターで初期化されます。

于 2012-10-26T12:36:59.317 に答える
1

はい、これは動作するはずのとおりです。

最初の要素だけに初期化子を指定しました。残りの要素には初期化子が指定されていないため、デフォルトのコンストラクターが呼び出されます。

同じ構文を使用して 1 つのイニシャライザのみを指定し、それを 6 つの要素すべてで使用することはできません。だから私は別のアプローチに行きます。古い C スタイルの構成を使用して配列を宣言すると、次のようになります。

BufferElement buffers[10];

要素はすでに構築されています。古い C スタイルの配列を使用する代わりに、なぜ a を使用しないのvector でしょうか。次に、generateorを使用fillして、デフォルトで構築されていない要素を使用してベクトルを埋めることができます。

(未テスト、動作するはず)

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

// ...

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

最初の要素の値のみを指定しているため、1 つの要素が で初期化されBufferElement(your-value)ます。残りの要素には値が指定されていないため、デフォルトのコンストラクターが使用されます。クラス型と構造体型の場合も同様です。

のような組み込み型の配列ではint、残りの値は代わりにvalue-initializedになり、ゼロになります。クラスオブジェクトの場合はそうではありません。

于 2012-10-26T12:38:50.187 に答える
1

標準では、値を 1 つだけ指定して配列のすべての要素を初期化する{0}必要はありません ( )。これは の配列であるためstruct、デフォルトのコンストラクターが呼び出されて初期化されます。

それらすべてを特定の値で初期化する場合は、次のようにすべての要素をリストする必要があります{0, 0, 0, 0, ..., 0}

std::vector次のように使用してすべてを初期化できます。

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