ページ 1 / 1
C++のクラスの文法
Posted: 2012年3月14日(水) 16:51
by prapra
C++を大体理解できて、
DirectX9と物理エンジンBulletでゲームを作ろうと
解説されているサイトを何個か見ていると
サンプルプログラムに意味不明なクラスの文法が2つあったので
質問させてもらいます。
◎1つは
クラスの横にクラスがありますなんでしょう?
◎もう1つは
コード:
class aa{
public:
int bb ;
int cc ;
aa() ;
~aa() ;
}
aa::aa()
,bb(123)
,cc(321)
{
}
コンストラクタでメンバ変数を初期化しているようなんですが
すつうに
コード:
aa::aa(){
bb = 123 ;
cc = 321 ;
}
とすれば良いと思うんですがなんの意味があるんでしょうか?
上記のことが検索したりしてもなかなか出ません
知っている方回答お願いします。
Re: C++のクラスの文法
Posted: 2012年3月14日(水) 17:21
by beatle
1つめはテンプレートという機能です
参考:
http://www.geocities.jp/ky_webid/cpp/language/027.html
2つめ
コンストラクタの初期化子リストで初期化することは、コンストラクタ本体で初期化するよりも大抵良い事です。
初期化子リストで初期化しない場合、その変数がユーザー定義型ならデフォルトコンストラクタで初期化されますが、直後にコンストラクタ本体で本来の初期値が「代入」されるため、デフォルトコンストラクタによる初期化は無駄になります。
参考:"Effective C++ 第3版"、スコット・メイヤーズ著、小林健一郎訳 「4項 オブジェクトは、使う前に初期化しよう」
僕も長い間C++を触ってますが、恐らくprapraさんがいう「C++を大体理解できて」は、C++の5%くらいの部分しか理解していないのだと思います。僕も20%ぐらいしか理解していないんじゃないだろうかと最近怖くなっています(笑)
Re: C++のクラスの文法
Posted: 2012年3月14日(水) 17:23
by Blue
1つめはテンプレートクラスですね。
Web検索すれば、1から説明してくれるサイトがあるのでここで教えてもらうよりわかりやすいかも。
2つめはメンバイニシャライザについてですね。
コード:
aa::aa(){
bb = 123 ;
cc = 321 ;
}
は、 { の前に bbとccのコンストラクタが走ります。
こんなコードを書くとわかります。
コード:
#include <iostream>
class A {
public:
A() { std::cout << "A Constracter" << std::endl; }
};
class B {
public:
A a;
B() { std::cout << "B Constracter" << std::endl; }
};
int main()
{
B b;
return 0;
}
それと、constメンバ変数に対して、代入はできないので、メンバイニシャライザ(初期化リスト)で値を設定する
ことになります。
コード:
class A {
public:
const int n;
A() : n(100) {}
};
class B {
public:
const int n;
B() { n = 100; } // これは記述できない!
};
Re: C++のクラスの文法
Posted: 2012年3月14日(水) 17:38
by prapra
◎beatleさん
コンストラクタ本体で初期化するよりも大抵良い事です。
そうですか、今日からつかっていきます。
参考サイトもありがとうございます。
C++の5%くらいの部分しか理解していないのだと思います。
そうですか、C++はけっこう機能が追加されているんですねぇ
◎Blueさん
constメンバ変数に対して、代入はできないので、メンバイニシャライザ(初期化リスト)で値を設定する
ことになります。
そういえば確かにコンパイルエラーがおこります。
こうすればいいんですね。
メンバイニシャライザって言うんですか。
回答ありがとうございました。