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

C++におけるprivateとprotectedの違いを徹底解説

本記事では、C++における2つのアクセス修飾子「private」と「protected」の違いについて、具体例を交えながらわかりやすく解説します。

privateアクセス修飾子とは

  • 「private」キーワードとコロン「:」を使って宣言します。
  • クラスの外部からは一切アクセスできません。
  • privateは、そのメンバが宣言されたクラス内部のメンバからのみアクセスを許可するアクセス修飾子です。
  • privateとして宣言されたデータにアクセスできるのは、メンバ関数またはfriend(フレンド)関数だけです。

privateのサンプルコード

#include <iostream>
using namespace std;
class base_class{
    private:
    string my_name;
    int my_age;
    public:
    void getName(){
        cout << "Enter the name... ";
        cin >> my_name;
        cout << "Enter the age... ";
        cin >> my_age;
    }
    void printIt(){
        cout << "The name is : " << my_name << endl;
        cout << "The age is: " << my_age << endl;
    }
};
int main(){
    cout<<"An object of class is created"<< endl;
    base_class my_instance;
    my_instance.getName();
    my_instance.printIt();
    return 0;
}

実行結果

An object of class is created
Enter the name... Jane
Enter the age... 34
The name is : Jane
The age is: 34

この例では、my_namemy_ageはprivateメンバとして宣言されているため、外部から直接操作することはできず、publicメンバ関数であるgetName()printIt()を経由してのみ値の入出力が行われます。

protectedアクセス修飾子とは

  • privateとよく似た性質を持つアクセス修飾子です。
  • 「protected」キーワードとコロン「:」を使って宣言します。
  • protectedとして宣言されたクラスメンバは、クラスの外部からはアクセスできません。
  • 宣言されたクラス内部では自由にアクセスできます。
  • さらに、そのクラスを継承した派生クラス(サブクラス)からもアクセス可能です。
  • 主に継承(インヘリタンス)を扱う場面で活用されます。

protectedのサンプルコード

#include <iostream>
using namespace std;
class base_class{
    private:
    string my_name;
    int my_age;
    protected:
    int my_salary;
    public:
    void getName(){
        cout << "Enter the name... ";
        cin >> my_name;
        cout << "Enter the age... ";
        cin >> my_age;
    }
    void printIt(){
        cout << "The name is : " << my_name << endl;
        cout << "The age is: " << my_age << endl;
    }
};
class derived_class : public base_class{
    private:
    string my_city;
    public:
    void set_salary(int val){
        my_salary = val;
    }
    void get_data_1(){
        getName();
        cout << "Enter the city... ";
        cin >> my_city;
    }
    void print_it_1(){
        cout << "The salary is: " << my_salary << endl;
        printIt();
        cout << "The city is: " << my_city << endl;
    }
};
int main(){
    cout<<"Instance of derived class is being created.."<<endl;
    derived_class my_instance_2 ;
    my_instance_2.set_salary(100);
    my_instance_2.get_data_1();
    my_instance_2.print_it_1();
    return 0;
}

実行結果

Instance of derived class is being created..
Enter the name... Jane
Enter the age... 23
Enter the city... NewYork
The salary is: 100
The name is : Jane
The age is: 23
The city is: NewYork

この例では、my_salaryは基底クラスでprotectedとして宣言されています。そのため、派生クラスderived_classのメンバ関数set_salary()から直接アクセスして値を設定できる一方、クラス外部からはアクセスできない点に注目してください。

privateとprotectedの違いまとめ

項目privateprotected
クラス内部からのアクセス可能可能
派生クラスからのアクセス不可可能
クラス外部からのアクセス不可不可
主な用途データの完全な隠蔽(カプセル化)継承関係でのメンバ共有

このように、privateとprotectedの最大の違いは「派生クラスからアクセスできるかどうか」という点にあります。外部に公開したくないが、継承先のクラスでは使いたいメンバにはprotectedを、完全に隠蔽したいメンバにはprivateを使用するのがC++の設計における基本方針です。

  1. C++におけるドット演算子(.)とアロー演算子(->)の違いを徹底解説

    C++では、ドット演算子(.)とアロー演算子(->)はどちらもクラスのメンバーにアクセスするために使用されますが、それぞれ使用される場面が異なります。C++において、class、struct、unionとして宣言された型はすべて「クラスタイプ」とみなされるため、以下の説明はこれら3つすべてに当てはまります。基本的な使い分けa.b は、b がオブジェクト a(またはオブジェクトへの参照[1])のメンバーである場合にのみ使用できます。つまり、a.b の形式では、a は常にクラスの実際のオブジェクト(またはその参照)でなければなりません。a->b は、本質的に (*a).b の省略記法で

  2. C#におけるクラスと構造体の違いを徹底解説

    C#におけるクラスと構造体の基本的な違い クラス(Class)と構造体(Struct)を正しく使い分けるためには、まず両者が「データの定義と保持」という点において、ほぼ同等の役割を果たすことを理解しておく必要があります。どちらもデータメンバーを定義し、既定値を保持することが可能です。しかしそれ以外の側面、たとえばメモリ管理や継承といった機能面で比較すると、クラスの方が構造体よりも柔軟性が高く、より多くの機能を提供しています。 以下の表に、クラスと構造体の重要な違いを6つの観点からまとめました。 番号項目クラス構造体 1データ型クラスで定義されたデータは、メモリ上に参照として格納され、ア