2010年6月15日火曜日

c++の初期化

検索しても見つからなかったので。
C++では変数宣言時に初期化ができる。で、クラスならコンストラクタがあるが(デフォルトコンストラクタも含む)、その他はどうなのかという話。(たとえばint型とか)
規格では8.5Initializersに規定されている。それによるとint a();とか書くとvalue-initializeされる。
value-initializeとはクラスや配列以外ならばzero-initializeが行われると規定されている。
zero-initializeはscalar type(おおざっぱに言えば整数型やポインタ)では0に変数を初期化するとある。
つまり
int a(); //a <- 0 となる。 これがあるので、たとえばstd::mapで std::map< int, int > m; m[0]; とかすると、zero-initializeが行われ、m[0]が0になる。


※追記
後輩から指摘されてしまった。

int a(); //type of a is int (*)()
宣言では空のパラメータを書いたときは、関数宣言とみなされることを失念していた。
宣言以外では、以下のようにかける。(右辺)
int a = int();

ところで
int a; // a have an indeterminate initial value
でいいのだろうか。