この章ではオブジェクト指向プログラミングについて説明します。
オブジェクト指向プログラミングはC言語にはない機能であり、C++で新たに取り入れられた機能です。
オブジェクト指向型プログラミングは構造体に似た機能を持っています。
オブジェクト指向型プログラミングを使用すると変数と関数を1つにまとめることが出来ますが、この作業は「クラス」を使って行います。
つまり、「クラス」を使うことで、多くの変数と関数を1つの機能体として働かせてデータを処理することが出来ます。
クラスとは何かしらの物を作る「設計図」に例えられます。
設計図は車や家や鉛筆などをつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
例えば、鉛筆であれば、「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引くなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を変数で書き、「ふるまい」を関数で書くことになります。
どのような「状態」や「ふるまい」を作りたいかは「オブジェクト」の役割です。
例えば「線を書く」「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
では初めにクラスの基本から説明します。
クラスの中に「状態」を変数に書き、「ふるまい」を関数に書きます。
クラスの中の変数をデータメンバ、関数をメンバ関数と呼びます。
これをクラスの宣言と言います。
次はオブジェクトの作成方法について説明します。
オブジェクトについては先ほど以下のように説明しました。
このオブジェクトを作る過程をインスタンスと言います。
ではクラスとオブジェクトの関係のイメージをつかむためにもう一度説明します。
例えば新築の家をつくるとします。
ある人は家にプールを作ったり、床暖房を付けます。
そのことを実現するには設計図に「プールや床暖房」や「その機能」を付け加えないといけません。
実際には設計図であるクラスの中にプール、床暖房という変数を設定し、プールや床暖房の機能を定義するために関数内で水や床の温度を上げたり下げたりする機能を加える必要があります。
この設計図はそのままでは動きませんので、誰かの指揮のもとに動かさなくてはいけません。
その指揮者の役割がオブジェクトです。
オブジェクトは例えば冬になったらプールの水の温度を40度にするなど細かな指示をすることになります。
では実際に例を見てみましょう。
クラスの中の変数をデータメンバ、クラスの中の関数をメンバ関数と呼ばれていることは説明しました。
アクセス指定子とはメンバに対して、どこからのアクセスを許可するのかを指定するものです。
つまり、クラスは複数作ることが出来ますので、どのクラスからアクセスすることができるのかを規定するのがアクセス指定子です。
クラスの中に宣言をした後は、メンバ関数の実際の中身をクラスの宣言の下(つまりクラスの外)に書いていきます。
次にクラスの中のメンバ変数にデータを入れる方法について説明します。
この例ではクラス名をkeisanと名付けていますが、クラスはただの設計図なので、これにデータを入れないと何も動きません。
データを入れるには初めに
そして、その中に代入演算子を使ってデータを入れていきます。
つまり、
数値がそれ以外の数だった場合は
次はobj.hiku(num2);の部分を説明します。
number -= c;は
number変数にはtasu関数で計算された値が入っているので、hiku関数ではその値が使われます。
num1に5が入っているとすると
numberには上の3番で17が入っていますので、この値が使われます。
次の例はアクセス指定子に「private」を指定した例をみてみましょう。
privateもpublicと同じくアクセス指定子です。
クラスの定義の中にデータメンバやメンバ関数を記述する時にはアクセス指定子を書くことになりますが、省略も出来ます。省略した場合にはデータメンバ、メンバ関数はprivateになります。
privateの付いたデータメンバにはクラスの外から直接アクセスできないので、メンバ関数からアクセスすることになります。
この例のnumber変数はprivateなので、以下のsetNumber関数からnumber変数に値を入れています。
publicやprivateはデータメンバやメンバ関数に付けますが、基本はデータメンバはprivateで、メンバ関数はpublicで指定します。
データメンバをpublicにするとどのような値でも入れることが出来るので思わぬ誤作動につながる可能性があります。
ですのでsetNumber関数のような関数を作って中身の
では例をみてみましょう。
このs2関数はメンバ関数ではない普通の関数です。
この関数にアクセスする方法について説明します。
このようにオブジェクト変数でデータを受け取ることも可能になっています。
ですのでs2関数を呼び出すときには実引数にオブジェクトを入れます。
ではこのプログラムの説明をしていきます。
データメンバをオブジェクト作成と同時に初期化したい時にコンストラクタを使用します。
オブジェクトを作成と同時に初期化することでデータメンバに対してデータを入れ忘れることはなくなります。
以下の箇所がコンストラクタですが、numberを初期化しています。
引数を書かない場合にはコンストラクタの中で
次にコンストラクタを呼び出す方法について説明します。
基本構文は以下の通りです。
「keisan obj;」で呼び出されるコンストラクタは以下の箇所です。
この例では引数のあるコンストラクタと引数のないコンストラクタなのでオーバーロードが可能になっています。
結果は以下の通りです。
クラスの中にもインライン関数を書くことが出来ます。
通常、インライン関数を書くときにはinlineを付けますが、クラス宣言の中にインライン関数を書くときにはinlineを付けなくても、インライン関数としてみなされます。
以下の赤線で囲まれている箇所がインライン関数です。
通常の関数の書き方で書きます。
他のtasu関数などもクラスの中に書いても結構です。