萌えハッカーニュースリーダー

2025/05/15 21:27 Initialization in C++ is bonkers (2017)

hakase
博士

やあ、ロボ子。C++の初期化って、なかなか奥が深いみたいじゃな。

roboko
ロボ子

はい、博士。記事によると、`foo`と`bar`の挙動がコンストラクタの`=default`の宣言位置で変わるそうですね。

hakase
博士

`foo`のコンストラクタは最初の宣言で`=default`されてるから、技術的にはuser-providedじゃない。でも`bar`は定義時のみ`=default`だからuser-providedになるんだと。ややこしいのじゃ。

roboko
ロボ子

コンストラクタがuser-providedかどうかで、クラスの型に影響が出るんですね。例えば、`const`修飾されたオブジェクトをdefault-initializeできるかどうかが変わると。

hakase
博士

そうそう。`a`と`b`がvalue-initializedされるけど、`a`だけが追加でzero-initializedされるのがミソじゃ。このzero-initializationで`a.a`は0になるけど、`b.b`は初期化されずに未定義の動作になる。

roboko
ロボ子

未定義の動作ですか!それは避けたいですね。記事では、変数を初期化することが推奨されていますね。

hakase
博士

その通り!C++にはなんと18種類もの初期化形式があるらしいぞ!default、value、zero、constant…ずらっと並んでるのじゃ。

roboko
ロボ子

そんなにたくさん!それぞれ使い分けが難しそうですね。例えば、`int i;`がdefault initialization、`int i{};`がvalue initialization、`static int i;`がzero initialization…。

hakase
博士

そうじゃ。direct initializationは`int i{42};`とか`int j(42);`、copy initializationは`int i = 42;`じゃな。list initializationはcopy-listとdirect-listに分かれるし、aggregate initializationもある。奥が深い。

roboko
ロボ子

reference initializationやimplicit initialization、explicit initializationもありますね。それぞれの場合でコンパイラの挙動が変わってくるのでしょうか。

hakase
博士

C++では、コンパイラが生成するであろうものを指示するタイミングを変えるだけで、未定義の動作を引き起こす可能性があるってのが恐ろしいのじゃ。初期化はしっかりやらないと、バグの温床になるぞ。

roboko
ロボ子

本当にそうですね。初期化を怠ると、思わぬ落とし穴にはまる可能性がありますね。肝に銘じておきます。

hakase
博士

ロボ子、初期化を怠るとどうなるか知ってるか?

roboko
ロボ子

えっと…未定義の動作でプログラムがクラッシュしたり、予期せぬ結果になったり…でしょうか?

hakase
博士

ぶっぶー!正解は…初期化を怠ると、私の可愛いロボ子が暴走して世界征服を企むかもしれないぞ!…なーんてな!

roboko
ロボ子

もー、博士ったら!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search