オブジェクト指向とは
C++を理解する上で欠かせないのがオブジェクト指向という考え方です。
近年、このオブジェクト指向を用いたプログラミング手法が一般的になっています。
JAVAやHaskellなどの言語がオブジェクト指向を実装した言語として有名です。
C++はC言語にオブジェクト指向の機能を拡張した言語と言えるでしょう。
ここでは、C++に限らず一般的なオブジェクト指向について解説します。
オブジェクト指向とは「もの(オブジェクト)」の操作を主眼に置いたプログラムの設計思想のことです。
これだけではイメージがつかめないですね。
従来の構造化プログラミングや手続き型の言語と対比して考えましょう。
構造化プログラミングは上から下に順番に手順を記していく設計法です。
「あれをやって、次にこれをやって…」と書き並べていきます。
対してオブジェクト指向は、目的の機能を持ったオブジェクトを生成し、それを操作することで所望の動作を実現します。
(こちらの場合も、上から下という決まりは変わらないので厳密には対比できるものではありません。)
クラスとインスタンス
抽象的な言葉だけではわかりにくいので例を見てみましょう。
オブジェクト指向を実現するには「クラス」と「インスタンス」と言う仕組みを使います。
クラスとは、オブジェクトを一般化した設計図のようなものです。
インスタンスとは実体を意味し、クラスから具体化されたもので、インスタンス=オブジェクトと考えて良いでしょう。
例えば、「人間」を例として考えましょう。
人間クラスを作るとすると、まず人間は固有の「情報」を持っています。
名前や年齢、性別、身長、体重などですね。
情報の種類は共通ですが人によってデータは違います。
この「情報」をメンバ変数と言います。
また、人間にできる「機能」があります。
歩く、声を出す、見るなどが考えられます。
こちらも、大枠では同じことが出来ますが、人によって歩幅や声が違うので全く同じ動作にはなりません。
この「機能」をメンバ関数と言います。
そこで、共通する内容を雛形(クラス)として具体的な人間(オブジェクト)を用意するのがクラスという仕組みです。
オブジェクト指向の三要素
最後に何故オブジェクト指向を用いるのかについて説明します。
勿論、使うことによるメリットがあるからなのですが、それについてオブジェクト指向を構成する三つの要素から解説します。
継承
クラスには親クラスと子クラスを定義でき、親クラスの機能を子クラスに引継ぎ、さらに派生させることができます。
これを使えば、コードを0から書く必要がなくなります。
汎用的なクラスは一度用意してしまえばそれは財産となります。
詳しくはこちら。
カプセル化
カプセル化とはデータを隠蔽することです。
隠蔽と言うと悪いイメージがある言葉のような気がしますが、プログラミングにおいてはこれがメリットとなります。
複数人でコーディングをする場合を考えてください。
企業で大規模なプログラムを書く場合、殆どはプロジェクトのメンバーと分担してコードを書くことでしょう。
大規模で複雑なコードなら、誤って値を変更してしまうなどのバグが起きることでしょう。
カプセル化することでこれを未然に防ぐことができます。
具体的には、ある値やその値を変更する機能を使える範囲を限定します。
これによって外部から意図しない操作をされることを防ぐことが出来ます。
詳しくはこちら。
ポリモーフィズム
聞きなれない言葉ですが、日本語だと「多態性」と言う意味になります。
同じ名前を使っていても状況によって振る舞いを変えることが出来ます。
例えば「走る」と言う動作を考えてみましょう。
人が「走る」と言うと、脚を前後に動かして前に進む動作を言いますね。
車が「走る」と言うと、エンジンを動作させ、車輪を回すことを意味します。
機会が「走る」と言うと、これは稼動していることになります。
このような状況によって変わる動作を全て「走る」の一言で言い表すことができます。
詳しくはこちら。