C++で学ぶオブジェクト指向プログラミングの基本概念
オブジェクト指向プログラミング(OOP)とは、オブジェクトとクラスを中心にプログラムを構築する手法のことです。継承、ポリモーフィズム(多態性)、データ隠蔽など、現実世界の概念をモデル化しており、データとそのデータを操作する関数をひとつのまとまり(単一の実体)として結び付けることで、データへの不正なアクセスや利用を制限することを目的としています。
オブジェクト指向プログラミングの基本概念は以下の6つです。
- クラス(CLASS)
- オブジェクト(OBJECTS)
- カプセル化(ENCAPSULATION)
- ポリモーフィズム(POLYMORPHISM)
- 継承(INHERITANCE)
- 抽象化(ABSTRACTION)
クラス(Class)とは
クラスとは、データメンバーとメンバー関数という独自のメンバーを持つデータ型です。オブジェクト指向言語におけるオブジェクトの設計図(ブループリント)にあたり、C++におけるオブジェクト指向プログラミングの基本的な構成要素となります。クラスのメンバーには、クラスのインスタンスを生成することでアクセスします。
クラスの重要な性質
- クラスはユーザー定義のデータ型である。
- クラスはデータメンバーやメンバー関数などのメンバーを含む。
- データメンバーとは、クラス内で宣言される変数のこと。
- メンバー関数とは、データメンバーを操作するためのメソッドのこと。
- データメンバーはクラスの「属性」を定義し、メンバー関数はクラスの「振る舞い」を定義する。
1つのクラスからは複数のオブジェクトを生成でき、それらのオブジェクトは共通の属性と振る舞いを持ちます。
構文
class クラス名 {
データ型 データ名;
戻り値の型 メソッド名(引数);
}オブジェクト(Object)とは
オブジェクトとは、クラスのインスタンスのことです。属性(特性)と振る舞いを備えた実体であり、オブジェクト指向プログラミングの中で実際に使用されます。メモリが割り当てられるのはオブジェクトを生成したタイミングであり、クラスを定義しただけではメモリは確保されません。
構文
クラス名 オブジェクト名;
サンプルコード
#include<iostream>
using namespace std;
class calculator {
int number1;
int number2;
char symbol;
public :
void add() {
cout<<"The sum is "<<number1 + number2;
}
void subtract() {
cout<<"The subtraction is "<<number1 - number2;
}
void multiply() {
cout<<"The multiplication is "<<number1 * number2;
}
void divide() {
cout<<"The division is "<<number1 / number2;
}
calculator(int a, int b, char sym) {
number1 = a;
number2 = b;
symbol = sym;
switch(symbol){
case '+' : add(); break;
case '-' : subtract(); break;
case '*' : multiply(); break;
case '/' : divide(); break;
default : cout<<"Wrong operator";
}
}
};
int main() {
calculator c1(12, 34, '+');
}
出力結果
The sum is 46
この例では、calculatorクラスが2つの数値と演算子をデータメンバーとして保持し、コンストラクタで渡された演算子に応じて対応する計算メソッドを呼び出しています。クラス定義とオブジェクト生成の流れが理解しやすいサンプルです。
カプセル化(Encapsulation)とは
カプセル化とは、データと情報をひとつの単位にまとめるというオブジェクト指向プログラミングの概念です。正式に定義すると、「データと、そのデータを操作できる関連する関数を結び付けること」を指します。
身近な例で考えてみましょう。大学には、情報系、電子工学系など、各学科(学部)があります。それぞれの学科には自分たちの学生と科目があり、それらを管理しながら教育を行っています。ここで、各学科を「クラス」と捉えると、その学科の学生に関するデータや教える科目をカプセル化していることになります。さらに、学科には授業時間や学習方法など、学生が守るべき決まったルールやガイドラインがあります。これこそが現実世界におけるカプセル化であり、「データ」と「データを操作する手段」がひとつにまとまっている状態です。
このカプセル化の概念があることで、もうひとつの非常に重要な概念である「データ抽象化(データ隠蔽)」が可能になります。データを内部に隠し、表示が必要な情報だけを見せる仕組みを実現できるのです。
ポリモーフィズム(Polymorphism)とは
ポリモーフィズムは日本語で「多態性」と訳され、文字どおり「複数の形態を持つ」という意味です。つまり、同じ操作を状況に応じて異なる形で実行できる能力のことを指します。メソッドの振る舞いは、呼び出された際の型や状況によって変わります。
現実世界の例を挙げると、一人の人間は状況によって複数の顔を持ちます。ある女性は「母親」であり「マネージャー」でもあり「娘」でもあります。状況ごとに彼女の振る舞いは変化します。ポリモーフィズムの概念はここから生まれました。
C++では、ポリモーフィズムを次の2つの方法で実現できます。
- 演算子オーバーロード: 同じ演算子が、使用される場面によって複数の振る舞いを持つことができる。
- 関数オーバーロード: 同じ名前の関数が、条件に応じて異なる処理を実行できる。
継承(Inheritance)とは
継承とは、あるクラスが別のクラスの特性や性質を受け継ぐ(派生する)機能のことです。他のクラスで定義されたメソッドを再利用できるため、コードの再利用性(リユーザビリティ)の観点から、オブジェクト指向プログラミングにおいて非常に重要な概念です。他のクラスから特性を受け取る側を「子クラス(サブクラス)」、受け渡す元となるクラスを「親クラス(基底クラス)」と呼びます。
C++がサポートする継承の種類は以下の通りです。
- 単一継承(single inheritance)
- 多重継承(multiple inheritance)
- 多段継承(multi level inheritance)
- 階層継承(hierarchical inheritance)
- ハイブリッド継承(hybrid inheritance)
抽象化(Abstraction)とは
データ抽象化(データ隠蔽)とは、内部のデータを隠し、最終的なユーザーに関連する情報だけを表示するという概念です。これもオブジェクト指向プログラミングの重要な要素のひとつです。
身近な例で理解しましょう。バイクに乗るとき、私たちは「ブレーキを押せば止まる」「スロットルを回せば加速する」ということだけを知っていればよく、その内部でどのような仕組みで動作しているかを知る必要はありません。知らなくてもよい情報を隠し、必要な操作だけを提供する――これがデータ抽象化の考え方です。
C++では、次の2つの方法でデータ抽象化を実現できます。
- クラスを使用する方法
- ヘッダーファイルを使用する方法
-
C++で学ぶ基本のグラフィックプログラミング入門
C++は汎用性の高いプログラミング言語です。C++を使えば、基本的な図形の描画、スタイリッシュなフォントによる文字表示、色付けといった初歩的なグラフィックスも作成できます。グラフィックプログラミングは、ターミナルやコマンドプロンプトから直接行うこともできますし、DevC++コンパイラをダウンロードして開発環境を整える方法もあります。graphics.hライブラリのインストールターミナルでグラフィックプログラミングを行う場合は、GCCコンパイラにgraphics.hライブラリを追加する必要があります。以下のコマンドを順番に入力してください。>sudo apt-get install bui
-
Pythonのオブジェクト指向プログラミングの基本概念をわかりやすく解説
Pythonにおけるオブジェクト指向プログラミング(OOP)の概念Pythonはオブジェクト指向プログラミング言語です。クラスやオブジェクトを簡単に作成し、自由に利用することができます。Pythonの主要なオブジェクト指向の概念は以下の7つです。オブジェクト(Object)クラス(Class)メソッド(Method)継承(Inheritance)ポリモーフィズム(Polymorphism/多態性)データ抽象化(Data Abstraction)カプセル化(Encapsulation)オブジェクト(Object)オブジェクトとは、状態と振る舞いを持つ実体のことです。物理的なものでも論理的なもので