はじめに
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) は、メンバ変数とメンバ関数を一つにまとめた設計図。 - メンバ関数は、プロトタイプ宣言をクラス定義内で行い、実装をクラスの外 (
クラス名::関数名) に記述するのが一般的。 - 短い関数であれば、クラス定義内で直接実装するインライン関数も利用できる。
クラスの定義と実装を分離するスタイルは、オブジェクト指向プログラミングにおけるコードの構造化の基本です。
