effectvie C++ 第1章3項
本に書かれていたメンバ関数のconstの意味。「ビットレベルでの不変性」(「物理的な不変性」)と「論理的な不変性」の二つ。
「ビットレベルでの不変性」とはC++のconstの定義。constなメンバ関数はそのオブジェクトが持つデータを変更できない。
class Test { private: int m_num; public: void func(void) const { m_num = 123; // コンパイルエラー } };
それに対し、「論理的な不変性」とはオブジェクトの値を変更したとしても、使う側からは分からないようにしてあること。たとえばオブジェクト内部ではキャッシュ処理が入ったりして値が変更されたとしても、使う側からはconstが付いているので値は変更されていないと考えてよいということ。
しかし、constが付いていると値を変更しようとしてもコンパイルでエラーとなってしまう。そのため値を変更したいものにはmutableを付ければよい。
class Test { private: mutable int m_num; public: void func(void) const { m_num = 123; } };
なるほど。これでmutableの利点がやっと分かった。