mutable指定子

http://www.geocities.jp/ky_webid/cpp/language/020.html

constメンバ関数に絡んで、mutable指定子というものが存在します。

コレは結構ニッチですね。

constメンバ関数によってメンバ変数が変更されないということを保証するわけですが、mutable付のメンバ変数はconstメンバ関数の干渉を受けずに変更することができます。

「なんだよ、結局constメンバ関数だからといってメンバ変数が変更されないことが保証されてない場合があるってことかよ」と言いたくなりそうですが、考え方次第です。

クラスの内部でしか扱わないような、メンバ変数に関してはmutableを使うケースがあってもおかしくないと思います。

要はクラスの利用者に対して関係性のあるメンバ変数さえ、書き換えされないことが保証されていれば問題ないということです。

クラスの利用者にとってまったく関係の無いメンバ変数がどう扱われようとどうでも良いことですよね。

ということで実装してみます。

class CSample {
private:
    mutable int m_num1;
    int m_num2;
public:
    int GetNum() const;
};

// constメンバ関数
int CSample::GetNum() const {
    m_num1 = 100; // mutableなので変更可能
    m_num2 = 200; // 変更不可。コンパイルエラー
    return m_num1 + m_num2;
}
$ cl /W4 /EHsc main.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
main.cpp(14) : error C2166: 左辺値は const オブジェクトに指定されています。