この質問 の答えから理解できるのは、グローバル/静的な初期化されていないintの値が0になることです。 this one の答えは、ベクトルの場合、オブジェクトのデフォルトコンストラクタタイプが呼び出されます。
私は理解できません-ローカル関数にvector<int> v(10)
があるとどうなりますか。 intのデフォルトのコンストラクタは何ですか? vector<int> v(10)
がグローバルに宣言されている場合はどうなりますか?
私が見ているのは、ローカル関数のvector<int> v(10)
が結果として変数0になるということです-しかし、それがコンパイラーによるものなのか、固定の予想される動作なのかはわかりません。
ゼロ初期化は、組み込みタイプのデフォルトのゼロ初期化/値初期化として標準で指定されており、主にテンプレートの使用でこのタイプのケースのみをサポートします。
この動作は、(動作が継承されるC言語のように)値を初期化しないままにするint x;
などのローカル変数とは異なることに注意してください。
未定義の動作ではなく、ベクトルはすべての要素を自動的に初期化します。必要に応じて、別のデフォルトを選択できます。
コンストラクタは次のとおりです。
vector( size_type, T t = T() )
また、intの場合、デフォルトのタイプ(int()
によって返される)は0です。
ローカル関数では、これ:
_int x;
_
変数を0に初期化する保証はありません。
int x = int();
そうするでしょう。
int x();
悲しいことにどちらもしませんが、関数を宣言します。
実際に使用しているコンストラクタは2つの引数を取ります。2番目の引数はオプションです。その宣言は次のようになります。
_explicit vector(size_type n, const T& value = T())
_
最初の引数は、vector
で最初に作成する要素の数です。 2番目の引数は、これらの各要素にコピーする値です。
すべてのオブジェクトタイプT
の場合、T()
は「値の初期化」と呼ばれます。数値型の場合、_0
_が得られます。デフォルトコンストラクタを持つクラスタイプの場合、そのコンストラクタを使用してデフォルトで構築されたオブジェクトを提供します。
「魔法の括弧」の詳細については、質問に対するMichael Burrの優れた答えを読むことをお勧めします 「型名の後の括弧は新しいものと違いますか?」 具体的にはnew
を使用しますが、ほとんどの場合、値の初期化に使用できます。
int
のデフォルト値はゼロです。したがって、vector<int> v(10)
は10個の要素すべてをゼロで初期化します!
int main() {
std::vector<int> v(10);
for ( int i = 0 ; i < 10 ; i++ )
std::cout << v[i] << std::endl;
return 0;
}
出力:
0
0
0
0
0
0
0
0
0
0
Ideoneで実行: http://ideone.com/IbcyH
int
型のデフォルトの初期化は、0に初期化することです。
これはほとんどの(すべてではないにしても)プリミティブ型に当てはまります。char
は(char)0
(または必要に応じて'\0'
)に初期化され、float
は0.0f
に初期化され、ポインターはNULL
に初期化されます。他のタイプの場合、パラメーターなしのコンストラクターが呼び出されます。
一般に、コンストラクターを指定できない(または選択しない)場合はいつでも、デフォルトの初期化がかなり行われます。
デフォルトでは、ベクトル要素はゼロで初期化され、デフォルトで初期化されません。これらは2つの異なる概念に関連しています。
ゼロ初期化は、明示的な初期化を持たない静的オブジェクトに対して行われることと、()
の初期化子を持つ初期化リストで指定されたメンバーに対して行われることです。基本型の場合、使用される値は0で型に変換されます。
default-initializationは、非静的変数およびメンバーを明示的に初期化しないために行われます。基本型の場合、初期化されないままです。
(そして、C++ 0Xはまだ異なる値の初期化を導入します)。