コンストラクタ初期化子について勉強する。

たまにc++のソースをみることがあるのだが、

class Miso(){
private:
string tofu;
string negi;

public Miso() : tofu("big"), negi("small") {

}
}

こんな、構文を何回か見た記憶がある。
新鮮だった。
なんとなく初期化していることは感じとっていたが、今日はもう少し理解を深めようと思った。


when I read the link below first time,
最初このリンク先ページ

I couldn't get, why
”コンストラクタ内に入った時にすでに参照が初期化されているからです”

なぜ、コンストラクタ内に入った時にすでに参照が初期化されているんですか!!!???
って思った。
そこで、いろいろ調べて

代入より初期化 を読んだとき、なんとなく疑問の点が繋がり、理解に一歩前進した。
コンストラクタ内でやっていることは、実質、代入なんだ。
コンパイラーは、あるクラスを初期化するとき、そのクラスにコンストラクタ初期化子がない
場合、スタック、ヒープに確保するにかかわらず、適当に初期化(メモリ確保)してから、コンストラクタ
を呼び出す。

それから、
初期化リストでは、言語組み込み型以外では初期化のためにコンストラクタを呼び出しますので、初期化値にはメンバであっても引数を記述できます。(代入より初期化  からの引用文)

上記のように、初期化子リストではそれぞれコンストラクタをようんでいるようだ。
かつ、非クラス型(POD型)でもコンストラクタ風に呼び出しできる。

こう考えると、変わった構文もすんなり理解できる。


なお、非クラス型でもコンストラクタ風に呼び出しができるのを知ったサイトはサイト