Top > C++言語 > カプセル化


アクセス指定子の種類と役割

  • アクセス指定子の機能は、クラスのメンバに作用し、クラスを使う側からメンバを利用できるかどうかを決定する
  • アクセス指定子が記述された行以降のメンバに作用する
  • クラスを定義するブロックの中で指定し、メンバ関数を実装するコードでは必要ない
  • C++ で使えるアクセス指定子には、public:、private:、protected: の 3 種類がある
  • 各メンバ毎に異なるアクセス指定子を指定することができる
  • 省略した場合は、private: になる
public (公開された)
  • public: が指定されたメンバは、公開される
  • クラスを使用する側から、public: で指定されたメンバ変数、関数にアクセス可能
private (私用の)
  • private: が指定されたメンバは、非公開となる
  • クラスの中だけで利用するメンバに指定する
protected (保護された)
  • クラスの使われ方に応じて、public: 又は private: のいずれかになる
  • クラスのオブジェクトを作って使うなら private: と同じ意味になる
  • クラスを継承して使うなら、public: と同じ意味になる


カプセル化

クラスの利用者にとって、利用する価値のないメンバを隠すことをカプセル化という


目的

カプセル化が何の役に立つのか、どのような場面でカプセル化を行えばよいかは、 オブジェクト指向プログラミングの捉え方によって様々

部品を組み合わせてプログラムを作成する事
  • 仮に300個のメンバが全て public: で公開されていたら、利用者は混乱する
  • 機能が多過ぎるクラスは使いにくい
  • この場合は、使って欲しい数十個のメンバを公開し、使いやすいクラスにする
現実世界のモデリング
  • モノの中で、使う人に見せるべきものと見せる必要がないものとが明確に区別されている
  • 例えば、テレビのリモコン。
    ボタンが public: で公開されており、内部の機能は private: でカプセル化されている
  • モノをモデリングするときには、必然的に private: と public: を切り分けて指定する
オブジェクト間のメッセージパッシングによってプログラムの動きを表す
  • メンバ変数を private: で隠し、そのメンバ変数を読み書きする為の関数を public: で公開する
  • メンバ関数を呼び出すことはメッセージパッシングですが、メンバ変数を読み書きすることはメッセージパッシングではない
  • クラスを使う側が、メンバ変数を読み書きしようとした事をオブジェクトが検知できる


活用法(その1)

private を指定して、メンバ変数をカプセル化

  • メッセージパッシングが成立する
  • メンバ変数に不適切な値が書き込まれる事を防ぐ効果がある
  • 下記、メンバ変数を保護するカプセル化の例
サンプル
すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 
 
 
-
|
|
|
|
|
|
!
 
 
 
-
|
!
 
 
 
-
|
|
|
|
!
 
 
 
-
|
|
|
|
|
|
!
#include <stdio.h>
 
class Book
{
private:
  int page;
 
public:
  int GetPage (void);
  void SetPage (int p);
};
 
int
Book::GetPage (void)
{
  return page;
}
 
void
Book::SetPage (int p)
{
  if ((p >= 1) && (p <= 1000))
    page = p;
  else
    printf ("Please enter the number (range: 1 to 1000).\n");
}
 
void
main (void)
{
  Book bk;
 
  bk.SetPage (123);
  printf ("page = %d\n", bk.GetPage ());
  bk.SetPage (2345);
  printf ("page = %d\n", bk.GetPage ());
}
実行結果
123
Please enter the number (range: 1 to 1000).
123


活用法(その2)

クラスを使う側に不要なメンバ関数を見せないようにし、クラスを部品として使いやすくする

  • クラスを使う側に公開する必要がないメンバ関数を private: を指定してカプセル化
  • ブラックボックス化とも呼べる
  • 下記、メンバ関数を隠すカプセル化の例
サンプル
すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 
 
 
 
-
|
|
|
|
|
!
 
 
 
-
|
!
 
 
 
-
|
|
|
|
|
|
-
|
|
!
|
!
 
 
 
-
|
|
|
|
-
|
!
|
-
|
!
!
#include <stdio.h>
#include <math.h>
 
class MathNiji
{
private:
  double TempCalc (double a, double b, double c);
 
public:
  bool GetNiji (double a, double b, double c, double *x1, double *x2);
};
 
double
MathNiji::TempCalc (double a, double b, double c)
{
  return b * b - 4 * a * c;
}
 
bool
MathNiji::GetNiji (double a, double b, double c, double *x1, double *x2)
{
  double temp;
 
  temp = TempCalc (a, b, c);
  if (temp < 0)
    return false; // no answer;
  else
    {
      *x1 = (-b + sqrt (temp)) / (2 * a);
      *x2 = (-b - sqrt (temp)) / (2 * a);
    }
  return true;
}
 
void
main (void)
{
  MathNiji sm;
  double x1, x2;
 
  if (sm.GetNiji (3, 10, 7, &x1, &x2) == true)
    {
      printf ("x1 = %f, x2 = %f\n", x1, x2);
    }
  else
    {
      printf ("no answer.\n");
    }
}
実行結果
x1 = -1., x2 = -2.33333


参考


リロード   凍結解除 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Mon, 03 Jun 2019 14:37:49 UTC (686d)