コンストラクタで自動的に初期化する

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

クラスでのスタック実装の例を考えましたが、クラス利用の際に・・・

スポンサーリンク

class stack a_stack;    // stack構造体の宣言。classは省略可。
a_stack.init();    // stackの初期化

1.stack構造体の宣言
2.初期化メンバ関数呼び出し(initメンバ関数)

と、手順を踏んでいます。
毎回生成するたびに、初期化メソッドを呼び出さなければならないのは面倒です。

そこで、クラスには、インスタンス生成時に同時に呼び出されて、自動的に初期化を行う機能があり、これをコンストラクタと呼びます。
コンストラクタは、クラスと同じ名前を持ちます。
stackクラスのコンストラクタ名は、stack::stackとなります。

コンストラクタは、以下のように書きます。

class stack {
    private:
        int count;               // スタック内の要素の数
        int data[STACK_SIZE];    // 要素
    public:
        // コンストラクタ
        stack();    // voidがないことに注意
        // スタックに要素をプッシュ
        void push(const int item);
        // スタックから要素をポップ
        int pop();
};
 
/***********************************
stack::stack
 スタックの初期化コンストラクタ
************************************/
 
inline stack::stack() {
    count = 0;    // スタックの要素数を0に設定
}

voidをつけないことに注意です。
では、以下コンストラクタを書いたstackクラス。

/***********************************
Stack
 整数型のスタックを実装する
***********************************/
 
#include <assert.h>
#include <cstdlib>
#include <iostream>
 
const int STACK_SIZE = 100;    // スタックの最大サイズ
 
/***********************************
stackクラス
 整数型のスタックを実装するクラス
 
メンバ関数(メソッド)
 init    :スタック初期化
 push    :スタックに要素プッシュ
 pop     :スタックから要素ポップ
***********************************/
 
class stack {
    private:
        int count;               // スタック内の要素の数
        int data[STACK_SIZE];    // 要素
    public:
        // コンストラクタ
        stack();    // voidがないことに注意
        // スタックに要素をプッシュ
        void push(const int item);
        // スタックから要素をポップ
        int pop();
};
 
/***********************************
stack::stack
 スタックの初期化コンストラクタ
************************************/
 
inline stack::stack() {
    count = 0;    // スタックの要素数を0に設定
}
 
/***********************************
stack::push
 プッシュ演算。
 スタックの最後に要素を追加して、
 要素数をインクリメントする。
 
引数
 item        :追加する要素の値
 
戻り値        :なし
************************************/
 
inline void stack::push(const int item) {
    assert((count >= 0) &&
        (count <= static_cast<int>(sizeof(data)/sizeof(data[0]))));
    
    data[count] = item;
    ++count;
}
 
/***********************************
stack_pop
 ポップ演算。
 スタックの先頭要素を取り出して、
 要素数をデクリメントする。
 
戻り値        :スタックの最後の値
************************************/
 
inline int stack::pop() {
    // スタックの要素数をデクリメント
    --count;
 
    assert((count >= 0) &&
        (count < static_cast<int>(sizeof(data)/sizeof(data[0]))));
    
    // 最後の値を返す
    return (data[count]);
}
 
// スタックをテストするためのルーチン
int main() {
    // stackを使用可能にする
    class stack a_stack;    // stack構造体の宣言。classは省略可。
 
    // 要素をスタックにプッシュ
    a_stack.push(1);
    a_stack.push(2);
    a_stack.push(3);
 
    // スタックから要素をポップ
    std::cout << a_stack.pop() << "\n";
    std::cout << a_stack.pop() << "\n";
    std::cout << a_stack.pop() << "\n";
 
    return 0;
}

実行結果。

3
2
1

クラスの利用において、「a_stack.init(); // stackの初期化」という初期化関数呼び出しを必要としなくなっています。
「class stack a_stack;」とクラスを宣言するだけで、インスタンス生成のために、同時に自動的にコンストラクタが呼び出されるためです。

スポンサーリンク
 
スポンサーリンク