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

C Access Specifiers



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

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







Для понимания этой статьи и тестирования предоставленного кода требуются базовые знания C ++.



Содержание статьи

Публичные и частные спецификаторы

Класс
Любой член класса может получить доступ к любому другому члену того же класса, независимо от того, называется ли он общедоступным или частным. Рассмотрим следующую программу:



#включают
с использованием пространство именчасы;

классTheCla
{
частный:
intчисло1;
intчисло2;
общественный:
TheCla(intn1,intn2)
{
число1знак равноn1;число2знак равноn2;
}
intметод()
{
возвращениечисло1;
}
};

intглавный()
{
TheCla obj(10,двадцать);
int№2знак равнообъектметод();
Стоимость<<№2<<' п';

// 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число1;
intчисло2;
общественный:
TheCla(intn1,intn2)
{
число1знак равноn1;число2знак равноn2;
}
intметод()
{
возвращениечисло1;
}
};

Примечание : метка спецификатора доступа начинается со спецификатора, за которым следует двоеточие.

Защищенный спецификатор

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

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

Открытый производный класс с публичными членами
Рассмотрим следующую программу:

#включают
с использованием пространство именчасы;

классTheCla
{
общественный:
intчисло1знак равно 10;
защищенный:
intчисло2знак равно двадцать;
частный:
intчисло3знак равно 30;
};

классChildCla: общественныйTheCla
{
общественный:
intметод1()
{
возвращениечисло1;
}
intметод2()
{
возвращениечисло2;
}
/ * int method3 ()
{
return num3;
} * /

};

intглавный()
{
ChildCla childObj;
int№1знак равноchildObj.метод1();
Стоимость<<№1<<' п';

int№2знак равноchildObj.метод2();
Стоимость<<№2<<' п';

возвращение 0;
}

На выходе:
10
двадцать

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

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

классChildCla: общественныйTheCla{}

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

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

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

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

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

классChildCla: защищенныйTheCla{}

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

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

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

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

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

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

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

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

#включают
с использованием пространство именчасы;

классTheCla
{
общественный:
intчисло1знак равно 10;
защищенный:
intчисло2знак равно двадцать;
частный:
intчисло3знак равно 30;
};

классChildCla: общественныйTheCla
{
защищенный:
intметод1()
{
возвращениечисло1;
}
intметод2()
{
возвращениечисло2;
}
/ * int method3 ()
{
return num3;
} * /

};

intглавный()
{
/ * ChildCla childObj;
int no1 = childObj.method1 ();
Стоимость<
/ * int no2 = childObj.method2 ();
Стоимость<
возвращение 0;
}

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

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

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

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

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

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

классChildCla: защищенныйTheCla{}

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

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

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

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

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

классChildCla: общественныйTheCla{}

Сделайте члены производного класса закрытыми. Скомпилируйте и запустите программу. Результат не отличается от случая Public Derived Class with Protected Members.

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

классChildCla: защищенныйTheCla{}

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

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

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

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

Заключение

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

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

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

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

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