はじめに
C++のオブジェクト指向プログラミングの核となるのが「クラス (class
)」です。クラスは、関連するデータ(メンバ変数)と、それらを操作するための一連の関数(メンバ関数)を一つにまとめた、独自のデータ型の「設計図」です。
この記事では、C++におけるクラスの基本的な定義方法と、クラスに属するメンバ関数の処理内容を記述(実装)する2つの主要な方法について、分かりやすく解説します。
クラスの基本的な定義
クラスを定義するには、class
キーワードに続けて、任意のクラス名を指定し、ブロック {}
の中にメンバを記述します。
// 「商品」クラスの定義
class Product {
public: // 外部からアクセス可能にする
// メンバ変数
int id;
std::string name;
// メンバ関数のプロトタイプ宣言
void display();
};
解説:
class Product { ... };
:Product
という名前の新しいクラス型を定義しています。構造体と同様に、最後のセミコロン;
を忘れないようにしましょう。public:
: アクセス指定子と呼びます。public:
と書くことで、これ以降に宣言されたメンバが、クラスの外部からアクセス可能になります。void display();
: これはメンバ関数の「プロトタイプ宣言」です。ここでは「display
という名前で、引数を取らず、何も値を返さない関数がありますよ」という宣言だけを行い、具体的な処理内容は後で記述します。
メンバ関数の実装方法
方法1: クラスの外で実装する(一般的)
メンバ関数の具体的な処理内容は、クラス定義のブロックの外側に記述するのが一般的です。その際、どのクラスに所属する関数なのかを明示するために、スコープ解決演算子 ::
を使います。
サンプルコード
#include <iostream>
#include <string>
using namespace std;
// --- クラスの定義 ---
class Product {
public:
int id;
string name;
// メンバ関数のプロトタイプ宣言
void display();
};
// --- メンバ関数の実装 ---
// Productクラスに所属するdisplay関数であることを :: で示す
void Product::display() {
cout << "商品ID: " << id << endl;
cout << "商品名: " << name << endl;
}
int main() {
Product item1;
item1.id = 101;
item1.name = "高機能マウス";
// メンバ関数を呼び出す
item1.display();
return 0;
}
解説:
void Product::display()
:関数名
(display
) の前にクラス名::
(Product::
) を付けることで、「これはProduct
クラスのdisplay
関数です」とコンパイラに伝えています。- ヘッダーファイルとソースファイル: 実際の開発では、クラスの定義(プロトタイプ宣言まで)をヘッダーファイル(
.h
や.hpp
)に、メンバ関数の実装をソースファイル(.cpp
)に分割して記述するのが一般的です。これにより、コードの管理がしやすくなります。
方法2: クラスの中で実装する(インライン関数)
処理内容が非常に短いメンバ関数に限り、クラス定義のブロックの中で直接、処理を実装することもできます。このように実装された関数は「インライン関数」として扱われます。
サンプルコード
#include <iostream>
#include <string>
using namespace std;
// クラス定義の中でメンバ関数を実装
class Product {
public:
int id;
string name;
// display関数をインラインで実装
void display() {
cout << "商品ID: " << id << endl;
cout << "商品名: " << name << endl;
}
};
int main() {
Product item1;
item1.id = 101;
item1.name = "高機能マウス";
item1.display();
return 0;
}
解説: インライン関数は、呼び出しのオーバーヘッドが少なくなるため、パフォーマンスがわずかに向上する可能性があります。しかし、クラス定義が長くなり可読性が落ちるため、ごく短いゲッター/セッターのような関数に限定して使うのが良いでしょう。
まとめ
今回は、C++のクラス定義と、メンバ関数の2つの実装方法について解説しました。
- クラス (
class
) は、メンバ変数とメンバ関数を一つにまとめた設計図。 - メンバ関数は、プロトタイプ宣言をクラス定義内で行い、実装をクラスの外 (
クラス名::関数名
) に記述するのが一般的。 - 短い関数であれば、クラス定義内で直接実装するインライン関数も利用できる。
クラスの定義と実装を分離するスタイルは、オブジェクト指向プログラミングにおけるコードの構造化の基本です。