読者です 読者をやめる 読者になる 読者になる

mutable

C++

constメンバ関数を使えば、そのメンバ関数は読み取り専用となり、メンバ変数を保護できる・・・。
しかし、これだと全てのメンバ変数の変更を禁止することになる・・・。
特定のメンバ変数だけは変更できるようにしたい・・・。
そういう場合は、そのメンバ変数にmutableを付ければいい・・・。

test.hで、

// クラスclass_testの定義
class class_test{

  // privateメンバ
  private:

    // privateメンバ変数
    int i_; // int型メンバ変数i_
    int j_; // int型メンバ変数j_

  // publicメンバ
  public:

    // publicメンバ関数
    int get_i() const; // i_を取得するメンバ関数get_i.(constが付いているので, このメンバ関数内でメンバ変数を変更することはできない.)
    void set_i(int i); // i_を設定するメンバ関数set_i.(このメンバ関数内ではメンバ変数を変更できる.)
    void show(); // i_とj_を出力するメンバ関数show.

};

メンバ変数にint型のj_を追加・・・。
showというメンバ関数も追加・・・。

test.cppでは、

get_iでj_に100を代入・・・。
set_iではiをj_にも入れているが、その後にget_iが呼び出されれば意味はない・・・。
showでi_とj_を出力・・・。

mutable.cppでは、

get_iした後、showも呼び出す・・・。

これでコンパイルすると、

$ g++ -o mutable mutable.cpp test.cpp
test.cpp: メンバ関数 ‘int class_test::get_i() const’ 内:
test.cpp:12:6: エラー: 読み取り専用オブジェクト内のメンバ ‘class_test::j_’ への代入です
   j_ = 100; // j_に100を代入してみる.
      ^
$

となるので、

j_にはmutableを付ける・・・。

$ g++ -o mutable mutable.cpp test.cpp
$ ./mutable
obj1.get_i() = 10
i_ = 10, j_ = 100
$

i_はセットした10に、j_はget_iの時に代入された100になった・・・。
j_はget_iの中で変更できた・・・。

Sample/cpp/mutable/mutable/src/mutable at master · bg1bgst333/Sample · GitHub