構造体とクラスの違いは, 構造体では構造体の各フィールドに対して,
y.a = 10; p = z.b + 20.5;などと値を参照したり,変更したりできたが, クラスでは, オブジェクトに局所な各フィールドの変数 (非公開メンバ変数) を, 直接参照したり,変更したりできないことである. (ただし,公開メンバ変数とすれば,プログラム内のどこからでもアクセスできる.)
C++ では,これを行う機能 (オブジェクトへのインタフェース) として,
public 以下に値を変更したり参照したりする
公開メンバ関数を定義し,
プログラムではこれを使用する.
すなわち,
クラスの定義が,
class stackclass {
int sp; // stack pointer
int stack_area[100];
public:
void push(int);
int pop(int);
bool empty(void);
};
void stackclass::push(int item)
{
stack_area[sp++] = item;
}
のようであれば,
stackclass x; ... x.push(10); ...と呼び出す. これは,関数を呼び出すというより, データ (オブジェクト) に 動作の指示を与えるメッセージを送ると考えることができる.
例えば,時間を表すクラス hour_minute があるとする.
この公開メンバ関数に
時間同士の加算がある場合,
8 時 50 分の 1 時間 30 分後を計算するのに,
例えば,時間のクラスのオブジェクト t1 の値が 8 時 50 分で,
t2 の値が 1 時間 30 分を示すとするとき,
t1.add(t2);とするより, 整数や実数のように
t1 + t2と,
+ の演算子を使いたくなる.
また,その結果を時間のクラスのオブジェクトに等号 =
を使って代入したくなる.
このときには,+ や = の演算子のオーバロードを行えばよい.