オブジェクト指向プログラミング

オブジェクト指向プログラミング (OOP, Object Oriented Programming) というのは、C++ 言語に特化した考えではないので、 よくご存知の方もおおいと思います。

OOP 自体の詳しい(というか正確な)説明は他のサイトにお任せします。

ここでは C++ でサポートする OOP 的なところをざっとみていきましょう。

クラス定義

C++ は class というキーワードを使ってクラスを定義します。

試しに C1 というクラスの定義を書いてみましょう。ここでは C1.h という名前のヘッダファイルに書きます。 しかし Java と違って、クラス名とファイル名は繋がらないので何でも構いません。

#ifndef C1_H_
#define C1_H_

class C1 {
protected:
  int a;
  int b;

public:
  C1(int i, int j);
  int getSum();
};

#endif /* C1_H_ */

クラスの定義は class キーワードで行います。

メンバ変数へのアクセスは基本的に private で、public や protected にする場合は明示的に指定します。

C1.h はヘッダファイルでメソッドもプロトタイプしかありません。実際の定義は C1.cpp で行います。

#include "C1.h"

C1::C1(int i, int j) {
  a = i;
  b = j;
}

int C1::getSum() {
  return a + b;
}

戻り値の書いていないクラス名と同じ名前のメソッドはコンストラクタです。

ここで定義したクラス C1 を使うプログラム例は次の通りです。

#include "C1.h"
#include <iostream>
using namespace std;

int main() {
  C1 c(1, 3);
  cout << c.getSum() << endl;
  return 0;
}

クラスの継承

それでは上で作ったクラス C1 を継承して新しいクラス C2 を作って、メソッドを追加しましょう。

#ifndef C2_H_
#define C2_H_

#include "C1.h"

class C2: public C1 {
public:
  C2(int i, int j);
  int getSubtracted();
};

#endif /* C2_H_ */

実装は次の通りです。

#include "C2.h"

C2::C2(int i, int j) :
    C1(i, j) {
}

int C2::getSubtracted() {
  return a - b;
}

C1 の定義でメンバー変数 a, b を protected としていたので、ここで新しく作るメソッドの中でそれらにアクセスできています。

C2 を利用するプログラムは次の通りです。

#include "C2.h"
#include <iostream>
using namespace std;

int main() {
  C2 c2(1, 5);
  cout << c2.getSum() << endl;
  cout << c2.getSubtracted() << endl;
  return 0;
}

実行結果は次の通りです。

6
-4

確かに C2 では getSum メソッドも getSubtracted メソッドも使えています。