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