3-1-2. クラスアクセス指定子

公開日: 21:25 3. オブジェクト指向編/3-1. クラスとオブジェクト/3-1-2. クラスアクセス指定子

データの隠蔽はオブジェクト指向プログラミングの重要な機能であり、プログラム内の関数が直接クラスの内部にアクセスすることを防げるようにします。クラスメンバへのアクセス制限はクラス本体の中でpublic、private、protectedとラベル化することで指定されます。publicprivateprotectedキーワードはアクセス指定子と呼ばれます。

クラスは複数のラベル化されたpublic、private、protectedセクションを持つことができます。各セクションは他のラベルかクラス本体の}が見つかるまで効果が残ります。クラスとメンバへのデフォルトのアクセスはprivateとなります。
class Base {
 
   public:
 
  // publicなメンバはここに
 
   protected:
 
  // protectedなメンバはここに
 
   private:
 
  // privateなメンバはここに
 
};

publicなメンバ

publicなメンバはプログラム内であればクラスの外からでもアクセス可能です。次のように、メンバ関数を使わずにpublicな変数の値を取得または変更できます。
#include <iostream>
 
using namespace std;
 
class Line
{
   public:
      double length;
      void setLength( double len );
      double getLength( void );
};
 
// メンバ関数の定義
double Line::getLength(void)
{
    return length ;
}
 
void Line::setLength( double len )
{
    length = len;
}
 
// Main()
int main()
{
   Line line;
 
   // lineの長さをセット
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;
 
   // メンバ関数を使わずにlineの長さをセット
   line.length = 10.0; // OK: lengthはpublicなので問題なし
   cout << "Length of line : " << line.length <<endl;
   return 0;
}
上のコードをコンパイルし実行すると、次の結果が得られます。
Length of line : 6
Length of line : 10


privateなメンバ

privateなメンバ変数や関数はクラスの外からアクセスできず、見ることもできません。クラスとフレンド関数のみがprivateメンバにアクセスできます。クラスのメンバはデフォルトでprivateとなります。以下のクラスではwidthはprivateなメンバであり、メンバをラベル化しないうちはprivateなメンバであると想定されます。
class Box
{
   double width;
   public:
      double length;
      void setWidth( double wid );
      double getWidth( void );
};

実際にprivateセクションでデータを、関連する関数をpublicセクションで定義しクラスの外から呼び出してみます。
#include <iostream>
 
using namespace std;
 
class Box
{
   public:
      double length;
      void setWidth( double wid );
      double getWidth( void );
 
   private:
      double width;
};
 
// メンバ関数定義
double Box::getWidth(void)
{
    return width ;
}
 
void Box::setWidth( double wid )
{
    width = wid;
}
 
// Main()
int main()
{
   Box box;
 
   // メンバ関数を使わずにlength値をセット
   box.length = 10.0; // OK: lengthはpublicなので問題なし
   cout << "Length of box : " << box.length <<endl;
 
   // メンバ関数を使わずにwidth値をセット
   // box.width = 10.0; // Error: widthはprivate
   box.setWidth(10.0);  // 値をセットするにはメンバ関数を使う
   cout << "Width of box : " << box.getWidth() <<endl;
 
   return 0;
}
上のコードをコンパイルし実行すると、次の結果が得られます。
Length of box : 10
Width of box : 10


protectedなメンバ

protectedなメンバ変数または関数はprivateなメンバと似ていますが、派生クラスと呼ばれる子クラスにアクセスできるという利点を備えています。派生クラスと継承については次の記事で学びます。次の例は親クラスBoxから子クラスSmallBoxを派生させています。
#include <iostream>
using namespace std;
 
class Box
{
   protected:
      double width;
};
 
class SmallBox:Box // SmallBoxは派生クラス
{
   public:
      void setSmallWidth( double wid );
      double getSmallWidth( void );
};
 
// 子クラスのメンバ関数
double SmallBox::getSmallWidth(void)
{
    return width;
}
 
void SmallBox::setSmallWidth( double wid )
{
    width = wid;
}
 
// Main()
int main()
{
   SmallBox box;
 
   // メンバ関数を使ってwidthをセット
   box.setSmallWidth(5.0);
   cout << "Width of box : "<< box.getSmallWidth() << endl;
 
   return 0;
}
上のコードをコンパイルし実行すると、次の結果が得られます。
Width of box : 5
  • ?±??G???g???[?d????u?b?N?}?[?N???A

0 件のコメント :

コメントを投稿