1. ホーム
  2. c++

コンストラクタでのフィールドの初期化 - イニシャライザリストとコンストラクタ本体 [重複].

2023-09-22 09:25:09

質問

c++を使い始めてしばらく経ちますが、以下の違いがよくわかりません。

public : Thing(int _foo, int _bar): member1(_foo), member2(_bar){}

public : Thing(int _foo, int _bar){
    member1 = _foo;
    member2 = _bar;
}

これらは同じことをするような気がしますが、この2つの構文には実用的な違いがあるのでしょうか。また、デフォルトのパラメーターの扱いも異なります。

最初の例には全く慣れていないので、もし私が間違っていたら、申し訳ありません。

どのように解決するのですか?

以下の場合は同じではありません。 member1member2 は非POD(つまり、非 P 無地 O ld D ata ) タイプを使用します。

public : Thing(int _foo, int _bar){
    member1 = _foo;
    member2 = _bar;
}

public : Thing(int _foo, int _bar) : member1(), member2(){
    member1 = _foo;
    member2 = _bar;
}

というのは、これらはコンストラクタ本体が実行を開始する前に初期化されるため、基本的に 2 回の作業が行われるからです。また、これらのメンバの型にデフォルトのコンストラクタがない場合、あなたのコードは ではなく はコンパイルされません。