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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
きょ

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

#1

投稿記事 by きょ » 9年前

タイトル通りの質問です。
例)

コード:

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

コード:


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

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

deny

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

#2

投稿記事 by deny » 9年前

メンバイニシャライザです。
各々のデータメンバのコンストラクタを呼び出すのでコピーのコストを無くすことが出来るのがメリットです。
ちなみにデータメンバが宣言された順番でその処理が行われます。

きょ

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

#3

投稿記事 by きょ » 9年前

返信おそくなって申し訳ありません。
メンバイニシャライザというのですね。自分の持っている本には載っていなかったので助かりました。ありがとうございます。

きょ

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

#4

投稿記事 by きょ » 9年前

調べてみて、オブジェクトに対してのメンバイニティライザの利用法はわかったのですが、Handleはオブジェクトではなく、単純にデータメンバですよね?
データメンバにメンバイニシャライザというのはどういうことなのですか?

きょ

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

#5

投稿記事 by きょ » 9年前

解決しました。ありがとうございました。

deny

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

#6

投稿記事 by deny » 9年前

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

コード:

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

コード:

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る