C++ での変数の初期化について

C++ の勉強をはじめました。

  • C++ で変数の初期化は 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; はできない
  • そもそもコンストラクタの呼び出し (インスタンスの生成) は 型(引数) という構文で行なわれる
    • int なら int(3) とか
    • int x = int(3); はどういうことになるの?
      • int x で、 x に未初期化の int 型インスタンスが代入され、 int(3) で無名の int 型インスタンスが 3 で初期化され、それが x にコピーされる?
        • と思いきやコンストラクタは 1 回しか通らない
      • そもそもプリミティブ型の () による初期化は、インスタンスの生成ではないし、コンストラクタの呼び出しでもない
      • なんらかの初期化ルーチンを通っているのでは
        • それは何?
      • よくわからない
  • 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 言語との後方互換のため

さんこうぶんけん