5

私はいつも次のコードだと思っていました

std::map<int, int> test;
std::cout << test[0] << std::endl;

マップ内で単位化された値が作成されるため、ランダムな値が出力されます。ただし、作成された int は実際には常にゼロに初期化され、標準の組み込み型も特定の状況でゼロに初期化されることが判明しました。

問題は、標準型 (int/char/float/double/size_t) のゼロ初期化がいつ実行されるかです。int i;どこかで宣言すると、ランダムなデータが含まれることは間違いありません。

PS 質問は C++03 標準に関するものです。質問の理由は、int/float/size_t などの組み込み型の初期化をいつ提供する必要があるか、またはいつ安全に省略できるかがわからなくなったためです

4

5 に答える 5

9

標準コンテナ ( mapvectorなど) は、常に要素の値を初期化します。

大まかに言えば、値の初期化は次のとおりです。

  • デフォルトのコンストラクターがある場合のデフォルトの初期化
  • それ以外の場合はゼロ初期化

(両方の長所だと言う人もいます)

構文は単純です:T t = T();値を初期化しますt(およびT t{};C++11 で)。

を使用するmap<K,V>::operator[]と、ペアの「値」部分が値で初期化され、組み込み型の場合は が生成されます0

于 2012-02-28T12:12:51.150 に答える
1

私がintiを宣言すれば、私はかなり確信しています。どこの真ん中で、それはランダムなデータを含みます。

いいえ、常にではありません。

PODタイプのオブジェクトを作成すると、それは単一化されます:

struct A
{
  int iv;
  float fv;
};

int main()
{
  A a; // here the iv and fv are uninitialized
}

コンストラクターを追加するとすぐに、それらは初期化されます:

struct A
{
  A(){} // iv and fv initialized to their default values
  int iv;
  float fv;
};

int main()
{
  A a; // here the iv and fv are initialized to their default values
}
于 2012-02-28T11:49:56.207 に答える
1

特に上記の場合:

std::map<int, int> test;
std::cout << test[0] << std::endl;

使用しています std::map::operator[];

http://www.cplusplus.com/reference/stl/map/operator[]/を参照

T&の場合 map::operator[] ( const key_type& x );

... x がコンテナー内のどの要素のキーとも一致しない場合、関数はそのキーを持つ新しい要素を挿入し、マップされた値への参照を返します。これにより、マップされた値が要素に割り当てられていない場合でも、常にマップ サイズが 1 増加することに注意してください (要素は既定のコンストラクタを使用して構築されます)

だから、にtest[0]つながる test[0] = int();

実例はこちら: http://ideone.com/8yYSk

また読む:組み込み型の std::map デフォルト値

于 2012-02-28T11:57:56.667 に答える
0

char、int、float などのデータ型は初期化されないことに注意してください。ただし、この特定のケースでは、stl コンテナー クラスで使用されたため、初期化されました。

すべての stl コンテナ クラス オブジェクトが初期化されます。

于 2012-02-28T11:52:04.400 に答える
-3

The simplest solution is to simply create a template wrapper that will always be initialized.

于 2012-02-28T11:48:59.823 に答える