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

たまに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型)でもコンストラクタ風に呼び出しできる。

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


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




makotoのブログ

やりたいこと。
写真の上に何かを描く。

方針
Viewをextensして自作 PracticeView を作る。
xmlのlayoutに入れて、setContextViewで描画。

行き詰まり
02-13 02:46:45.181: ERROR/AndroidRuntime(635): java.lang.RuntimeException: Unable to start activity ComponentInfo{yeele.com.androidbasic/yeele.com.androidbasic.AndroidBasic}: android.view.InflateException: Binary XML file line #14: Error inflating class yeele.com.androidbasic.PracticeView


原因
Viewのconstractor!
public class PracticeView extends View {

private Context context;
public PracticeView(Context context){
super(context);
this.context = context;

}

上のように書いていたのが間違い
reference をよく確認したら、xmlに使う場合は、以下のようなconstroctorを
使うようにすればいいと解釈。
 



View
(Context context, AttributeSet attrs)
Constructor that is called when inflating a view from XML.


備考
もともとはlayoutにImageViewで写真を挿入、
これをプログラムから取得して、その上にラクガキを書きたかったが、
現時点では方法がわからず、viewに絵を描きたい場合は自作でView
を拡張子、お絵かきできるように拡張するしかないと結論づけた。