トップC++入門 > コンストラクタ/デストラクタ
コンストラクタ/デストラクタ

1.コンストラクタ/デストラクタ

コンストラクタ

文献[1]と同じく次のような Colorクラスを考える。

コンストラクタとはクラスのオブジェクトを作成するときの初期化を行うための関数であり、 クラス名と同じ名前で戻り値の型の指定のない関数である。

下の例では3つのコンストラクタが定義されている。例えば、

  Color * pColor = new Color(64); 
とすれば、2番目のコンストラクタが実行される。
class Color {
public:
    unsigned char r, g, b;
    
    Color() {
        r = g = b = 0;
    }

    Color(unsigned char n) {
        r = g = b = n;
    }

    Color(unsigned char r0, unsigned char g0, unsigned char b0) {
        r = r0;
        g = g0;
        b = b0;
    }
};

コンストラクタは一つも定義しなくてもよい。オブジェクトは同じように作成される。 一切、初期化処理が行われないだけのことである。

デストラクタ

デストラクタはオブジェクトを廃棄するときの終了処理を行う関数である。 コンストラクタと同じく、戻り値の型の指定はない。関数名はクラス名の前に「~」(チルダ)を付ける。

デストラクタの例を下に示す。 new 演算子がコンストラクタを呼び出し、オブジェクトを生成する。 delete 演算子がデストラクタを呼び出し、オブジェクトを廃棄する。

[test.cpp]
#include <stdio.h>
#include <stdlib.h>

class Buffer {
  private:
    unsigned int  size;         // バッファ サイズ
    void  *pointer;             // バッファ ポインタ

  public:
    Buffer() {
         size = 0;
         pointer = NULL;
    }

    Buffer(unsigned int sz) {
        size = sz;
        pointer = malloc(sz);
        printf("メモリを確保しました\n");
    }

    void *GetPointer() {
        return pointer;
    }

    ~Buffer() {         // デストラクタ
        if (pointer != NULL) {
            free(pointer);
            printf("メモリを解放しました\n");
        }
    }
};

void test() {
    Buffer *buf = new Buffer(256);
    // buf を使用する
    delete buf;
}

int main() {
    printf("関数testの処理を開始します\n");
    test();
    printf("関数testの処理を終了しました\n");
}

このプログラムの実行結果を下に示す。

c:\sys>test.exe
関数testの処理を開始します
メモリを確保しました
メモリを解放しました
関数testの処理を終了しました

A.リファレンス

[1] C++の基礎 : コンストラクタ/デストラクタ