C++の基礎: クラスのアクセス指定子を学ぶ
概要
オブジェクト指向プログラミングとは、データ(オブジェクトの属性やプロパティ)やコードブロック(オブジェクトのメソッドや関数)を含むオブジェクトを統合する方法です。これらの属性やメソッドは、クラスに属する変数や関数であり、一般的には「クラスメンバ」と呼ばれています。
例えば、あるクラスがあって、そのクラスは整数、浮動小数点数、文字列のメンバ変数、そしていくつかのクラスメソッドを持っているとします。もしこのクラス内のメンバを可視化、あるいは隠蔽するにはどうすればよいのでしょうか?アクセス指定子は、このような状況で使用されるステートメントです。
アクセス指定子は、クラスの重要な部分の一つで、属性(プロパティ)やメソッド(関数)を定義する前に使用します。アクセス指定子は、クラスのメンバ(属性やメソッド)にアクセスする方法を定義するために使用されます。これらのアクセス指定子の後に記載されているすべての属性とメソッドは、同じアクセスのスコープを持っています。したがって、クラスのメンバをpublicメンバ、privateメンバ、protectedメンバとして定義することができます。
C++では、ほとんどの場合、クラスには3つのアクセス指定子があります。
- public: クラスのメンバーはクラス外からアクセス可能
- private: クラスのメンバーは、クラスの外からはアクセス(閲覧)できず、クラス内で使用されるか、そのクラスのメソッドによってのみ使用されます。
- protected: クラスの外からはアクセスできません。しかし、継承されたクラスではアクセスすることができます。
これらに加えて、以下のような特定のアクセス指定子があります。
- __published: C++Builderでは、クラスがコンポーネントパレットにある場合、そのセクションのメンバーがオブジェクトインスペクタに表示されることを指定します。TObjectから派生したクラスのみが __publishedセクションを持つことができます。
以下はpublic、private、protectedの各セクションを持つ一般的なクラスのコード例です。
class classname
{
public:
// public members. attributes, methods
private:
// private members. attributes, methods
protected:
// protected members. attributes, methods
};
アクセス指定子を使用しないとどうなりますか? アクセス指定子なしでクラスを作成できますか? 答えは「はい」です。アクセス指定子の使用は必須ではありませんが、その場合クラスのすべてのメンバはprivateのスコープになることを知っておく必要があります。
class classname
{
int i, j;
float f, g;
std::string name;
};
ここでは、すべてのメンバ i、j、f、g、nameのスコープはprivateになります。
例えば、人間を表すTHumanクラスを定義します。名前(name)は公開し、年齢(age)と体重(weight)は非公開にしたいとします。
class THuman
{
public:
std:string name;
private:
int age;
int weight;
};
また以下のようにクラスの外部からアクセスできないprotectedメンバを追加することもできます。ただし、継承したクラスではアクセス可能です。
class THuman
{
public:
std:string name;
private:
int age;
int weight;
protected:
int salary;
};
しかし、同じクラス内のpublicメソッドを使用して、そのクラスのprivateメンバにアクセスすることができます。これは「カプセル化」と呼ばれるもので、カプセル化についてはC++の基礎:カプセル化について学ぶの記事を参照読ください。また自分のクラスの属性はできるだけprivateに宣言してください。これにより、他の人からあなたのコードやメンバの値を変更される可能性を減らすことができます。これもカプセル化を使用する上でのメリットの1つです。