サンプルコード
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass(int intval);
MyClass(const MyClass& other);
public:
int Get();
int Get() const; // オーバーロード可能
private:
int m_intval;
mutable int m_intval_mutable; // 危険。使用には最新の注意を払いましょう
};
MyClass::MyClass(int intval) {
m_intval = intval;
}
MyClass::MyClass(const MyClass& other) {
m_intval = other.m_intval;
}
int MyClass::Get(){ // 非constメンバ関数
cout << "NOT const member function" << endl;
return m_intval;
}
int MyClass::Get() const { // constメンバ関数
cout << "const member function" << endl;
// constメンバ関数内でメンバ変数の値を変更したり
// 非constメンバ関数を実行するとエラーになる。
// ただし mutable なメンバ変数は変更可能
m_intval_mutable = 0;
return m_intval;
}
void ShowCopied(MyClass obj) {
cout << obj.Get() << endl; // 非constオブジェクト
}
void ShowReferenced(const MyClass& obj) {
// 非constメンバ関数内でメンバ変数が変更されない保証がない
// ため、constオブジェクトはconstメンバ関数しか実行できない。
cout << obj.Get() << endl; // constオブジェクト
}
int main() {
MyClass obj(0);
ShowCopied(obj);
ShowReferenced(obj);
return 0;
}