通常、クラスのメンバ変数やメンバ関数の定義と実装は、
ヘッダファイル(***.h)とソースファイル(***.cpp)に分割します。
極端に小さい機能しか持たないクラスの場合は、
ヘッダファイルのみに定義、実装を記述する事もできます。
ここでは、分割した場合と、
分割せず、ヘッダファイルにのみ記述した例を示します。
ヘッダファイルとソースファイルに分割した記述例
ファイル名:hito.h
class hito {
public:
int age;
int sinchou;
int taiju;
void show_age();
void show_sinchou();
void show_taiju();
};
ファイル名:hito.cpp
#include <iostream>
#include "hito.h"
using namespace std;
void hito::show_age() {
cout << "年齢は" << age << "です。" << '\n';
}
void hito::show_sinchou() {
cout << "身長は" << sinchou << "です。" << '\n';
}
void hito::show_taiju() {
cout << "体重は" << taiju << "です。" << '\n';
}
この例では、クラスhitoの定義と実装を
ヘッダファイル(hito.h)とソースファイル(hito.cpp)に分割した例です。
ヘッダファイル(hito.h)には、
メンバ変数の定義、メンバ関数のプロトタイプ宣言を記述しています。
一方、ソースファイル(hito.cpp)では、
クラスhitoのメンバ関数の実装を記述しています。
まず始めに、
クラスhitoの定義を記述したヘッダファイル(hito.h)をインクルードします。
メンバ関数の実装は、メンバ関数名の前にクラス名と
::(スコープ解決演算子)をつけて
この関数がクラスhitoのメンバ関数であることを明記しなければなりません。
あとは、通常通りの記述が行えます。
ヘッダファイルのみにクラスを定義・実装した記述例
ファイル名:hito.h
#include <iostream>
using namespace std;
class hito {
public:
int age;
int sinchou;
int taiju;
void show_age() {
cout << "年齢は" << age << "です。" << '\n';
}
void show_sinchou() {
cout << "身長は" << sinchou << "です。" << '\n';
}
void show_taiju() {
cout << "体重は" << taiju << "です。" << '\n';
}
};
この例は、クラスhitoの定義と実装を
ヘッダファイル(hito.h)だけに記述した例です。
ヘッダファイル内に、
メンバ変数の定義、メンバ関数の定義、実装を記述しています。
分割した場合と比べて、
メンバ関数のプロトタイプ宣言をする必要はありません。
ですが、関数の実装が大きければ、
ヘッダファイル内の記述が煩雑になってしまうので、オススメできません。
また、静的メンバ変数や静的メンバ関数を扱う事はできない記述方法です。
静的メンバ変数についてはこちらのページ、
静的メンバ関数についてはこちらのページで解説しています。
まとめ
まとめとして、ヘッダファイルには、クラスメンバの定義だけに留めておき、
ソースファイルに実装を記述するのが、あらゆる事例に対応できる書き方です。
また、実装するソースファイルは複数あっても問題ありません。
例えば、クラスhitoの場合、
メンバ関数show_ageの実装をソースファイル(hito1.cpp)に、
メンバ関数show_sinchouの実装をソースファイル(hito2.cpp)に、
メンバ関数show_taijuの実装をソースファイル(hito3.cpp)に
分割する事ができる。
と言う事です。
クラスが膨大になった場合、このように分割すると管理しやすくなるでしょう。
以上、クラスの簡単な記述方法でした。