C ++アクセス指定子

C Access Specifiers



C ++では、クラスは、連携して動作するように構成された変数と関数のセットです。クラスの変数に値が与えられると、オブジェクトが取得されます。オブジェクトにはクラスと同じ変数と関数がありますが、今回は変数に値があります。 1つのクラスから多くのオブジェクトを作成できます。 1つのオブジェクトは、他のオブジェクトの変数に割り当てられた値のセットが異なるため、別のオブジェクトとは異なります。クラスからオブジェクトを作成することは、オブジェクトをインスタンス化すると言われています。 2つの異なるオブジェクトの変数の値が同じであっても、これらのオブジェクトは異なるエンティティであり、プログラム内で異なる名前で識別されます。オブジェクトとそれに対応するクラスの変数は、データメンバーと呼ばれます。オブジェクトとそれに対応するクラスの関数は、メンバー関数と呼ばれます。データメンバーとメンバー関数はメンバーと呼ばれます。

アクセスという言葉は、変数の値を読み取ったり変更したりすることを意味し、関数を使用することも意味します。 C ++アクセス指定子は、private、protected、およびpublicという単語です。メンバーがそのクラスの他のメンバーにアクセスできるかどうか、またはクラス外でクラスに属していない関数または演算子がクラスの任意のメンバーにアクセスできるかどうかを決定します。また、派生(子)クラスのメンバーが親クラスのメンバーにアクセスできるかどうかも決定します。







この記事を理解し、提供されたコードをテストするには、C ++の基本的な知識が必要です。



記事の内容

パブリックおよびプライベート指定子

クラス
クラスのすべてのメンバーは、パブリックまたはプライベートのラベルが付いているかどうかに関係なく、同じクラスの他のメンバーにアクセスできます。次のプログラムを検討してください。



#含む
を使用して 名前空間時間;

クラスTheCla
{{
プライベート
intnum1;
intnum2;
公衆
TheCla((intn1、intn2)。
{{
num1=n1;num2=n2;
}
int方法(()。
{{
戻るnum1;
}
};

int主要(()。
{{
TheCla obj((1020)。;
intno2=obj。方法(()。;
費用<<no2<<'NS';

// int no1 = obj.num1;

戻る 0;
}

出力は10です。プライベートメンバーはnum1とnum2です。パブリックメンバーはTheCla()とmethod()です。 TheCla()は、対象の変数を初期化するコンストラクター関数であることに注意してください。アクセス指定子の領域は、そのラベルからクラス記述の終わり(定義)まで、または別のアクセス指定子の始まりまで始まります。





main()関数の最初のステートメントは、num1とnum2を初期化するコンストラクター関数を含むインスタンス化です。次のステートメントは、クラスのパブリックメンバーであるmethod()を呼び出します。

これで、クラスの説明(定義)で、パブリックメンバー関数TheCla()がプライベートメンバーnum1とnum2にアクセスします。また、パブリックメンバー関数method()は、プライベートメンバーnum1にアクセスします。クラス記述内のすべてのメンバーは、同じクラス記述内の他のメンバーにアクセスできます。どのメンバーがプライベートかパブリックかは関係ありません。



ただし、クラスの説明で宣言されておらず、クラスの説明の外で宣言されていない関数または演算子は、クラスのパブリックメンバーにのみアクセスできます。たとえば、main()関数は、クラス記述の外部で宣言された関数です。 method()およびTheCla()パブリックメンバーにのみアクセスできました。 main()関数内では、TheCla()関数はobj(10、20)です。

main()関数などの外部関数または外部演算子は、num1やnum2などのクラスのプライベートメンバーにはアクセスできません。 main()の最後の1つのステートメントからコメントインジケーター//を削除します。プログラムをコンパイルしようとすると、プログラムがコンパイルされず、エラーメッセージが表示されることに注意してください。

デフォルト指定子
クラスのデフォルトの指定子はprivateです。したがって、上記のクラスの説明は次の説明と同じですが、privateですが、指定子はありません。

クラスTheCla
{{
intnum1;
intnum2;
公衆
TheCla((intn1、intn2)。
{{
num1=n1;num2=n2;
}
int方法(()。
{{
戻るnum1;
}
};

ノート :アクセス指定子ラベルは指定子で始まり、その後にコロンが続きます。

保護された指定子

クラス記述内で、外部関数または外部演算子から、保護された指定子はプライベート指定子と同じです。ここで、上記のプログラムのプライベート指定子を指定子に置き換え、保護し、main()関数の最後の1つのステートメントからコメントインジケーター//を削除します。プログラムをコンパイルしようとすると、プログラムがコンパイルされず、エラーメッセージが表示されることに注意してください。

保護された指定子の問題は、派生(継承)クラスのメンバーが基本(親)クラスのメンバーにアクセスする必要がある場合に発生します。

パブリック派生クラス パブリックメンバーと
次のプログラムを検討してください。

#含む
を使用して 名前空間時間;

クラスTheCla
{{
公衆
intnum1= 10;
保護された
intnum2= 20;
プライベート
intnum3= 30;
};

クラスChildCla 公衆TheCla
{{
公衆
intmethod1(()。
{{
戻るnum1;
}
int方法2(()。
{{
戻るnum2;
}
/ * int method3()
{{
num3を返します。
} * /

};

int主要(()。
{{
ChildCla childObj;
intno1=childObj。method1(()。;
費用<<no1<<'NS';

intno2=childObj。方法2(()。;
費用<<no2<<'NS';

戻る 0;
}

出力は
10
20

基本クラスでは、num1はパブリック、num2は保護され、num3はプライベートです。派生クラスでは、すべてのメンバー関数がパブリックです。最初の関数method1()は、パブリックデータメンバーnum1にアクセスします。 2番目の関数method2()は、保護されたデータメンバーnum2にアクセスします。 3番目の関数method3()は、現在コメントアウトされていますが、プライベートデータメンバーnum3にアクセスする必要があります。

派生クラスは、アクセス指定子(public、protected、またはprivate)なしでは宣言されません。上記では、派生クラスはパブリック指定子で宣言されています。

クラスChildCla 公衆TheCla{{}

次に、派生クラスの3番目のメンバー関数定義のコメントを解除します。プログラムをコンパイルしようとすると、コンパイルされず、エラーメッセージが表示されることに注意してください。

ノート :派生クラス全体がパブリックとして宣言されている場合、そのメンバーは基本クラスのプライベートメンバーにアクセスできません。ただし、そのメンバーは、基本クラスのパブリックメンバーと保護されたメンバーにアクセスできます。上記のプログラムはこれを示しています。

ただし、パブリック派生クラスのパブリックメンバーは、基本クラスの保護されたメンバーにアクセスできることに注意してください。

派生クラス指定子とメンバー指定子

パブリックメンバーによる保護された派生クラス
次のように、上記の派生クラスの宣言でpublicspecifierをprotectedに置き換えます。

クラスChildCla 保護されたTheCla{{}

プログラムをコンパイルして実行し、結果が以前と同じであることに注意してください。

したがって、派生クラス全体が保護されていると宣言されると、そのメンバーは基本クラスのプライベートメンバーにアクセスできなくなります。ただし、そのメンバーは、基本クラスのパブリックメンバーと保護されたメンバーにアクセスできます。これは、派生クラスがパブリックとして宣言されている場合と同じです。

ノート :パブリック派生クラスの保護されたメンバーは、基本クラスの保護されたメンバーにアクセスできます。

パブリックメンバーによるプライベート派生クラス
次のように、上記の派生クラスの宣言で保護された指定子をprivateに置き換えます。

クラスChildCla プライベートTheCla{{}

プログラムをコンパイルして実行し、結果が以前と同じであることに注意してください。

したがって、派生クラス全体がプライベートとして宣言されている場合、そのメンバーは基本クラスのプライベートメンバーにアクセスできません。ただし、そのメンバーは、基本クラスのパブリックメンバーと保護されたメンバーにアクセスできます。これは、派生クラスが保護またはパブリックとして宣言されている場合と同じです。

保護されたメンバーによるパブリック派生クラス
次のプログラムを入力、コンパイル、および実行します。このプログラムでは、派生クラス全体が保護され、そのメンバーも保護されています。一部のコードセグメントは次のとおりです。

#含む
を使用して 名前空間時間;

クラスTheCla
{{
公衆
intnum1= 10;
保護された
intnum2= 20;
プライベート
intnum3= 30;
};

クラスChildCla 公衆TheCla
{{
保護された
intmethod1(()。
{{
戻るnum1;
}
int方法2(()。
{{
戻るnum2;
}
/ * int method3()
{{
num3を返します。
} * /

};

int主要(()。
{{
/ * ChildCla childObj;
int no1 = childObj.method1();
費用<
/ * int no2 = childObj.method2();
費用<
戻る 0;
}

プログラムはそのまま動作します。プログラムの入力方法に基づいて、出力はなく、出力もありません。

ここで、派生クラスの関数定義method3()のコメントを解除します。プログラムをコンパイルしようとすると、コンパイルされず、エラーメッセージが表示されることに注意してください。これは、外部関数、外部演算子、または派生クラスからプライベートメンバーにアクセスできないことを意味します。これは、個人会員へのアクセスに関して、上記で結論付けられたのと同じ結論です。

ノート :保護された派生クラスの保護されたメンバーは、基本クラスの保護されたメンバーにアクセスできます。

ここで、コメントを派生クラスに戻し、main()関数の最初のコードセグメントのコメントを解除します。プログラムをコンパイルしようとすると、main()関数の最初のコードセグメントのためにプログラムがコンパイルされないことに注意してください。この効果は新しいものではありません。派生クラス、外部関数、および外部演算子を除いて、(基本または派生)クラスの保護されたメンバーとプライベートメンバーは同じ指定子privateです。 main()関数は、ベースか派生かに関係なく、同じ指定子privateとして、任意のクラスの保護されたメンバーを認識し、それにアクセスすることを禁じられています。

main()関数の2番目のコードセグメントがコメント化されていない場合、同じ説明が適用されます。つまり、main()関数は、派生クラスまたは基本クラスの保護されたメンバーまたはプライベートメンバーにアクセスできません。これは、派生クラスの保護されたメンバーが基本クラスの保護されたメンバーにアクセスできるかどうかとは無関係です。

保護されたメンバーを持つ保護された派生クラス
次のように、上記の派生クラスの宣言でpublicspecifierをprotectedに置き換えます。

クラスChildCla 保護されたTheCla{{}

コードセグメントのコメントがまだ行われていない場合は、main()関数に戻します。プログラムをコンパイルして実行し、結果が以前と同じであることに注意してください。

保護されたメンバーによるプライベート派生クラス
次のように、上記の派生クラスの宣言で保護された指定子をprivateに置き換えます。

クラスChildCla プライベートTheCla

プログラムをコンパイルして実行すると、結果は以前と同じになることに注意してください。

プライベートメンバーによるパブリック派生クラス
上記の派生クラスの宣言で、次のようにプライベート指定子をパブリックに置き換えます。

クラスChildCla 公衆TheCla{{}

派生クラスのメンバーをプライベートにします。プログラムをコンパイルして実行します。結果は、保護されたメンバーを持つパブリック派生クラスの場合と同じです。

プライベートメンバーによる保護された派生クラス
次のように、上記の派生クラスの宣言でpublicspecifierをprotectedに置き換えます。

クラスChildCla 保護されたTheCla{{}

プログラムをコンパイルして実行します。この結果は、保護されたメンバーを持つ保護された派生クラスの場合と同じです。

プライベートメンバーによるプライベート派生クラス
次のように、上記の派生クラスの宣言で保護された指定子をprivateに置き換えます。

クラスChildCla プライベートTheCla{{}

プログラムをコンパイルして実行します。この結果は、保護されたメンバーを持つプライベート派生クラスの場合と同じです。

結論

C ++アクセス指定子は、private、protected、およびpublicという単語です。彼らはクラスのメンバーのアクセスを決定します。アクセス指定子の領域は、そのラベルから始まり、クラス記述(定義)の終わり、または別のアクセス指定子の始まりまでです。クラスのすべてのメンバーは、同じクラスの他のメンバーにアクセスできます。クラスのプライベートメンバーには、外部関数、外部演算子、または派生クラスからアクセスすることはできません。

基本クラスのメンバーは、派生クラスのメンバーが基本クラスのプライベートメンバーにアクセスできるように、保護する必要があります。基本クラスのこの保護されたメンバーは、外部関数または外部オペレーターによって基本クラスのプライベートメンバーと見なされます。

クラスのパブリックメンバーには、任意の外部関数、任意の外部演算子、または派生クラスからアクセスできます。

クラスにアクセス指定子がない場合は、プライベート指定子が想定されます。つまり、デフォルトのアクセス指定子はプライベートです。

この作品で使用される参照