int a[10];
(非静的に)定義すると、 の内容a
は初期化されません。これが、C および C++ の設計方法です。あなたはそれを求めませんでした、あなたはそれを手に入れません。(初期化された配列が必要な場合は、と言ったでしょうint a[10]();
。)
C++ では、クラスstd::vector<int>
は、ユーザーが何をしようとも、明確に定義されたセマンティクスを持つように設計されています。したがって、 を定義すると、値が初期化された (つまり、ゼロになった) 要素std::vector<int> v(10)
が 10 個得られます (上記の 2 番目の例と同様)。
ただし、必要のないものにはお金を払わないことは関係なく適用され、後者はおそらく貧弱な C++ です。通常使用するのはreserve
で、これは C のようにメモリを作成しますが、オブジェクトは作成しません。オブジェクトは必要に応じて作成され、それ以上の割り当ては必要ありません。
std::vector<int> v; // no allocation (hopefully)
v.reserve(10); // one single allocation
for (int i = 0; i != 10; ++i)
v.push_back(i); // no allocations, guaranteed
一言で言えば: C はmemoryについてしか知りません。C++ では、ストレージとオブジェクトの概念が分離されています。このきめの細かいモデルは、より豊富なインターフェイスに対応しています。C では、「このストレージが必要かもしれないが、まだ何も入れていない」という概念を単純に表現することはできません。