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
だと信じて使うわけだから,本来は利用者側が観測できるような変化があってはいけないだろう.