8.クラス |
|
クラスは、一番最初に説明したい便利な機能です。
ただ、説明する上で、変数や関数を理解していないと、説明しづらいのです。
なので、ここで説明せざるおえません。
ここでは、クラスの基本的な部分を説明します。
基本的な部分だけでも、十分に便利で使える機能です。
|
クラスの実態 |
クッキーの話を前にしました。
星型やハード型のクッキーを作る型抜きはあるのですが、パンダを作る型抜きはありません。
パンダを表現するには、目や口の部分や柄などたくさんの要素があります。
クラスは、自分で好きなように複雑な型を作ることができるのです。
これは画期的なことで、その上理解しやすいすばらしい記述法です。
|
型を宣言する (クラスを作る) |
宣言するときに使うのが型ですが、その型自体を作れる(宣言できる)のです。
文法は簡単です。
|
|
class c //クラスを宣言するためのキーワード
{
private: //このキーワードの後は、クラス内でしか使えない 省略できます。
//クラスで使う変数
public: //このキーワードの後は、どこからでも使える
//クラスで使う関数
}; //文章の終わりに「;」が必要 |
上の文でcという型が出来上がります。
これで、intと同じようにcという型が使えるようになります。
普通
型宣言 → もの(オブジェクト)が出来上がる。
クラス
型を作る(c) → その型を使って宣言する → もの(オブジェクト)が出来上がる。
class c c [区切り][キーワード]; キーワード
|
private: で変数をどこからもアクセスできないようにして、関数を入出力に使うのです。
簡単で、関数値渡しより楽にカプセル化ができます。
初心者の人は、 private: に変数を入れて、public: に関数を入れると覚えていて、
さしつかえありません。
後々、勉強していけば、なぜそう使うのか自然とわかってきます。
注意
クラスも、使う前に宣言しなければなりません。
|
クラスの例題 |
|
//座標を管理するクラス
class Zahyou //Zahyou(クラス名・キーワード)
{
//private:は省略しています
int x; //X座標
int y; //Y座標
public:
henkou()//座標を変更する関数
{
x=x+1;
y=y+1;
}
};
main()
{
Zahyou z; //Zahyou型のz(オブジェクト・実体)を宣言
z.henkou(); //zのメンバ関数henkou()を呼び出す
}
|
クラス内を呼び出すには、 |
オブジェクトができたら、そのキーワードを使って関数を呼び出せます。
[ オブジェクト名 ] [ 「.」(ドット) ] [ 関数名 ] [ ; ]
|
クラスのちょっと詳しい解説 |
private:(プライベート)で宣言された変数は、クラス内だけからアクセスできます。
クラス内のローカル変数と考えてさしつかえありません。
ですから、クラス内の関数から見れば、グローバル変数と同じ扱いができます。
グローバル変数なのですから、わずらわしい関数の変数渡しをする必要がありません。
変数渡し1個であれば、クラスのほうがわずらわしいですが、変数渡しを5個以上使うのであれば、クラスのほうが楽です。
プログラムから、グローバル変数を消すことも可能です。
プログラムが、1000行ぐらいになったとします。
グローバル変数は、その1000行すべてで使えます。
バグがあったときゾッとします。
ここで一言。完全に、独立しているわけではありません。
関数でも、入出力がありますので、つながっています。
クラスもそうです。バグがわかりやすくなるだけで、入出力で間違いがあれば一緒です。
バグが見つけやすくなるだけです。
|
クラスは便利 |
上のソースを見ても便利さが伝わってこないでしょう。
上のxとyがシューティングゲームの敵の弾だったらどうでしょう。
弾を100発処理するのは大変です。ゾッとしますよね。
でも、オブジェクトを100個作ればどうでしょう。
その便利さが想像できるのではないでしょうか。
新しい動きをする弾を作ろうとしたとします。
関数をクラス内に追加するだけで、実現できます。
便利すぎて、使うなといっても使ってしまうでしょう。
|
クラスは難しい |
こんなに簡単で、便利なクラスを敬遠する方がいます。
その理由は、耳にしたことのない言葉がたくさん出てくるからではないでしょうか?。
たとえ話をします。
学校のクラスを考えてください。
一クラスに、40人ぐらいの生徒(メンバー)がいます。
これと同じ考え方で、 クラスにはいろいろな生徒(メンバー)がいるのです。
クラスのメンバーをメンバ変数・メンバ関数と呼びます。
こんなわかりやすい言葉があるにもかかわらず、 メンバ関数をメゾットと聞きなれない言葉で表現する本が多いのです。しかたなくメゾットという言葉を覚えざるおえません。
クラスは便利で簡単なのですが、上のように不自然に外来語がもちいられています。
|
他にもたくさんあります。ここで少し説明します。
インスタンスは、オブジェクトと同じ意味で使われたり、メンバ変数のことをこういったりします。
こんな、不自然であいまいで聞き覚えのない単語を使っているのです。
インスタンス=オブジェクト
インスタンス=メンバ変数
オブジェクト≠メンバ変数 これは不自然です。
でも、インスタンスを覚えなければ本が読めません;;。
|
C++の本を読むために |
本を読むために、いくつか単語を解説します。
コンストラクタ=構築子(初期化関数)
デストラクタ=消滅子(消滅関数)
バーチャル関数=仮想関数
インヘリタンス=継承(けいしょう)
オーバーロード=多重定義
日本語にすれば、見ただけでそれなりにイメージできるものが、
聞きなれない外来語で使われています。
悲しいですが、覚えなければなりません。
|
カプセル化 |
カプセル化とは、プログラムを小さい単位で独立させることです。
ひとつのプログラムが100行以上になると、プロの人でも簡単に読めません。
初心者なら、なおさらです。
クラスは、簡単にカプセル化ができます。
初心者ほど、クラスの使用をお勧めします。
プログラム途中で、挫折する確率が減るでしょう。
昔、カプセル化するために、関数を無理やり使っていた時代があります。
初心者には大変なので、説明はしません。
クラスがあるので、そんなことは覚えなくていいのです。
時間があったとき、歴史勉強する感覚で、理解することをお勧めします。
|
最後に (オブジェクト指向について) |
オブジェクト指向の説明をしていません。
クラスは、便利な機能として使えばいいのです。
プログラムが複雑になって行き詰まりそうになったとき、
クラスを使って整理するのもいいでしょう。
プログラムが格段に、理解しやすい見やすいものになります。
そうやって、少しずつクラスを使っていけば、自然とオブジェクト指向プログラムになっていくものです。
オブジェクト指向プログラムの本は後回しにして、C++の本を3冊ぐらい読むことをお勧めします。
その後でも十分です。
PS.
クラスが便利で、クラスが難しくないことが半分以上を占めてしまいました。
クラス(オブジェクト指向)が難しいと敬遠してる人が多いからです。
もちろん必要がなければ、クラスを使わなくてもプログラムできます。
クラスも便利な機能のひとつです。
|