ページ 11

メンバ関数の宣言について

Posted: 2015年12月17日(木) 18:47
by きょ
タイトル通りの質問です。
例)

コード:

//シーンの基底クラス。
class ClassA {
protected:
    int Handle;                //画像ハンドル
    ClassB* a;
public :
    ClassA(ClassB* p);   //ClassB*は任意の別のクラスへのポインタとします
}
といった定義をした際に、宣言部で

コード:


ClassA::ClassA(ClassB* p) : 
    Handle(0) {
    a=p;
}

とされているコードを見ました。
コンストラクタのところです。:と変数名の後ろに(0)がついている、奇妙な形だと思ったのですが、不思議とコンパイルエラーになりませんでした。
この宣言の意味はどういったものなのでしょうか?

Re: メンバ関数の宣言について

Posted: 2015年12月17日(木) 20:09
by deny
メンバイニシャライザです。
各々のデータメンバのコンストラクタを呼び出すのでコピーのコストを無くすことが出来るのがメリットです。
ちなみにデータメンバが宣言された順番でその処理が行われます。

Re: メンバ関数の宣言について

Posted: 2015年12月17日(木) 21:40
by きょ
返信おそくなって申し訳ありません。
メンバイニシャライザというのですね。自分の持っている本には載っていなかったので助かりました。ありがとうございます。

Re: メンバ関数の宣言について

Posted: 2015年12月17日(木) 21:44
by きょ
調べてみて、オブジェクトに対してのメンバイニティライザの利用法はわかったのですが、Handleはオブジェクトではなく、単純にデータメンバですよね?
データメンバにメンバイニシャライザというのはどういうことなのですか?

Re: メンバ関数の宣言について

Posted: 2015年12月17日(木) 23:54
by きょ
解決しました。ありがとうございました。

Re: メンバ関数の宣言について

Posted: 2015年12月18日(金) 00:03
by deny
きょ さんが書きました:Handleはオブジェクトではなく、単純にデータメンバですよね?
データメンバにメンバイニシャライザというのはどういうことなのですか?
int型をはじめとするプリミティブ型の初期化は

コード:

int a = 1;
などとするのが一般的ですが、ユーザ定義型(クラス等)の初期化と同様に

コード:

int a(1);
と書くことも出来ます(例えばポインタにインスタンスを割り当てる際に使ったことがあるかと)。
従って、メンバイニシャライザでもこの記法を取ることが出来ます。

また、メンバイニシャライザを省略した場合、データメンバのデフォルトコンストラクタが呼ばれた上で、そのコンストラクタの波括弧内にてデータメンバに代入(コピー)が行われるということになります。
プリミティブ型のコピーコストはユーザ定義型のコピーコストに比べれば僅かではありますが不必要なコピーを避けるという意味もあってメンバイニシャライザが使われることが一般的です。

あ、解決したのならば幸いです。