アクセス修飾子(またはアクセス指定子)は、オブジェクト指向言語の予約語であり、クラス、メソッド、およびその他のメンバーのアクセス可能性を設定します。アクセス修飾子は、コンポーネントのカプセル化を容易にするために使用されるプログラミング言語構文の特定の部分です。[ 1 ]
C++では、アクセス修飾子は 3 つしかありません。C #ではその数が 6 つに拡張されていますが、 [ 2 ] Javaではアクセス修飾子は 4 つですが、この目的のために 3 つのキーワードがあります。Java では、キーワードが前にない場合、デフォルトで package-private 修飾子が使用されます。
クラスが public として宣言されている場合、同じパッケージで定義されている他のクラスだけでなく、他のパッケージで定義されているクラスからもアクセスできます。これはクラスで最も一般的に使用される指定子です。ただし、クラス自体を private として宣言することはできません。アクセス指定子が指定されていない場合、デフォルトのアクセス制限が適用されます。クラスは同じパッケージ内の他のクラスからはアクセスできますが、パッケージ外のクラスからはアクセスできません。クラスにアクセスできないとは、そのクラスのオブジェクトを作成したり、そのクラス型の変数を宣言したりできないことを意味します。protected アクセス指定子もクラスには適用できません。
![]()
publicC++ では、protected、 、 と呼ばれる 3 つの修飾子を使用しますprivate。[ 3 ] C#publicには、protected、 、internal、private、protected internal、private protected、 という修飾子がありますfile。[ 4 ] Javaにはpublic、package、 、protected、private、packageがあります。 は、他のアクセス修飾子キーワードが指定されていない場合に使用されるデフォルトです。これらの修飾子の意味は、言語によって異なる場合があります。最も制限の厳しいものから最も寛容なものへと順に並べたキーワードと、これら 3 つの言語におけるそれらの意味の比較を以下に示します。それらの可視性は、同じクラスからクラスが定義されているパッケージ、一般的なアクセス権限まで多岐にわたります。以下に、最大のアクセスを表に書き込んでいます。
Swiftでは、エンティティが定義されているソースファイルと、そのソースファイルを含むモジュールの両方に対して、5つの異なるアクセスレベルがあります。[ 5 ]
import std ;// 構造体内のデフォルトのアクセス修飾子は public // クラス内のデフォルトのアクセス修飾子は private struct Base { private : int x ; protected : // Base::m、Base::n は protected int m ; int n ; public : void set_n ( int v ) noexcept { n = v ; }void f () { std :: println ( "Calling Base::f()" ); } }; // Derived は、パブリック継承で Base を拡張しますstruct Derived : public Base { private : using Base :: f ; // Derived::f はプライベートですpublic : using Base :: m ; // Derived::m はパブリックです// Base::n はここからアクセスできますが、[[ nodiscard ]]の外からはアクセスできません int get_n () const noexcept { return n ; }// エラー、Base::x はここではアクセスできません// int get_x() const noexcept { // return x; // } }; int main ( int argc , char * argv []) { Derived d ;// dx = 2; // エラー、プライベート// dn = 2; // エラー、保護されたd . m = 2 ; // protected Base::m は Derived::m としてアクセス可能ですd.set_n ( 2 ) ; // Base::set_n(int) を呼び出すstd :: println ( " {}" , d.get_n ( ) ); // 出力: 2// df(); // エラー、Base::f は Derived::f としてアクセスできませんBase & b = d ; // b は d を参照し、それを Base 型として「見る」// bx = 3; // エラー、プライベート// bn = 3; // エラー、保護されています// bm = 3; // エラー、Base::m は保護されていますb.set_n ( 3 ); // Base::set_n(int) を呼び出します// std::println("{}", b.get_n()); // エラー、'struct Base'には 'get_n' という名前のメンバがありませんb.f (); // Base::f()を呼び出すreturn 0 ; }