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

constメンバ関数

C++

メンバ関数の後ろに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で読み取り専用メンバ関数を作れる・・・。

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