constオブジェクトとconstメンバー関数


オブジェクトがconstオブジェクトとして定義されている場合、constメンバー関数のみが呼び出されます.
メンバー関数がconst関数であることを宣言すると、コンパイラに
constオブジェクトがこの関数を呼び出します.特にconstとして宣言されていない
メンバー関数は、オブジェクト内のデータ・メンバーを変更する関数とみなされ、コンパイルされます.
この関数はconstオブジェクトに呼び出すことはできません.関数を1つだけ宣言
クラス定義はconstで、メンバー関数もこのように定義されているとは保証できません.
コンパイラはプログラマに関数を定義する時にconstの説明を再確認させ、constはすでに
関数識別子の一部なので、コンパイラも接続プログラムもconstをチェックします.
constを関数宣言の前に置くと、戻り値が定数であることを意味するので、constタグを
識別子はパラメータテーブルの後ろに配置されます.一般的にメンバーデータを変更しない関数は、
const関数は、constオブジェクトによって呼び出されます.
 
constメンバー関数でデータを変更したい場合は、どうすればいいですか?2つの方法があります.
(1)constの強制変換:thisを取り、現在のタイプのオブジェクトへのポインタに変換します.
Thisはconstポインタであり,それを通常のポインタに変換することで定数性を取り除くことができる.
class Y {
private:
	int i, j;
	
public:
	Y() { i = j = 0; }
	void f() const {
		//i++;	//     
		((Y *)this)->j++;	//    
	}
};

int main() {
	const Y yy;
	yy.f();
	return 0;
}

(2)キーワードmutable:特定のデータメンバーがconstオブジェクトで変更できることを指定する.
class Y {
private:
	int i;
	mutable int j;
	
public:
	Y() { i = j = 0; }
	void f() const {
		//i++;	//     
		j++;	//    
	}
};

int main() {
	const Y yy;
	yy.f();
	return 0;
}