mutable修飾子

constメソッドは,基本的にインスタンス変数を変更できない. しかし,ごくまれに基本的にはconstメソッドなんだけども, 内部的に利用する変数を少しだけ書き換えてしまうから, おしいところでconst指定できないというような場合がある. この内部的に利用する変数が外から見えなくて,かつオブジェクトの振舞いもこの変数に依存しない場合, 利用者側から見ればそのメソッドはconstメソッドなんじゃないかと思えるだろし, 実装者側も外部仕様としてはconstメソッドだよといってしまいたいところだと思う.

こういう場合に便利なのがmutable指定で,mutableと指定されたメンバ変数だけは 例外的にconstメソッドからも書き換えてよいことになっている. たとえば次のコードでは,メソッドref()constと宣言されているけども, mutableメンバであるcounterを書き換えている.

class C {
public:
    C() : counter(0) {};
    int ref(void) const {
        return counter++;
    };
private:
    mutable int counter;
};

※この例は理想的なプログラミング スタイルという意味では あまりよくない. この例では, constと宣言している(すなわちインスタンスに変更を加えないと宣言している) メソッドref()を呼び出すことで次回のref()の振る舞いに影響がでてしまっているわけで, constメソッドとしてはインチキっぽい感じになっている. 利用者はconstだと信じて使うわけだから,本来は利用者側が観測できるような変化があってはいけないだろう.


はたいたかし
2001-07-21
トップ > 開発ツール > C++