第13章 constオブジェクト


今回は、constオブジェクトについて解説します。 constとは、読んで字のごとく「定数」という意味です。 これは、勝手に値を変更できないことを意味しています。 したがって、オブジェクトをconstで宣言するとデータメンバ は、一切変更できなくなります。それどころかメンバ関数も 一切呼び出せなくなります。もしかすると、メンバ関数が 値を書き換えようとするかもしれないからです。

エー、そりゃ大変だな・・・

ま、例題プログラムを見てみましょう。

#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; }

オブジェクトxはconst宣言をしているのでデータメンバa に、値を代入することはできません。 また、show関数を呼び出すこともできません。

一方、オブジェクト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型で宣言された項目を修飾しようとしました。

筆者の処理系では上のようなエラーメッセージが出て コンパイルできません。 みなさんの処理系ではどうですか?


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Jan/15/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。