イニシャライザ リストとコンストラクタ本体: フィールドの初期化の詳細
C を使用したオブジェクト指向プログラミングの世界では、一般的なタスクの 1 つは次のとおりです。クラスフィールドを初期化しています。初期化子リストとコンストラクター本体はこれを行う 2 つの異なる方法を提供しますが、それらの微妙な違いを理解することが重要です。
初期化子リスト
初期化子リスト構文を使用すると、次のことが可能になります。コンストラクターの本体が実行される前に、コンストラクターの先頭でメンバー変数を初期化します。これは、: 記号の後にカンマ区切りの代入リストを使用して実現されます:
public: Thing(int _foo, int _bar): member1(_foo), member2(_bar) {}
コンストラクター本体
コンストラクター本体では、フィールドの初期化が内部で行われます。中括弧 (パラメーター リストの後)。各フィールドは等号を使用して明示的に割り当てられます。
public: Thing(int _foo, int _bar) { member1 = _foo; member2 = _bar; }
非 POD タイプの違い
非 POD (Plain Old Data) タイプを扱う場合、これら 2 つの方法には決定的な違いがあります。このようなフィールドをすぐに初期化する初期化子リストとは異なり、コンストラクター本体は、その本体の実行が開始された後にのみフィールドを初期化します。
これは、コンストラクター本体が、各非 POD メンバーのデフォルト コンストラクターを暗黙的に呼び出すことを意味します。二重初期化が発生します。例:
public: Thing(int _foo, int _bar) { member1 = _foo; member2 = _bar; }
これは実質的に次と同等です:
public: Thing(int _foo, int _bar) : member1(), member2() { member1 = _foo; member2 = _bar; }
安全性への影響
この違いは安全性に影響を与える可能性があります。非 POD メンバーにデフォルトのコンストラクターがない場合、コンストラクター本体を使用するとコンパイル エラーが発生します。対照的に、初期化子リストは単にメンバーの初期化をスキップしますが、これは状況に応じて望ましい場合と望ましくない場合があります。
デフォルト パラメータ
初期化子リストとコンストラクターの両方本体はデフォルトのパラメータ値をサポートします。ただし、動作は同じであり、メソッドの選択はデフォルトのパラメータの処理方法には影響しません。
以上がイニシャライザ リストとコンストラクタ本体: C フィールドの初期化にはどちらが最適ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。