構造体とクラスの違いは, 構造体では構造体の各フィールドに対して,
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と,
+
の演算子を使いたくなる.
また,その結果を時間のクラスのオブジェクトに等号 =
を使って代入したくなる.
このときには,+
や =
の演算子のオーバロードを行えばよい.