オブジェクトxはconst宣言をしているのでデータメンバa に、値を代入することはできません。 また、show関数を呼び出すこともできません。#include <iostream.h> class Test { public: int a; Test(); ~Test(); int show(); }; Test::Test(void) { cout << "数値を入力-- "; cin >> a; } Test::~Test() { cout << "デストラクタが呼ばれました。\n"; } int Test::show(void) { cout << "[show] a = " << a << endl; return 0; } int main(void) { const Test x; cout << "[main] x.a= " << x.a << endl; //x.a = 20; エラーとなります。 //x.show(); 呼び出せません。 Test y; cout << "[main] y.a= " << y.a << endl; y.a += 12; //constオブジェクトでないので大丈夫 y.show(); cout << "値を変更しました。y.a = " << y.a << endl; return 0; }
一方、オブジェクトbは、const宣言をしていませんから データオブジェクトに代入したり、show関数を 呼び出したりできます。
当たり前ですがconst宣言をしていてもデストラクタとか、
コンストラクタは自動的に呼ばれます。
実行結果は、左の通りです。
いくらconstオブジェクトでも、値を書き換えないような メンバ関数まで呼び出せないのはつらい?ですね。 そこで、メンバ関数の宣言時に関数の最後にconstと 付け足してやります。こうすれば呼び出すことができます。 また、このconstは関数定義の所でも必ず記述しなくては いけません。ではサンプルプログラムを見てみましょう。
#include <iostream.h> class ConstTest { public: int a; ConstTest(); void show() const; //constの位置に注意 }; ConstTest::ConstTest(void) { a = 100; } void ConstTest::show(void) const //ここにもconst必要! { cout << "show関数が呼ばれました" << endl; cout << "a = " << a << endl; return; } int main(void) { const ConstTest x; x.show(); return 0; }
はい、左のようにshow関数を呼び出すことができました。 では、このshow関数中にこっそり値を書き換えるような記述を したらどうでしょうか?
筆者の処理系では上のようなエラーメッセージが出て コンパイルできません。 みなさんの処理系ではどうですか?error C2166: const型で宣言された項目を修飾しようとしました。
Update Jan/15/1997 By Y.Kumei