2010-11-27 9 views
8

可能性の重複:コンストラクタでこれらを置く以上の初期化子リストでメンバーを初期化する利点があった場合、私は思っていた
Benefits of Initialization listsイニシャライザリストを使用する利点は?

。特定のものは初期化リストを使用する必要がありますが、そうでないものの大半は違いがありますか?後者を好む理由は、コンストラクタが複数ある場合は、単純にconstruct()を呼び出してコードの再利用を促進するほうが好きなのです。

おかげプリミティブの

答えて

12

を構築するのに高価である場合に非効率的になることがあり、メンバーや基本クラスが開く中括弧の前に構築され、デフォルトを取得します。

ので、後でそれを設定するには、あなたの通話はoperator=()呼び出しを追加します。

初期化子リストを使用する場合、メンバーまたは基本クラスには、適切なコンストラクターが呼び出されます。

あなたのクラスによっては、これが必要かもしれません。

+0

サンプルの例を提供できると便利です。 –

10

、初期化子リストを使用して、または割り当てを経由して、それらを構築するに違いはありません。

その他のタイプでは、オブジェクトを構築するときにイニシャライザーリストがパフォーマンスを向上させる可能性があります。

初期化の順序(初期化子リスト内)は、クラスの宣言の順序によって異なります。宣言が順不同で、既に初期化されているものに依存するデータを構築する必要がある場合、それは「可能なとき初期化リストを使用する」ルールの例外です。

さらに詳しい情報:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6他の定数および参照のための初期化子リストを使用することを余儀なくされているよりも、それをあなたがメンバーオブジェクトを構築するデフォルトを避けるため、また、有用なのは、コンストラクタが入力される前に、その後すぐに、それを割り当てる

+0

優れた答えです。私が追加したい点は...プライベートInit()関数で値をプライマリに割り当てるコンストラクタの部分を配置することは意味があります(コンストラクタの数に基づいて)。これにより、イニシャライザリストのコードの重複が防止されます。 –

+0

@birryree引数のシーケンスについての素敵な点は、非プリミティブ型の場合にイニシャライザリストを使う利点を詳しく教えてください。 –

1

ましたメンバーオブジェクトを使用すると、初期化リストを使用しない場合

2

ほかにも言及しているのとは別に、shadow変数の曖昧さを排除することができるので、this->var = varの代わりにmyclass(int var) : var(var)と書くことができます。もちろん、一部の人が読んで、これは非常に混乱/ハード見つけるかもしれないあなたは大きなコンストラクタも

2

を持っている場合、初期化子リストで管理されていないリソース取得を行うことはありません。つまり、「リソース取得は初期化です」(つまり、管理されていないリソースを完全に回避する)か、コンストラクタ本体でリソースを取得するかのどちらかを使用します。

警告#2 新しいリソースをマネージャオブジェクト(たとえばauto_ptr)にすぐに与える独自のコードステートメントで、すべてのリソース割り当て(たとえばnew)を実行します。

http://www.gotw.ca/gotw/056.htm

関連する問題