Слово «доступ» означает чтение или изменение значения переменной, а также использование функции. Спецификаторы доступа C ++ - это слова «частный», «защищенный» и «общедоступный».Они решают, может ли член получить доступ к другим членам своего класса, или функция или оператор вне класса и не принадлежащие классу могут получить доступ к любому члену класса. Они также решают, может ли член производного (дочернего) класса получить доступ к члену родительского класса.
Для понимания этой статьи и тестирования предоставленного кода необходимы базовые знания C ++.
Содержание статьи
- Публичные и частные спецификаторы
- Защищенный спецификатор
- Спецификаторы производного класса и спецификаторы членов
- Заключение
Публичные и частные спецификаторы
Класс
Любой член класса может получить доступ к любому другому члену того же класса, независимо от того, что помечено как «общедоступный» или «частный».”Рассмотрим следующую программу:
используя пространство имен std;
класс TheCla
частный:
int num1;
int num2;
общественность:
TheCla (интервал n1, интервал n2)
num1 = n1; num2 = n2;
метод int ()
return num1;
;
int main ()
TheCla obj (10, 20);
int no2 = obj.метод ();
cout<
возврат 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 (). Если вы попытаетесь скомпилировать программу, обратите внимание, что программа не будет компилироваться и выдает сообщение об ошибке.
Спецификатор по умолчанию
Спецификатор по умолчанию для класса - «частный».Итак, приведенное выше описание класса такое же, как следующее описание, частное, но без спецификатора:
int num1;
int num2;
общественность:
TheCla (интервал n1, интервал n2)
num1 = n1; num2 = n2;
метод int ()
return num1;
;
Примечание: метка спецификатора доступа начинается со спецификатора, за которым следует двоеточие.
Защищенный спецификатор
В описании класса и из внешней функции или внешнего оператора защищенный спецификатор такой же, как и частный спецификатор. Теперь замените частный спецификатор в приведенной выше программе спецификатором, protect и удалите индикатор комментария, //, из предпоследнего оператора в функции main (). Если вы попытаетесь скомпилировать программу, обратите внимание, что программа не будет компилироваться и выдает сообщение об ошибке.
Проблема защищенного спецификатора возникает, когда члены производного (унаследованного) класса должны иметь доступ к членам базового (родительского) класса.
Открытый производный класс с публичными членами
Рассмотрим следующую программу:
используя пространство имен std;
класс TheCla
общественность:
int num1 = 10;
защищено:
int num2 = 20;
частный:
int num3 = 30;
;
класс ChildCla: общедоступный TheCla
общественность:
int метод1 ()
return num1;
int метод2 ()
return num2;
/ * int method3 ()
return num3;
* /
;
int main ()
ChildCla childObj;
int no1 = childObj.method1 ();
cout<
cout<
Результат:
10
20
В базовом классе num1 является общедоступным, num2 защищенным, а num3 закрытым. В производном классе все функции-члены являются общедоступными. Первая функция, method1 (), обращается к публичному элементу данных num1. Вторая функция, method2 (), обращается к защищенному элементу данных num2. Третья функция, method3 (), хотя в настоящее время закомментирована, должна иметь доступ к закрытому элементу данных num3.
Производный класс не объявляется без спецификатора доступа (общедоступный, защищенный или частный). Выше производный класс объявлен со спецификатором public, то есть:
class ChildCla: public TheClaТеперь не комментируйте определение третьей функции-члена в производном классе. Если вы попытаетесь скомпилировать программу, обратите внимание, что она не будет компилироваться и выдает сообщение об ошибке.
Примечание: Когда весь производный класс объявлен общедоступным, его члены не могут получить доступ к закрытым членам базового класса. Однако его члены могут иметь доступ к публичным и защищенным членам базового класса. Приведенная выше программа иллюстрирует это.
Однако обратите внимание, что открытый член открытого производного класса может получить доступ к защищенному члену базового класса.
Спецификаторы производного класса и спецификаторы членов
Защищенный производный класс с открытыми членами
Замените спецификатор «public» на «protected» в объявлении производного класса выше, как показано ниже:
Скомпилируйте и запустите программу и обратите внимание, что результат такой же, как и раньше.
Итак, когда весь производный класс объявлен защищенным, его члены не могут получить доступ к закрытым членам базового класса. Однако его члены могут иметь доступ к публичным и защищенным членам базового класса. Это то же самое, что и при объявлении производного класса общедоступным.
Примечание: защищенный член общедоступного производного класса может получить доступ к защищенному члену базового класса.
Частный производный класс с открытыми членами
Замените спецификатор «protected» на «private» в объявлении производного класса выше, как показано ниже:
Скомпилируйте и запустите программу и обратите внимание, что результат такой же, как и раньше.
Итак, когда весь производный класс объявлен закрытым, его члены не могут получить доступ к закрытым членам базового класса. Однако его члены могут иметь доступ к публичным и защищенным членам базового класса. Это то же самое, что и когда производный класс объявлен защищенным или общедоступным.
Открытый производный класс с защищенными членами
Введите, скомпилируйте и запустите следующую программу, в которой весь производный класс защищен, а его члены также защищены. Вот некоторые сегменты кода:
используя пространство имен std;
класс TheCla
общественность:
int num1 = 10;
защищено:
int num2 = 20;
частный:
int num3 = 30;
;
класс ChildCla: общедоступный TheCla
защищено:
int метод1 ()
return num1;
int метод2 ()
return num2;
/ * int method3 ()
return num3;
* /
;
int main ()
/ * ChildCla childObj;
int no1 = childObj.method1 ();
cout<
cout<
Программа работает как есть. Нет вывода, и не должно быть никакого вывода, в зависимости от того, как была напечатана программа.
Теперь не комментируйте определение функции method3 () в производном классе. Если вы попытаетесь скомпилировать программу, обратите внимание, что она не будет компилироваться и выдает сообщение об ошибке. Это означает, что к закрытому члену нельзя получить доступ из внешней функции, внешнего оператора или производного класса. Это тот же вывод, который был сделан выше, относительно доступа к частному члену.
Примечание: защищенный член защищенного производного класса может получить доступ к защищенному члену базового класса.
Теперь верните комментарии в производный класс и не комментируйте первый сегмент кода в функции main (). Если вы попытаетесь скомпилировать программу, обратите внимание, что программа не будет компилироваться из-за первого сегмента кода в функции main (). Этот эффект не нов. Помимо производного класса, внешних функций и внешних операторов, защищенные и закрытые члены (базового или производного) класса имеют один и тот же спецификатор, private. Функция main () видит защищенный член любого класса, базового или производного, с тем же спецификатором, private, и ей запрещен доступ к нему.
Если второй сегмент кода функции main () не прокомментирован, будет применяться то же объяснение. То есть функция main () не сможет получить доступ к защищенному или закрытому члену производного класса или базового класса. Это не зависит от того, может ли защищенный член производного класса получить доступ к защищенному члену базового класса.
Защищенный производный класс с защищенными членами
Замените спецификатор «public» на «protected» в объявлении производного класса выше, как показано ниже:
Поместите комментарий сегментов кода обратно в функцию main (), если это еще не было сделано. Скомпилируйте и запустите программу и обратите внимание, что результат такой же, как и раньше.
Частный производный класс с защищенными членами
Замените спецификатор «protected» на «private» в объявлении производного класса выше, как показано ниже:
Скомпилируйте и запустите программу и обратите внимание, что результат будет таким же, как и раньше.
Открытый производный класс с частными членами
Замените спецификатор private на public в объявлении производного класса выше, как показано ниже:
Сделайте члены производного класса закрытыми. Скомпилируйте и запустите программу. Результат не отличается от случая «Открытый производный класс с защищенными членами».
Защищенный производный класс с частными членами
Замените спецификатор «public» на «protected» в объявлении производного класса выше, как показано ниже:
Скомпилируйте и запустите программу. Этот результат не отличается от случая «Защищенный производный класс с защищенными членами».
Частный производный класс с частными членами
Замените спецификатор «protected» на «private» в объявлении производного класса выше, как показано ниже:
Скомпилируйте и запустите программу. Этот результат ничем не отличается от случая «Частный производный класс с защищенными членами».
Заключение
Спецификаторы доступа C ++ - это слова «частный», «защищенный» и «общедоступный»."Они решают доступ для членов класса. Область спецификатора доступа начинается от его метки, до конца описания (определения) класса или до начала другого спецификатора доступа. Любой член класса может получить доступ к любому другому члену того же класса. К закрытому члену класса не может получить доступ никакая внешняя функция, любой внешний оператор или производный класс.
Член базового класса должен быть защищен, чтобы член производного класса мог получить доступ к закрытому члену базового класса. Этот защищенный член базового класса рассматривается как частный член базового класса внешней функцией или внешним оператором.
Доступ к общедоступному члену класса может получить любая внешняя функция, любой внешний оператор или производный класс.
В отсутствие спецификатора доступа в классе предполагается, что частный спецификатор. То есть спецификатор доступа по умолчанию является частным.
Ссылки, использованные в этой работе
- Алиреза Эбрахими, НАСЛЕДИЕ: ПОВТОРНОЕ ИСПОЛЬЗОВАНИЕ И РАСШИРЕНИЕ
- S. Малик, Структуры данных с использованием C ++, 2-е издание