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;
にもならないのだ。これでは具合が悪い場合がある。