前回、前々回ではオブジェクトの初期化を構造体と同じようにしていました。しかし、これは本来はやるべきでないものです。クラスにはクラスなりの初期化の仕方があるのです。今回はその「初期化の仕方」についてのお話です。
では、今回の要点です。
では、いってみましょう。
さて、クラスを作りました。そして、次はそのオブジェクトを作るとします。
SStudent student;
このとき、これだけでは student の中身には何が入っているか分かりませんね。これは int i; などのときと同じことです。
クラスの実体のことを「オブジェクト」というのは、クラスの実体を「物」にたとえているからでした。しかし、何が入っているか分からないというのに、それを「オブジェクト」と呼ぶのは何か納得がいきませんね。メンバ変数はその「物」の特徴といえます。その特徴が訳の分からないままというのは困りものです。
そこで、SStudent student; と書いただけで変数の初期化をしてくれるようにできるのです。わざわざ student.Init(); などと自分で関数を呼ばなくていいのです。
その初期化を行うには特殊なメンバ関数を使います。それをコンストラクタと呼びます。SStudent student; と書くと、勝手にこの「コンストラクタ」が呼ばれるのです。
コンストラクタはクラス名と同じ名前のメンバ関数で、戻り値がありません。これは戻り値の型が void であるというのではなく、戻り値の型すらないのです。
まぁ、言葉だけで説明してもピンとこないので、実際にプログラムを見てみましょう。
プログラム | 実行結果 |
---|---|
// Cstruct1.cpp #include <iostream.h> class CInt { public: int m_num; CInt(); void Disp(); }; // コンストラクタ CInt::CInt() { m_num = 0; } // メンバ変数の表示 void CInt::Disp() { cout << m_num << endl; } int main() { CInt a, b, c, d; a.Disp(); b.Disp(); c.Disp(); d.Disp(); return 0; } |
0 0 0 0 |
CInt というメンバ関数がコンストラクタです。名前はクラス名と同じですね。そして、戻り値の型を書くべき所には何も書いてないですね。その動作は、ここでは m_num メンバの値を0に初期化するようにしています。
そして、いくらオブジェクトを作っても Disp 関数で表示されるのは0です。a, b, c, d のどのオブジェクトも、メンバ変数 m_num が0で初期化されていることが分かります。このコンストラクタの m_num = 0; の文をコメントアウトしてみて下さい。変な値が表示されるようになると思います。
コンストラクタはメンバ変数の値を保証するための機構のうちの1つです。クラスの色々な機能も、このことを頭に入れておくと理解しやすいと思います。これらの機構をフルに使えば、「変な値が入ってたから動作がおかしくなった」というバグを極力減らすことができるでしょう。
短いですが、今回はこれで終わりです。では、今回の要点です。
次回は、引数付きのコンストラクタについてやろうと思います。それでは次回まで。
Last update was done on 2000.8.5
この講座の著作権はロベールが保有しています