クラスのメンバ変数の初期化 [C++]
とりあえず、Qt開発のとっかかりまでは来たのですが、C++自体について全く素人なので、ここで気になったものを取り上げていこうと思います。レベル的には初心者だと思っていますが、一応、C++については、大昔に少しだけ触ったことがあるのと、CとRubyはそこそこの経験があると言う程度のスキルです。
今回は、クラスのメンバ変数の初期化。普通にコンストラクタの中でやってもいいんですが、確かメンバ変数だけは特殊な方法があったような気がするなぁと思って調べてみました。
*
とりあえず、C++の仕様の場所を調べておこうかと思ったんですが、有償でしか見れないようですね・・・。普通に見れるページとしては、ISO向けの古いドラフトとSTLのリファレンスっぽいページは見つけました。
さて、調べていたところ、下記の様にコンストラクタにメンバーイニシャライザというのをつけるのが正解の様です。
あんまり使用する意味が感じられなかったので、この様な定義ができた意図が知りたかったんですが、とりあえず、このメンバーイニシャライザによって、「static指定されていないconstメンバ変数の初期化ができる」とのこと。なるほどですね・・。また、「クラス内に他のクラスのインスタンスをメンバとする場合に、デフォルトコンストラクタ以外を呼ぶことができる」とのこと。なるほど・・。後者はわかりにくいと思うので、リンク先の例を少し真似てみます。
こんな感じです。
んん〜〜〜。わかった気になってましたが、ちゃんとわかってないかも・・。先程のページの実行結果を見る限りは、メンバ変数に他クラスのインスタンスがある場合、自クラスのコンストラクタが呼ばれる前にメンバ変数のコンストラクタが呼ばれる様ですね。この為、コンストラクタの内部ではメンバ変数のコンストラクタを選択することはできないが、メンバーイニシャライザならば、その際のコンストラクタを指定できると言うことかな・・。これは、処理系依存でなくて、言語仕様なんですかね・・。
なお、ついでに下記の様な情報も入りました。
う〜ん、やっぱりわかってないことばかりですね・・。ま、おいおい調べていきます。
【参考】
・C++ - Wikipedia
・Standard Template Library Programmer's Guide - sgi
・C++ Final Draft International Standard
・C++入門:5章 クラスの包含-> メンバーイニシャライザ - 目指せプログラマー!
・C++のコンストラクタとObjective-Cのイニシャライザの違い
・メンバイニシャライザでの初期化順序 - G.ISHIHARA
・第20章 constメンバ - C++編(言語解説)
今回は、クラスのメンバ変数の初期化。普通にコンストラクタの中でやってもいいんですが、確かメンバ変数だけは特殊な方法があったような気がするなぁと思って調べてみました。
*
とりあえず、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++編(言語解説)
コメント 0