コンストラクタの初期化子

なんてこったい。C++でのハンドラもそこそこ書いてたのに全然理解できてない説浮上。
浮上というか確定。勉強しなおすかな。。

class HogeFuga
{
private:
string foo;

public:
HogeFuga(const char* q) : foo(q) {} // ←ウワサの初期化子
// HogeFuga(const char* q) { foo = q; }   // ←通常の書き方。今までこう書いてた。。
};

通常の書き方だと、

  1. HogeFugaクラスのインスタンス生成、メンバ変数が作られる.
  2. メンバ変数の初期化に伴い、string fooのデフォルトコンストラクタが呼ばれる.
  3. その後、HogeFuga コンストラクタが実行される
  4. オペレータオーバーロード関数(やコピーコンストラクタ)によって、望んだ初期化(qのコピー)が行われる.

ただ、よく見るとfooのデフォルトコンストラクタが呼ばれているのは無意味なわけです。
一方、初期化子の場合は、

  1. HogeFugaクラスのインスタンスを生成しようとする
  2. 初期化リスト中の定義(fooの初期化)を実施する
  3. HogeFugaクラスのコンストラクタ本体を実行する

となるので無駄が削減されています。

でもこれって…メンバ変数(コンストラクタを持つメンバ変数)の数だけズラズラ記述するんですかね??ちょっと見苦しくないです??うーむ。。。

ちなみに、アセンブラレベルでどれくらい違うのか見てみようと思い、objdumpしてみましたが、案の定サパーリ分かりませんでした^^;