2013年10月13日日曜日

C++ コンストラクタの応用

クラスの中には、複数のコンストラクタを作ることができます。^^
こうすると、複数の方法でオブジェクトの初期化ができるようになります。
オーバーロードの機能を使って、クラスの中に複数のコンストラクタを定義する例を
見ていきます。

class PeachBox {
public:
    PeachBox();                           //引数の異なる二つの
    PeachBox(int num);                //コンストラクタを宣言する
        :
};
        :
PeachBox::PeachBox()               //引数のないコンストラクタ
{
    m_total = 0;                           //変数m_totalを0で初期化する
}

PeachBox::PeachBox(int num)    //引数を一つ持つコンストラクタ
{
    m_total = num;                       //渡された引数を変数m_totalに代入する
}
        :
        :
int main(void)
{
    PeachBox myPeachBox1;          //もちろん引数なしの方のコンストラクタが呼ばれる
    PeachBox myPeachBox2(5);      //こちらは引数ありのコンストラクタが呼ばれる
        :

つぎに、動的にオブジェクトを生成する場合の例です。
引数を持つコンストラクタを呼び出して、動的にオブジェクト生成する場合は
以下のようになります。

class PeachBox {
public:
    PeachBox();
    PeachBox(int num);
        :
};
        :
        :
int main(void)
{
    //どちらも引数ありのコンストラクタが呼ばれます^^
    PeachBox myPeachBox1(12);
    PeachBox *pPeachBox2 = new(std::nothrow) PeachBox(6);
        :

このように引数の型と数に対応したコンストラクタが呼びだされます。
さすがC++といったところでしょうか(^_^;)

デフォルトコンストラクタ
コンストラクタは必須ではありませんので、プログラム中にコンストラクタを記述しないという
ことも可能です。その場合は、何もしないコンストラクタが自動的に用意され
呼び出されています。これをデフォルトコンストラクタといいます。
なお、デフォルトコンストラクタは、引数を持ちません。

今日の名言
兄弟よ、困難は偉大な心を育てる乳母である。この厳しい乳母は、揺り籠を手荒く
揺すって、その養い児をたくましい、均整のとれた体の子に育て上げるのだ。
                                 ウィリアム・カレン・ブライアント

熱中は単なる上っ面だけのモノでなく、内面から働きかける。熱中は、自分の
取り組んでいる事柄の何かある一面に心底からほれ込む場合に、生まれてくる。
                                 デール・カーネギー

あらゆる失敗は成功に向かう第一歩である。どこが間違っているか判明するごとに、
我々は真実に向かって一歩ずつ進む。一回経験するごとに、うっかり犯してそうな
失敗が一つ姿を消す。それだけでなく、何かを企てて完全に失敗に終わる事は、
めったにない。また、じっくり考えて得た理論であれば、どんな理論でも完全に誤って
いるということはない。うっかり犯しそうな失敗にも、真実を探求して得られる魅力が
必ず潜んでいる。
                                 ウィリアム・ヒューエル