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

C++のprivateメンバーとprotectedメンバーの違いを徹底解説

C++のクラスには、public(公開)private(非公開)protected(保護)という3種類のアクセス指定子があり、それぞれ対応するクラスメンバーへのアクセスレベルを制御します。本記事では、特に混同されやすいprivateメンバーとprotectedメンバーの違いについて、サンプルコードを交えながら詳しく解説します。

privateメンバーとは

privateとして宣言されたデータメンバーは、クラスの外部から直接アクセスすることができません。アクセスできるのは、そのクラス自身のメンバー関数、あるいはfriend関数・friendクラスのみです。

また、アクセス指定子を明示しなかった場合、classで定義されたメンバーはすべてデフォルトでprivateになる点にも注意しましょう。

protectedメンバーとは

protectedメンバーはprivateメンバーとよく似た性質を持っていますが、決定的な違いが1つあります。それは、派生クラス(子クラス)からアクセスできるという点です。privateメンバーは派生クラスからもアクセスできませんが、protectedメンバーであれば継承関係にあるクラス内で自由に利用できます。

アクセス範囲の比較表

アクセス元publicprotectedprivate
同じクラス内
派生クラス内×
クラス外部××

privateとprotectedの動作を確認するサンプルコード

以下のプログラムは、クラスにおけるprivateメンバーとprotectedメンバーの挙動を示したものです。

コード例

#include <iostream>
using namespace std;
class Base {
    public :
    int a = 8;
    protected :
    int b = 10;
    private :
    int c = 20;
};
class Derived : public Base {
    public :
    void func() {
        cout << "The value of a : " << a;
        cout << "\nThe value of b : " << b;
    }
};
int main() {
    Derived obj;
    obj.func();
    return 0;
}

実行結果

The value of a : 8
The value of b : 10

プログラムの解説

それでは、上記プログラムの処理内容を順番に見ていきましょう。

1. 基底クラスBaseの定義

クラスBaseには、a、b、cという3つのデータメンバーが宣言されており、それぞれpublic、protected、privateとして指定されています。

class Base {
    public :
    int a = 8;
    protected :
    int b = 10;
    private :
    int c = 20;
};

2. 派生クラスDerivedの定義

クラスDerivedは、Baseをpublic継承しています。メンバー関数func()はaとbの値を出力しますが、cの値は出力できません。これは、cがクラスBaseのprivateメンバーであり、派生クラスであるDerivedからはアクセスできないためです。

class Derived : public Base {
    public :
    void func() {
        cout << "The value of a : " << a;
        cout << "\nThe value of b : " << b;
    }
};

もしfunc()内でcにアクセスするコードを追加すると、コンパイルエラーが発生します。この挙動こそが、privateとprotectedの本質的な違いです。

3. main関数でのオブジェクト生成と呼び出し

main()関数内では、クラスDerivedのオブジェクトobjを生成し、メンバー関数func()を呼び出しています。

int main() {
    Derived obj;
    obj.func();
    return 0;
}

まとめ

  • privateメンバー:クラス内部とfriendからのみアクセス可能。派生クラスからはアクセス不可。
  • protectedメンバー:クラス内部に加えて、派生クラスからもアクセス可能。
  • アクセス指定子を省略した場合、classのメンバーはデフォルトでprivateになる。

カプセル化を適切に行いつつ、継承先のクラスに必要なメンバーだけを開放したい場合はprotectedを使う、という使い分けがC++の設計において重要です。

  1. C++のフレンド関数とフレンドクラスの基本を解説

    C++におけるフレンド関数(friend function)とは、クラスのスコープ外で定義される関数でありながら、そのクラスのすべてのprivateメンバーおよびprotectedメンバーにアクセスする権限を持つ特別な関数です。フレンド関数のプロトタイプ(宣言)はクラス定義の中に記述しますが、あくまで「友達」として扱われるだけであり、クラスのメンバー関数にはなりません。この点は重要なポイントです。フレンドとして指定できるものフレンドとして宣言できるのは、以下のようなものです。通常の関数関数テンプレート他のクラスのメンバー関数クラス全体(この場合、そのクラスのすべてのメンバーがフレンドになります

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

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