Модификаторы доступа (или спецификаторы доступа ) — это ключевые слова в объектно-ориентированных языках , которые устанавливают доступность классов , методов и других членов. Модификаторы доступа — это особая часть синтаксиса языка программирования, используемая для облегчения инкапсуляции компонентов. [1]
В C++ есть только три модификатора доступа. C# расширяет их число до шести, [2] в то время как в Java есть четыре модификатора доступа, но для этой цели есть три ключевых слова. В Java отсутствие ключевого слова перед модификатором по умолчанию означает модификатор package-private.
Когда класс объявлен как открытый, он доступен другим классам, определенным в том же пакете, а также определенным в других пакетах. Это наиболее часто используемый спецификатор для классов. Однако сам класс не может быть объявлен как закрытый. Если спецификатор доступа не указан, будут применены ограничения доступа по умолчанию. Класс будет доступен другим классам в том же пакете, но будет недоступен классам за пределами пакета. Когда мы говорим, что класс недоступен, это просто означает, что мы не можем создать объект этого класса или объявить переменную этого типа класса. Спецификатор доступа protected также не может быть применен к классу.
C++ использует три модификатора, называемые public
, protected
, и private
. [3] В C# есть модификаторы public
, protected
, internal
, private
, protected internal
, private protected
и file
. [4] В Java есть public
, package
, protected
, и private
; package
по умолчанию, используется, если не указано другое ключевое слово модификатора доступа. Значение этих модификаторов может отличаться в разных языках. Ниже приведено сравнение ключевых слов, упорядоченных от самых ограничивающих к самым открытым, и их значение в этих трех языках. Их видимость варьируется от одного и того же класса до пакета, в котором класс определен, и до общего разрешения на доступ. Ниже в таблице указан максимальный доступ.
В Swift существует пять различных уровней доступа как к исходному файлу, в котором определена сущность, так и к модулю, содержащему этот исходный файл. [5]
#include <iostream> #include <conio.h> с использованием std :: cout ; с использованием std :: endl ; struct B { // модификатор доступа по умолчанию внутри структуры public void set_n ( int v ) { n = v ; } void f () { cout << "B::f" << endl ; } protected : int m , n ; // B::m, B::n защищены private : int x ; }; struct D : B { using B :: m ; // D::m является public int get_n () { return n ; } // B::n доступен здесь, но не снаружи // int get_x() { return x; } // ОШИБКА, B::x здесь недоступен private : using B :: f ; // D::f является private }; int main () { D d ; // dx = 2; // ОШИБКА, закрыто // dn = 2; // ОШИБКА, защищено d . m = 2 ; // защищено B::m доступно как D::m d.set_n ( 2 ); // вызывает B::set_n ( int) cout << d.get_n ( ) << endl ; // вывод: 2 // df(); // ОШИБКА, B::f недоступен как D::f B & b = d ; // b ссылается на d и «рассматривает» его как тип B // bx = 3; // ОШИБКА, закрыто // bn = 3; // ОШИБКА, защищено // bm = 3; // ОШИБКА, B::m защищен b . set_n ( 3 ); // вызывает B::set_n(int) // cout << b. get_n(); // ОШИБКА, 'struct B' не имеет члена с именем 'get_n' b . f (); // вызывает B::f() возвращает 0 ; }