クラスの使い方
2012年12月10日:C++
C++の肝であるクラスの使い方について解説します。そして、クラスで重要となるコンストラクタ関数とデコンストラクタ関数について解説します。
クラス
C言語では、構造体という変数のまとまりを扱う概念はありました。しかし、変数と関数を同時に扱う考えはありませんでした。
変数と関数をひとまとめにできると便利です。例えば、ボタンを設計する際に
- ボタンの色や形を変数
- ボタンを押した際の動作を関数
としてまとめることができれば、便利です。この変数と関数をひとまとめにしようという考え方がクラスの概念です。ボタン用のクラスを作成すれば、そのクラスをもとにボタンを簡単に作れますね。
ここでは、実際のプログラムを通してクラスの使い方をみていきましょう。
プログラム
実際に、クラスをつかってプログラムを組んでみます。 以下のように組んで実行してみましょう。
#include <iostream> using namespace std; class myclass{ int a; public: myclass(); //コンストラクタ ~myclass(); //デコンストラクタ void set(int i); void show(); }; myclass::myclass(): a(0){ cout<<"コンストラクトが呼び出されました\n"; cout<<a<<endl; } myclass::~myclass(){ cout<<"デコンストラクタが呼び出されました\n"; } void myclass::set(int i){ a=i; } void myclass::show(){ cout<<a<<"\n"; } int main(void){ myclass ob; ob.set(4); ob.show(); return 0; }
実行すると
コンストラクトが呼び出されました
0
4
デコンストラクタが呼び出されました
と表示されます。
解説
クラスの定義は
非公開関数と変数
public:
公開関数と変数
};
となっています。ここで、非公開関数と変数とは、クラス内のみで使用できる関数と変数のことです。クラスより外ではこれらの関数や変数にアクセスできません。非公開であることはprivateでも表現できます。逆に公開する場合はpublicを使用します。今回の場合、作成するクラスがmyclassでint aが非公開変数となっています。よって、外部からint aの値を取得したり変更したりできません。今回の場合は
ob.a=1;
といった命令はできません。
一方、公開関数と変数なら外部からアクセスでき、関数を使ったり変数の値の取得や変更が可能です。また、
クラスにおける関数をメソッド、変数をプロパティといいます。
よく使うので覚えておきましょう。
実装する際、プロパティは非公開にし、メソッドにより取り出せるようにしましょう。そうすることで、クラスを使用する人にとっても、値の取得はメソッドですればいいとわかりやすいという利点があります。また、外部からプロパティを変な値にさせることもありません。例えば、
class myclass{ public: int a; };
でなく
class myclass{ int a; public: int get(){return a;} void set(int i){a=i;} };
とプログラミングするようにします。これでaの入出力を制御できます。
さらに、ここではgetとsetの宣言部分に命令を書いています。この記法はインライン化と呼ばれるものです。通常、メソッドがあると、メソッドが記述してある命令に飛んで実行されます。しかし、インラインだと、あらかじめメソッドの命令を実行部分に埋め込むため、いきなり実行されることになります。そのため、インラインの方が実行速度が速くなります。しかし、長い命令のメソッドをインラインとし、何度も呼び出すと、呼び出すたびに書き込まれるため実行ファイルのサイズが大きくなるデメリットがあります。そのため、
インラインにする際は、短い命令のみにするようにしましょう。
今回のgetやsetは代入と値戻しと命令が少ないので、インラインにしたほうがいいでしょう。
メソッドの定義
クラスのメソッド(関数)の内容を定義する際は
関数の命令;
}
とします。ここではsetとshowというメソッドを定義しています。
void myclass::set(int i){ a=i; } void myclass::show(){ cout<<a<<"\n"; }
今回の場合、set(4)をしshowを実行するので、画面に4が表示されます。
オブジェクトの生成
クラスを使用するときは
とします。クラスより作成されたものをオブジェクトと呼ぶので覚えておきましょう。
コンストラクタ関数
クラスが myclass ob; で定義されるとコンストラクタ関数が実行されます。コンストラクタ関数は
により定義できます。今回の場合、コンストラクタ関数は
myclass::myclass(): a(0){ cout<<"コンストラクトが呼び出されました\n"; cout<<a<<endl; }
にあたります。オブジェクトが生成されると、画面に「コンストラクタが呼び出されました」と表示されます。
デコンストラクタ関数
クラスのオブジェクトが破棄されると、デコンストラクタ関数が実行されます。デコンストラクタは
として定義します。今回の場合、
myclass::~myclass(){ cout<<"デコンストラクタが呼び出されました\n"; }
が実行されます。オブジェクトが破棄されると「デコンストラクタが呼び出されました」と表示されます。
著者:安井 真人(やすい まさと)
@yasui_masatoさんをフォロー