C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のアクセス修飾子とは?public・private・protectedの違いと使い方を実例で解説

アクセス修飾子(Access Modifier)は、オブジェクト指向プログラミングにおける「データ隠蔽(カプセル化)」を実現するための重要な仕組みです。クラスの外部からメンバ変数やメンバ関数への不正なアクセスを防ぎ、プログラムの安全性と保守性を高めます。

C++には主に次の3種類のアクセス修飾子が用意されています。

  • public:どこからでもアクセス可能
  • private:同じクラス内(およびフレンド)からのみアクセス可能
  • protected:クラス内と派生クラスからアクセス可能

以下、それぞれの特徴と具体的なコード例を見ていきましょう。

1. publicアクセス修飾子

publicとして宣言されたメンバ変数やメンバ関数は、他のクラスを含むすべてのコードからアクセスできます。プログラム内の任意の場所から、クラスのオブジェクトに対してドット演算子(.)を使って直接呼び出すことが可能です。

サンプルコード

#include<iostream>
using namespace std;
class Add {
    public:
    int a, b;
    void sum() {
        cout<<"Sum of "<< a <<" and "<< b <<" is "<<a+b;
    }
};
int main() {
    Add obj;
    obj.a = 2;
    obj.b = 5;
    obj.sum();
    return 0;
}

実行結果

Sum of 2 and 5 is 7

このプログラムでは、クラスAddに2つのpublicなメンバ変数ab、およびその合計を表示するメンバ関数sum()が定義されています。

class Add {
    public:
    int a, b;
    void sum() {
        cout<<"Sum of "<< a <<" and "<< b <<" is "<<a+b;
    }
};

main()関数内でクラスAddのオブジェクトを生成した後、abに直接値を代入しています。これらがpublicメンバであるため、クラス外からのアクセスが許可されているのです。最後にsum()を呼び出して合計を表示します。

Add obj;
obj.a = 2;
obj.b = 5;

obj.sum();

2. privateアクセス修飾子

privateとして宣言されたメンバ変数は、そのクラス内部のメンバ関数からのみアクセスでき、クラス外の関数からは一切アクセスできません。ただし、例外的にフレンド関数(friend関数)はprivateメンバにアクセスすることが許されています。

privateメンバの値を設定・取得したい場合は、publicなメンバ関数(セッター/ゲッター)を経由するのが一般的です。

サンプルコード

#include<iostream>
using namespace std;
class Add {
    private:
    int a, b;
    public:
    void setdata(int x, int y) {
        a = x;
        b = y;
    }
    void sum() {
        cout<<"Sum of "<< a <<" and "<< b <<" is "<<a+b;
    }
};
int main() {
    Add obj;
    obj.setdata(9,5);
    obj.sum();
    return 0;
}

実行結果

Sum of 9 and 5 is 14

このプログラムでは、クラスAddのメンバ変数abがprivateとして宣言されています。そのため、値の設定はpublicなメンバ関数setdata()を通じて行われます。

class Add {
    private:
    int a, b;
    public:
    void setdata(int x, int y) {
        a = x;
        b = y;
    }
    void sum() {
        cout<<"Sum of "<< a <<" and "<< b <<" is "<<a+b;
    }
};

main()関数内では、まずクラスAddのオブジェクトを生成し、setdata()を呼び出してprivateメンバに値を代入します。もしobj.a = 9;のように直接代入しようとするとコンパイルエラーになる点に注意してください。最後にsum()で合計を表示します。

Add obj;
obj.setdata(9,5);
obj.sum();

3. protectedアクセス修飾子

protectedとして宣言されたメンバは、privateとほぼ同様にクラス外からは直接アクセスできません。しかし、基底クラス(親クラス)を継承した派生クラス(子クラス)からはアクセスできるという点が大きな違いです。継承関係にあるクラス間でデータを共有しつつ、外部への公開は避けたい場合に活用されます。

サンプルコード

#include<iostream>
using namespace std;
class Parent {
    protected:
    int a, b;
};
class Child: public Parent {
    public:
    void getdata(int x, int y) {
        a=x;
        b=y;
    }
    void putdata() {
        cout<<"a = "<<a<<endl;
        cout<<"b = "<<b<<endl;
    }
};
int main() {
    Child obj;
    obj.getdata(9,1);
    obj.putdata();
    return 0;
}

実行結果

a = 9
b = 1

このプログラムでは、親クラスParentに2つのprotectedなメンバ変数abが宣言されています。

class Parent {
    protected:
    int a, b;
};

子クラスChildParentをpublic継承しており、値を設定するgetdata()と表示するputdata()という2つのメンバ関数を持っています。これらの関数がabにアクセスできるのは、両変数がprotectedであり、ChildParentの派生クラスだからです。

class Child: public Parent {
    public:
    void getdata(int x, int y) {
        a = x;
        b = y;
    }
    void putdata() {
        cout<<"a = "<<a<<endl;
        cout<<"b = "<<b<<endl;
    }
};

main()関数内では、Childクラスのオブジェクトobjを生成し、getdata()putdata()を順に呼び出しています。

Child obj;
obj.getdata(9,1);
obj.putdata();

3つのアクセス修飾子の比較まとめ

アクセス修飾子同一クラス内派生クラスクラス外
public
protected×
private××

このように、アクセス範囲の広さは「public > protected > private」の順になります。デフォルト(何も指定しない場合)では、classのメンバはprivate、structのメンバはpublicとして扱われる点も覚えておくと良いでしょう。

適切なアクセス修飾子を選択することで、意図しない操作からデータを守り、堅牢で保守しやすいC++プログラムを書くことができます。

  1. C++のアクセス修飾子とは?public・private・protectedの違いをわかりやすく解説

    データ隠蔽(Data Hiding)は、オブジェクト指向プログラミング(OOP)における重要な機能の一つです。これにより、プログラム内の関数がクラス型の内部表現に直接アクセスすることを防ぎ、クラスの内部構造を保護できます。 クラスメンバーへのアクセス制限は、クラス本体内で指定する「アクセス修飾子」と呼ばれるラベル、すなわち public、private、protected の3つのセクションによって制御されます。 デフォルトのアクセスレベル C++では、クラスのメンバーおよびクラス自体のデフォルトのアクセスレベルは private です。アクセス修飾子を明示しない場合、メンバーは自動的に非公開

  2. C#のアクセス修飾子とは?5つの種類と使い方を徹底解説

    アクセス修飾子とはアクセス修飾子(Access Modifier)は、C#において変数や関数(メソッド)といったメンバーへのアクセス範囲(スコープ)を指定するためのキーワードです。適切なアクセス修飾子を選ぶことで、クラスのカプセル化を実現し、安全性と保守性の高いコードを書くことができます。C#で利用できる主なアクセス修飾子は以下のとおりです。publicpublic修飾子を付けたメンバーには、アクセスに関する制限が一切ありません。同じアセンブリ内はもちろん、外部のアセンブリからも自由にアクセスできます。protectedprotected修飾子を付けたメンバーへのアクセスは、そのクラス自身、お