SSブログ

クラスのメンバ変数の初期化 [C++]

とりあえず、Qt開発のとっかかりまでは来たのですが、C++自体について全く素人なので、ここで気になったものを取り上げていこうと思います。レベル的には初心者だと思っていますが、一応、C++については、大昔に少しだけ触ったことがあるのと、CとRubyはそこそこの経験があると言う程度のスキルです。

今回は、クラスのメンバ変数の初期化。普通にコンストラクタの中でやってもいいんですが、確かメンバ変数だけは特殊な方法があったような気がするなぁと思って調べてみました。

*

とりあえず、C++の仕様の場所を調べておこうかと思ったんですが、有償でしか見れないようですね・・・。普通に見れるページとしては、ISO向けの古いドラフトSTLのリファレンスっぽいページは見つけました。

さて、調べていたところ、下記の様にコンストラクタにメンバーイニシャライザというのをつけるのが正解の様です。

class Hoge {
public:
    Hoge() : a(1), b(2) {    //  a(1), b(2) がメンバーイニシャライザ
        ....
    }

private:   
    int a;
    int b;
};


あんまり使用する意味が感じられなかったので、この様な定義ができた意図が知りたかったんですが、とりあえず、このメンバーイニシャライザによって、「static指定されていないconstメンバ変数の初期化ができる」とのこと。なるほどですね・・。また、「クラス内に他のクラスのインスタンスをメンバとする場合に、デフォルトコンストラクタ以外を呼ぶことができる」とのこと。なるほど・・。後者はわかりにくいと思うので、リンク先の例を少し真似てみます。

こんな感じです。

class Hoge {
public:
    Hoge()  {    //  デフォルトコンストラクタ
        a = 0;
    }
    
    Hoge(int i) { // 引数intを持つコンストラクタ
        a = i;
    }

private:   
    int a;
};

class Foo {
public:
    Foo() {    // デフォルトコンストラクタ
        // イニシャライザが指定されていない場合は、
        // hogeにデフォルトコンストラクタが適用される
    }

    Foo(int i) : hoge(i) { // 引数にintを持つコンストラクタ
        // イニシャライザが指定されているため、
        // hogeには引数に従ったコンストラクタが適用される
    }

private:
    Hoge hoge;
}


んん〜〜〜。わかった気になってましたが、ちゃんとわかってないかも・・。先程のページの実行結果を見る限りは、メンバ変数に他クラスのインスタンスがある場合、自クラスのコンストラクタが呼ばれる前にメンバ変数のコンストラクタが呼ばれる様ですね。この為、コンストラクタの内部ではメンバ変数のコンストラクタを選択することはできないが、メンバーイニシャライザならば、その際のコンストラクタを指定できると言うことかな・・。これは、処理系依存でなくて、言語仕様なんですかね・・。

なお、ついでに下記の様な情報も入りました。




う〜ん、やっぱりわかってないことばかりですね・・。ま、おいおい調べていきます。


【参考】
C++ - Wikipedia
Standard Template Library Programmer's Guide - sgi
C++ Final Draft International Standard
C++入門:5章 クラスの包含-> メンバーイニシャライザ - 目指せプログラマー!
C++のコンストラクタとObjective-Cのイニシャライザの違い
メンバイニシャライザでの初期化順序 - G.ISHIHARA
第20章 constメンバ - C++編(言語解説)






nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

ペンの追随の実装MacでもQt ブログトップ
ブログを作る(無料) powered by SSブログ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。