next up previous
: 継承 : C と比較しながら,まず復習 : 構造体とクラス

データのアクセス

構造体とクラスの違いは, 構造体では構造体の各フィールドに対して,


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



Takeshi Kumagai 平成19年6月19日