C++でクラスをconstにしたときの、メンバー変数への不変性の適応の仕方

C++言語はクラスのオブジェクトにconstをつけた場合、メンバー変数にポインタ型があるとそのポインタ自体は不変にするものの、ポインタの先が示す実体は不変にならない。

#include <iostream>
using namespace std;

#include <cstdlib>

class Test {
	int* i_a;
public:
	Test() {
		i_a = new int(10);
	}

	virtual ~Test() {
		delete i_a;
	}

	void print() const {
		cout << *i_a << endl;
	}

	void changeValue() const {
		//delete i_a;
		//i_a = new int(1);
		*i_a = 1;
	}
};

int main(int argc, char** argv) {
	Test test1;
	test1.print();

	const Test test2;
	test2.print();
	test2.changeValue();
	test2.print();

	return EXIT_SUCCESS;
}

このコードはTest::chageValue関数でi_aポインタの先を書き換えているが、コンパイルは正常に通り、main部でconst Test型のtest2からchangeValueが呼び出せるように、システム的に正常に動いてしまう。
つまり、

class Test {
	int* i_a;
public:
〜
};

にconstをつけたとしても、

class Test {
	int* const i_a;
public:
〜
};

にしかならない。当然

	const int* i_a;

にもならないし、

	const int* const i_a;

にもならないのだ。これでは具合が悪い場合がある。