クラスのコンストラクタのコードを書くときに、コロン「:」が良く使われます。

これって何でしょう?


最初の頃、これが良く分からなくて調べてみると、

メンバー変数や親クラスを初期化するものだと分かりました。


<コンストラクタ1>

XXClass()

: m_str("###")

{};



こんな具合に記述されると、m_strがstringならば以下のコードが呼ばれたのと同じことです。

string m_str("####");

それだと、コンストラクタで次のように書くのと同じだと思いません?

<コンストラクタ2>

XXClass()

{

m_str = "###";

};


私もかつてそう思ってました。

コロンは見づらいので、{}の中で記述するほうがいい!と思ってました。

でも違うことが後で分かりました。

いったい何が違うんでしょうか?


実は、結果は同じです。

でも、コロンを使わない方は途中経過が違っていて、次のようにするのと同じことになります。


string m_str;

m_str = "###";


つまり、m_strが引数なしでstringのコンストラクタが呼ばれ、その後に"###"が代入されることになります。

余分な初期化処理が入るので遅いのです。


実際、上記二つのコンストラクタを10,000,000回呼ぶループを作って時間を計りましたら、以下のようでした。

 1.コロンを使用する場合 : 4.94s

 2.コロンを使用しない場合: 5.56s


一割くらい違いますよね!

クラス1つでこの違いなのでもっとコンストラクタの処理がもっと重くて、

呼び出す回数ももっと多ければ、かなり大きな差になると思います。

ただ、コードの位置が違うだけで。


ひゃ~。


見栄えはよくないかもしれないですが、慣れれば大丈夫。

是非、コロンを使いましょう!