2006年01月31日

第13章 constオブジェクト

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

#include 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 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型で宣言された項目を修飾しようとしました。

筆者の処理系では上のようなエラーメッセージが出てコンパイルできません。みなさんの処理系ではどうですか?
posted by シンビアン at 19:28| Comment(1) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント

Blog楽しませていただきました。
私はe-アフィリというアフィリエイトサイトを運営しています。
宜しければこちらのサイトで当アフィリエイトに参加してみませんか?
1登録@1000円の成果報酬が簡単な登録で、今すぐ開始可能です。
ご興味があれば是非サイトをご覧下さいませ。

↓詳細は↓
http://e-af.net/?o
Posted by e-アフィリ at 2006年01月31日 20:12
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/12568096

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。