C ++

Спецификаторы доступа C ++

Спецификаторы доступа C ++
В C ++ класс - это набор переменных и функций, настроенных для совместной работы. Когда переменным класса присваиваются значения, получается объект. Объект имеет те же переменные и функции, что и класс, но на этот раз переменные имеют значения. Многие объекты могут быть созданы из одного класса. Один объект отличается от другого в соответствии с другим набором значений, присвоенных переменным другого объекта. Говорят, что создание объекта из класса создает экземпляр объекта. Даже если два разных объекта имеют одинаковые значения для своих переменных, эти объекты являются разными сущностями, идентифицируемыми разными именами в программе. Переменные для объекта и соответствующего ему класса называются членами данных. Функции объекта и соответствующего ему класса называются функциями-членами. Члены данных и функции-члены называются членами.

Слово «доступ» означает чтение или изменение значения переменной, а также использование функции. Спецификаторы доступа 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<// 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 (). Если вы попытаетесь скомпилировать программу, обратите внимание, что программа не будет компилироваться и выдает сообщение об ошибке.

Спецификатор по умолчанию
Спецификатор по умолчанию для класса - «частный».Итак, приведенное выше описание класса такое же, как следующее описание, частное, но без спецификатора:

класс TheCla

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<int no2 = childObj.method2 ();
cout<возврат 0;

Результат:
10
20

В базовом классе num1 является общедоступным, num2 защищенным, а num3 закрытым. В производном классе все функции-члены являются общедоступными. Первая функция, method1 (), обращается к публичному элементу данных num1. Вторая функция, method2 (), обращается к защищенному элементу данных num2. Третья функция, method3 (), хотя в настоящее время закомментирована, должна иметь доступ к закрытому элементу данных num3.

Производный класс не объявляется без спецификатора доступа (общедоступный, защищенный или частный). Выше производный класс объявлен со спецификатором public, то есть:

class ChildCla: public TheCla

Теперь не комментируйте определение третьей функции-члена в производном классе. Если вы попытаетесь скомпилировать программу, обратите внимание, что она не будет компилироваться и выдает сообщение об ошибке.

Примечание: Когда весь производный класс объявлен общедоступным, его члены не могут получить доступ к закрытым членам базового класса. Однако его члены могут иметь доступ к публичным и защищенным членам базового класса. Приведенная выше программа иллюстрирует это.

Однако обратите внимание, что открытый член открытого производного класса может получить доступ к защищенному члену базового класса.

Спецификаторы производного класса и спецификаторы членов

Защищенный производный класс с открытыми членами
Замените спецификатор «public» на «protected» в объявлении производного класса выше, как показано ниже:

class ChildCla: защищенный TheCla

Скомпилируйте и запустите программу и обратите внимание, что результат такой же, как и раньше.

Итак, когда весь производный класс объявлен защищенным, его члены не могут получить доступ к закрытым членам базового класса. Однако его члены могут иметь доступ к публичным и защищенным членам базового класса. Это то же самое, что и при объявлении производного класса общедоступным.

Примечание: защищенный член общедоступного производного класса может получить доступ к защищенному члену базового класса.

Частный производный класс с открытыми членами
Замените спецификатор «protected» на «private» в объявлении производного класса выше, как показано ниже:

class ChildCla: частный TheCla

Скомпилируйте и запустите программу и обратите внимание, что результат такой же, как и раньше.

Итак, когда весь производный класс объявлен закрытым, его члены не могут получить доступ к закрытым членам базового класса. Однако его члены могут иметь доступ к публичным и защищенным членам базового класса. Это то же самое, что и когда производный класс объявлен защищенным или общедоступным.

Открытый производный класс с защищенными членами
Введите, скомпилируйте и запустите следующую программу, в которой весь производный класс защищен, а его члены также защищены. Вот некоторые сегменты кода:

#включать
используя пространство имен 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</ * int no2 = childObj.method2 ();
cout<возврат 0;

Программа работает как есть. Нет вывода, и не должно быть никакого вывода, в зависимости от того, как была напечатана программа.

Теперь не комментируйте определение функции method3 () в производном классе. Если вы попытаетесь скомпилировать программу, обратите внимание, что она не будет компилироваться и выдает сообщение об ошибке. Это означает, что к закрытому члену нельзя получить доступ из внешней функции, внешнего оператора или производного класса. Это тот же вывод, который был сделан выше, относительно доступа к частному члену.

Примечание: защищенный член защищенного производного класса может получить доступ к защищенному члену базового класса.

Теперь верните комментарии в производный класс и не комментируйте первый сегмент кода в функции main (). Если вы попытаетесь скомпилировать программу, обратите внимание, что программа не будет компилироваться из-за первого сегмента кода в функции main (). Этот эффект не нов. Помимо производного класса, внешних функций и внешних операторов, защищенные и закрытые члены (базового или производного) класса имеют один и тот же спецификатор, private. Функция main () видит защищенный член любого класса, базового или производного, с тем же спецификатором, private, и ей запрещен доступ к нему.

Если второй сегмент кода функции main () не прокомментирован, будет применяться то же объяснение. То есть функция main () не сможет получить доступ к защищенному или закрытому члену производного класса или базового класса. Это не зависит от того, может ли защищенный член производного класса получить доступ к защищенному члену базового класса.

Защищенный производный класс с защищенными членами
Замените спецификатор «public» на «protected» в объявлении производного класса выше, как показано ниже:

class ChildCla: защищенный TheCla

Поместите комментарий сегментов кода обратно в функцию main (), если это еще не было сделано. Скомпилируйте и запустите программу и обратите внимание, что результат такой же, как и раньше.

Частный производный класс с защищенными членами
Замените спецификатор «protected» на «private» в объявлении производного класса выше, как показано ниже:

класс ChildCla: частный TheCla

Скомпилируйте и запустите программу и обратите внимание, что результат будет таким же, как и раньше.

Открытый производный класс с частными членами
Замените спецификатор private на public в объявлении производного класса выше, как показано ниже:

class ChildCla: public TheCla

Сделайте члены производного класса закрытыми. Скомпилируйте и запустите программу. Результат не отличается от случая «Открытый производный класс с защищенными членами».

Защищенный производный класс с частными членами
Замените спецификатор «public» на «protected» в объявлении производного класса выше, как показано ниже:

class ChildCla: защищенный TheCla

Скомпилируйте и запустите программу. Этот результат не отличается от случая «Защищенный производный класс с защищенными членами».

Частный производный класс с частными членами
Замените спецификатор «protected» на «private» в объявлении производного класса выше, как показано ниже:

class ChildCla: частный TheCla

Скомпилируйте и запустите программу. Этот результат ничем не отличается от случая «Частный производный класс с защищенными членами».

Заключение

Спецификаторы доступа C ++ - это слова «частный», «защищенный» и «общедоступный»."Они решают доступ для членов класса. Область спецификатора доступа начинается от его метки, до конца описания (определения) класса или до начала другого спецификатора доступа. Любой член класса может получить доступ к любому другому члену того же класса. К закрытому члену класса не может получить доступ никакая внешняя функция, любой внешний оператор или производный класс.

Член базового класса должен быть защищен, чтобы член производного класса мог получить доступ к закрытому члену базового класса. Этот защищенный член базового класса рассматривается как частный член базового класса внешней функцией или внешним оператором.

Доступ к общедоступному члену класса может получить любая внешняя функция, любой внешний оператор или производный класс.

В отсутствие спецификатора доступа в классе предполагается, что частный спецификатор. То есть спецификатор доступа по умолчанию является частным.

Ссылки, использованные в этой работе

  • Алиреза Эбрахими, НАСЛЕДИЕ: ПОВТОРНОЕ ИСПОЛЬЗОВАНИЕ И РАСШИРЕНИЕ
  • S. Малик, Структуры данных с использованием C ++, 2-е издание
Как разработать игру в Linux
Десять лет назад не многие пользователи Linux могли бы предсказать, что их любимая операционная система однажды станет популярной игровой платформой д...
Порты коммерческих игровых движков с открытым исходным кодом
Бесплатные игры с открытым исходным кодом и кроссплатформенные версии игрового движка можно использовать для игры как в старые, так и в некоторые из с...
Лучшие игры с командной строкой для Linux
Командная строка - не только ваш главный союзник при использовании Linux - она ​​также может быть источником развлечений, потому что вы можете использ...