はじめに
C++のクラスは、データ(メンバ変数)と操作(メンバ関数)をまとめた「設計図」です。このクラスを実際にプログラムで利用するには、まずクラスを定義し、次にそのメンバ関数の具体的な処理内容を実装する必要があります。
メンバ関数の実装には、いくつかのスタイルがあります。この記事では、C++における主要な3つの実装スタイルを、それぞれの特徴と共に解説します。
- クラスの定義と実装を分離する(推奨される基本的な形式)
- クラス定義の中で実装する(インライン関数)
- 1つのソースファイルに全てを記述する(学習や小規模プログラム向け)
1. クラスの定義と実装を分離する
大規模なプログラム開発で最も一般的で、推奨される形式です。コードの役割分担が明確になり、管理しやすくなります。
- ヘッダーファイル (
.h
): クラスの定義(どのようなメンバ変数とメンバ関数を持つかという「宣言」)を記述します。 - ソースファイル (
.cpp
): メンバ関数の具体的な処理内容(「実装」)を記述します。
【ヘッダーファイル: Product.h
】
#include <string>
// クラスの定義(設計図)
class Product {
public:
int itemID;
std::string itemName;
// メンバ関数のプロトタイプ宣言
void displayInfo();
};
【ソースファイル: Product.cpp
】
#include <iostream>
#include "Product.h" // 対応するヘッダーファイルをインクルード
using namespace std;
// Productクラスに属するdisplayInfo関数の実装
void Product::displayInfo() {
cout << "商品ID: " << itemID << endl;
cout << "商品名: " << itemName << endl;
}
解説: void Product::displayInfo()
のように、スコープ解決演算子 (::
) を使って、この関数が Product
クラスに属するものであることを明示します。
【メインのソースファイル: main.cpp
】
#include <iostream>
#include "Product.h" // Productクラスを使うためにヘッダーをインクルード
using namespace std;
int main() {
Product p1;
p1.itemID = 101;
p1.itemName = "高機能マウス";
p1.displayInfo();
return 0;
}
2. クラス定義の中で実装する(インライン関数)
処理内容が非常に短いメンバ関数は、クラス定義のブロック {}
の中で直接実装することができます。このように実装された関数は「インライン関数」として扱われ、呼び出しのオーバーヘッドが削減される場合があります。
サンプルコード
#include <iostream>
#include <string>
using namespace std;
class Product {
public:
int itemID;
string itemName;
// メンバ関数をクラス定義内で直接実装(インライン関数)
void displayInfo() {
cout << "商品ID: " << itemID << endl;
cout << "商品名: " << itemName << endl;
}
};
int main() {
Product p1;
p1.itemID = 101;
p1.itemName = "高機能マウス";
p1.displayInfo();
return 0;
}
解説: ヘッダーファイルが長くなるため、ごく単純な関数(1〜2行で終わるようなもの)以外では、多用は避けるのが一般的です。
3. 1つのソースファイルに全てを記述する
学習段階や、非常に小規模なプログラムを作成する場合には、クラスの定義、メンバ関数の実装、main
関数を、全て一つのソースファイル(.cpp
)にまとめて記述することもできます。
サンプルコード
#include <iostream>
#include <string>
using namespace std;
// --- クラスの定義 ---
class Product {
public:
int itemID;
string itemName;
void displayInfo();
};
// --- メンバ関数の実装 ---
void Product::displayInfo() {
cout << "商品ID: " << itemID << endl;
cout << "商品名: " << itemName << endl;
}
// --- メイン関数 ---
int main() {
Product p1;
p1.itemID = 101;
p1.itemName = "高機能マウス";
p1.displayInfo();
return 0;
}
解説: これは、方法1のヘッダーファイルとソースファイルの内容を、単純に一つのファイルにまとめたものです。
まとめ
今回は、C++のクラス定義とメンバ関数の、3つの主要な実装スタイルを解説しました。
- 分離形式: 大規模開発での基本。コードの役割が明確になる。
- インライン形式: 短い関数をクラス定義内に記述する。パフォーマンス向上の可能性。
- 単一ファイル形式: 学習や小さなプログラムで手軽に記述できる。
どのスタイルを選ぶかはプログラムの規模や目的に依りますが、基本となる「定義と実装の分離」の考え方を理解しておくことが、C++を使いこなす上で非常に重要です。