C++ での変数の初期化について
C++ の勉強をはじめました。
- C++ で変数の初期化は int x(3); のように行なえる
- int x = 3; と同じ効果
- int 型の変数 x を宣言し、 3 を代入する
- int x = 3; と同じ効果
- int x(3); では、
- int 型のインスタンス? を生成する際にコンストラクタに 3 をわたし、初期化が行なわれる?
- プリミティブ型の int() は expression かもしれない
- int x = 3; では、
- int 型のデフォルトコンストラクタを通り、変数 x が宣言され、その値に 3 が代入される (結果として初期化となる)
- C++ では、型はコンストラクタという機能を持つ?
- コンストラクタじゃない、 expression だ
- int x と int x() は等価?
- int x() で宣言した x は初期化されている
- しかし実装依存/処理系依存な気がする
- int x は int x() のシンタックスシュガー?
- x() には代入できないが x には代入できるのでそれは違う
- int x = 3; はできるが int x() = 3; はできない
- x() には代入できないが x には代入できるのでそれは違う
- int x() で宣言した x は初期化されている
- そもそもコンストラクタの呼び出し (インスタンスの生成) は 型(引数) という構文で行なわれる
- int なら int(3) とか
- int x = int(3); はどういうことになるの?
- int x で、 x に未初期化の int 型インスタンスが代入され、 int(3) で無名の int 型インスタンスが 3 で初期化され、それが x にコピーされる?
- と思いきやコンストラクタは 1 回しか通らない
- そもそもプリミティブ型の () による初期化は、インスタンスの生成ではないし、コンストラクタの呼び出しでもない
- なんらかの初期化ルーチンを通っているのでは
- それは何?
- よくわからない
- int x で、 x に未初期化の int 型インスタンスが代入され、 int(3) で無名の int 型インスタンスが 3 で初期化され、それが x にコピーされる?
- int x(3); って何が起きてるの?
- よくわからない
C++ むずかしすぎて理解できませんでした。
追記
- int x(); はそもそも関数宣言になってしまう
- 関数内でも関数宣言は出来る、いわゆる前方宣言になる
- int x(1) では direct-initialize というものが発生し、 1 で初期化された int 型の変数 x が宣言される
- int x = 1 では copy-initialize というものが発生し、 int 型の変数 x として宣言された物が 1 で初期化される
- int x = int(1) では direct-initialize で 1 で初期化したものが copy-initialize で x を初期化する
- とは言え処理系の実装によっては int x = 1 or int x(1) と同じ処理になるだろう
- この話は POD かつ Scalar Type の場合のみである
プログラマはコンパイラの気持ちを考えよう。コンパイラは仕様書の気持ちを考えよう。
追記 2
- C++ では変数を宣言した瞬間に初期化が走るように設計されている
- MyClass x; とやった時点で MyClass のコンストラクタは実行される
- しかしプリミティブ型では未初期化変数の利用を許容している
- int x; とやっても x は初期化されない
- これは C 言語との後方互換のため