オブジェクト指向とは?

C++は,オブジェクト指向プログラミング(object-oriented programing)言語の1つです.
では,そのオブジェクト指向とは一体なんでしょうか?
オブジェクト指向プログラミングでは,“処理やデータをひとまとめにした自己完結型のオブジェクト”を中心に扱います.
オブジェクトには,ある程度のまとまった機能が集約されていると思ってください.
基本的な考え方は,オブジェクトというブラックボックスを複数組み合わせて,大規模なプログラムを書けるようにするというものです.

C言語を学習された方はご存知と思いますが,関数を用いることによって処理をある程度まとめることができ,
また,構造体を用いることによって変数をまとめて扱うこともできました.
このような記述は基本的に再利用可能ですが,プログラムが膨大になってくるとこれらの管理は難しくなってきます.

オブジェクト指向プログラミングは,このプログラムの再利用性という点で非常に優れており,
今日では多くのプログラミング言語でこの概念が取り入れられています.
以下で示すのは,オブジェクト指向の基本的な3つの概念です.

カプセル化 (encapsulation)

先ほど,「オブジェクト指向プログラミングでは,“処理やデータをひとまとめにした自己完結型のオブジェクト”を中心に扱う」と述べましたが,
この仕組みこそがまさしくカプセル化を意味しています.
このように,ひとまとめにすることによって,オブジェクト外部からの干渉や誤用を防ぐことができ,
コードの再利用性も高くなります.
C++では,オブジェクト内部の変数や関数を,外部からアクセス可能にするか,
内部のみからアクセスできるようにするかを設定できます.
encapsulation

ポリモーフィズム (polymorphism)

この言葉をじっと眺めてもなんのことかわかりませんよね?
これはギリシャ語で「多態性・多様性」といった意味だそうです.
オブジェクト指向プログラミングにおいて,このポリモーフィズムは1つの名前・表現に対して,
複数の処理が与えられるというものです.
C++の場合では,同名の関数でも使用するデータ型の種類によって処理を変えたり,
引数の数によって処理の内容を変えたりすることができます.
これを「オーバーロード(overloading)」と言います.
C言語では,同名の関数は禁止されていたと思いますが,C++ではオーバーロードすることにより可能です.
また,C++では演算子に対してもオーバーロードが可能であり,
例えば”+”という演算子に「加算」以外の処理を与えることができます.

継承 (inheritance)

継承とは,あるオブジェクトの性質を引き継ぎながら,新たなオブジェクトを生成することです.
その新しく生成したオブジェクトには,継承元の性質とともに自身の新たな性質を加えることができます.
この継承という仕組みによって,コードの再利用性というのは非常に高まるわけです.
また,階層的な設計を行うことができます.
すなわち,汎用的なオブジェクトを作っておき,それを継承して問題に合わせて独自の機能を追加していけば,
同じ記述のソースコードをコピー&ペーストする必要がないのです.
カプセル化の概念もあるので,ヘタにデータを外部から書き換えてしまう心配もありません.
(図中のクラスについては次の解説項目で説明します.)
inheritance
これら3つがオブジェクト指向における基本的な概念です.
これらの概念によってプログラムの可読性は大きく高まります.
そして,大規模なプログラミングの場合にオブジェクト指向プログラミングは大いに活躍します.
大規模な開発ともなれば,複数人で作り上げていくことも多いと思いますが,
他人が読んでわかりやすい,あるいは使いやすいソースコードを書くことができます.
C言語で大規模なプログラムを書こうとすると,普通の人が書けばだいたい読みづらいスパゲッティコードになるでしょう.
C++では,大規模なプログラミングによる開発を行うときに,ソースコードの複雑さを少なくすることができ,
他人が読みやすい・使いやすいコードが書けるのだということを理解しておいてください.