メンバ関数の後ろにconstを付けると、そのメンバ関数からメンバ変数を変更できなくなる・・・。
読み取り専用メンバ関数とすることで、より安全性を高めている・・・。
このようにメンバ関数get_iの後ろにconstを付けると、get_iからはメンバ変数i_を変更できなくなる・・・。
main関数は、
10をセットした直後に出力・・・。
// ヘッダのインクルード // 独自のヘッダ #include "test.h" // クラスclass_test // class_testのメンバの定義 // メンバ関数get_i int class_test::get_i() const{ // 値を返す. i_ = -1; // i_に-1を代入してみる. return i_; // i_を返す. } // メンバ関数set_i void class_test::set_i(int i){ // 引数をメンバにセット. i_ = i; // i_にiを代入. }
get_iで値を返す前に、i_に-1を代入してみる・・・。
すると、
$ g++ -o const_member_function const_member_function.cpp test.cpp test.cpp: メンバ関数 ‘int class_test::get_i() const’ 内: test.cpp:10:6: エラー: 読み取り専用オブジェクト内のメンバ ‘class_test::i_’ への代入です i_ = -1; // i_に-1を代入してみる. ^ $
コンパイルエラーとなる・・・。
// ヘッダのインクルード // 独自のヘッダ #include "test.h" // クラスclass_test // class_testのメンバの定義 // メンバ関数get_i int class_test::get_i() const{ // 値を返す. //i_ = -1; // i_に-1を代入してみる.(これはできない.) return i_; // i_を返す. } // メンバ関数set_i void class_test::set_i(int i){ // 引数をメンバにセット. i_ = i; // i_にiを代入. i_ = -1; // i_に-1を代入してみる. }
set_i側でi_に-1を代入してみる・・・。
これは、
$ g++ -o const_member_function const_member_function.cpp test.cpp $ ./const_member_function obj1.get_i() = -1 $
コンパイルが通って実行できる・・・。
とはいえ、これでは正しくないのでコメントアウトする・・・。
こうして、
$ vi test.cpp $ g++ -o const_member_function const_member_function.cpp test.cpp $ ./const_member_function obj1.get_i() = 10 $
10が出力された・・・。
こんな感じでconstで読み取り専用メンバ関数を作れる・・・。