C ++

C ++ Спецификатори за достъп

C ++ Спецификатори за достъп
В C ++ класът е набор от променливи и функции, които са конфигурирани да работят заедно. Когато променливите на класа получават стойности, се получава обект. Обектът има същите променливи и функции като клас, но този път променливите имат стойности. Много обекти могат да бъдат създадени от един клас. Един обект се различава от друг обект според различния набор от стойности, присвоени на променливите на другия обект. Създаването на обект от клас се казва като екземпляр на обекта. Дори ако два различни обекта имат еднакви стойности за своите променливи, тези обекти са различни обекти, идентифицирани с различни имена в програмата. Променливите за обект и съответния клас се наричат ​​членове на данните. Функциите на даден обект и съответния клас се наричат ​​членски функции. Членовете на данни и членовите функции се наричат ​​членове.

Думата достъп означава да прочетете или промените стойността на променлива, а също така означава да използвате функция. Спецификаторите за достъп на C ++ са думите „частен“, „защитен“ и „публичен“.”Те решават дали даден член може да осъществи достъп до други членове на своя клас или функция или оператор извън класа, който не принадлежи към класа, може да осъществи достъп до който и да е член на класа. Те също така решават дали член на производен (дъщерен) клас може да има достъп до член на родителски клас.

За разбиране на тази статия и за тестване на предоставения код са необходими основни познания по C ++.

Съдържание на статията

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

Клас
Всеки член на клас може да има достъп до всеки друг член на същия клас, независим от който е означен като „публичен“ или „частен“.”Обмислете следната програма:

#include
използване на пространство от имена std;
клас TheCla

частно:
int num1;
int num2;
публично:
TheCla (int n1, int n2)

num1 = n1; num2 = n2;

метод int ()

връщане num1;

;
int main ()

TheCla obj (10, 20);
int no2 = obj.метод ();
Cout<// int no1 = obj.num1;
връщане 0;

Изходът е 10. Частните членове са num1 и num2. Публичните членове са TheCla () и метод (). Имайте предвид, че TheCla () е конструкторната функция, която инициализира променливи от интерес. Регионът на спецификатора за достъп започва от неговия етикет до края на описанието на класа (дефиниция) или до началото на друг спецификатор за достъп.

Във функцията main () първият оператор е екземпляр, включващ конструкторската функция, която инициализира num1 и num2. Следващото изявление извиква публичния член, метод () на класа.

Сега, в описанието на класа (дефиниция), публичната функция член, TheCla (), осъществява достъп до частните членове, num1 и num2. Също така функцията на публичния член, метод (), осъществява достъп до частния член, num1. Всеки член в описанието на класа може да има достъп до всеки друг член в същото описание на класа; няма значение кой член е частен или публичен.

Функция или оператор, които не са декларирани в описанието на класа и извън описанието на класа, могат да имат достъп само до публични членове на класа. Функцията main () например е функция, декларирана извън описанието на класа. Той е имал достъп само до метода () и публичните членове на TheCla (). Вътре в основната () функция, функцията TheCla () е obj (10, 20).

Външна функция или външен оператор, като например функцията main (), не може да осъществи достъп до някой от частните членове на класа, като num1 или num2. Премахнете индикатора за коментар, //, от последното твърдение в main (). Ако се опитвате да компилирате програмата, имайте предвид, че програмата няма да се компилира, което ще даде съобщение за грешка.

Спецификатор по подразбиране
Спецификаторът по подразбиране за клас е „private.”И така, горното описание на класа е същото като следващото описание, частно, но без спецификатора:

клас TheCla

int num1;
int num2;
публично:
TheCla (int n1, int n2)

num1 = n1; num2 = n2;

метод int ()

връщане num1;

;

Забележка: етикетът на спецификатора за достъп започва с спецификатора и след това е последван от двоеточие.

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

В рамките на описание на класа и от външна функция или външен оператор защитеният спецификатор е същият като частния спецификатор. Сега заменете частния спецификатор в горната програма със спецификатора, защитете и премахнете индикатора за коментар, //, от последния израз, но в функцията main (). Ако се опитвате да компилирате програмата, имайте предвид, че програмата няма да се компилира, което ще даде съобщение за грешка.

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

Публичен производен клас с публични членове
Обмислете следната програма:

#include
използване на пространство от имена std;
клас TheCla

публично:
int num1 = 10;
защитени:
int num2 = 20;
частно:
int num3 = 30;
;
клас ChildCla: публичен TheCla

публично:
int method1 ()

връщане num1;

int method2 ()

връщане num2;

/ * метод int3 ()

връщане num3;
* /
;
int main ()

ChildCla childObj;
int no1 = childObj.метод1 ();
Cout<int no2 = childObj.метод2 ();
Cout<връщане 0;

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

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

Производният клас не се декларира без спецификатор за достъп (публичен, защитен или частен). По-горе производният клас се декларира с публичния спецификатор, т.е

клас ChildCla: публичен TheCla

Сега премахнете коментара на дефиницията на функцията на трети член в извлечения клас. Ако се опитвате да компилирате програмата, имайте предвид, че тя няма да се компилира, като се появи съобщение за грешка.

Забележка: Когато целият производен клас е обявен за публичен, неговите членове не могат да получат достъп до частните членове на базовия клас. Членовете му обаче могат да имат достъп до обществените и защитени членове на базовия клас. Горната програма илюстрира това.

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

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

Защитен производен клас с публични членове
Заменете спецификатора „public“ с „protected“ в декларацията на производния клас по-горе, както следва:

клас ChildCla: защитен TheCla

Компилирайте и стартирайте програмата и отбележете, че резултатът е същият както преди.

Така че, когато целият производен клас е обявен за защитен, неговите членове не могат да получат достъп до частните членове на базовия клас. Членовете му обаче могат да имат достъп до обществените и защитени членове на базовия клас. Това е същото като когато производният клас е обявен за публичен.

Забележка: защитен член на публично извлечения клас има достъп до защитен член на основния клас.

Частен производен клас с публични членове
Заменете спецификатора „protected“ с „private“ в декларацията на производния клас по-горе, както следва:

клас ChildCla: частен TheCla

Компилирайте и стартирайте програмата и обърнете внимание, че резултатът е същият както преди.

Така че, когато целият производен клас е обявен за частен, неговите членове не могат да получат достъп до частните членове на базовия клас. Членовете му обаче могат да имат достъп до обществените и защитени членове на базовия клас. Това е същото като когато производният клас е обявен за защитен или публичен.

Публичен производен клас със защитени членове
Въведете, компилирайте и изпълнете следната програма, в която е защитен целият производен клас и неговите членове също са защитени. Някои кодови сегменти са както следва:

#include
използване на пространство от имена std;
клас TheCla

публично:
int num1 = 10;
защитени:
int num2 = 20;
частно:
int num3 = 30;
;
клас ChildCla: публичен TheCla

защитени:
int method1 ()

връщане num1;

int method2 ()

връщане num2;

/ * метод int3 ()

връщане num3;
* /
;
int main ()

/ * ChildCla childObj;
int no1 = childObj.метод1 ();
Cout</ * int no2 = childObj.метод2 ();
Cout<връщане 0;

Програмата работи такава, каквато е. Няма изход и не трябва да има изход въз основа на начина, по който е набрана програмата.

Сега премахнете коментара на дефиницията на функцията, method3 (), в производния клас. Ако се опитвате да компилирате програмата, имайте предвид, че тя няма да се компилира, като се появи съобщение за грешка. Това означава, че частен член не може да бъде достъпен от външна функция, външен оператор или производен клас. Това е същото заключение, както беше направено по-горе, относно достъпа до частен член.

Забележка: защитен член на защитения производен клас има достъп до защитен член на основния клас.

Сега поставете коментарите обратно в производния клас и премахнете коментара за първия кодов сегмент във функцията main (). Ако се опитвате да компилирате програмата, имайте предвид, че програмата няма да се компилира поради първия кодов сегмент във функцията main (). Този ефект не е нов. Освен производния клас, външните функции и външните оператори, защитените и частни членове на (основен или производен) клас са от същия спецификатор, private. Функцията main () вижда защитения член на който и да е клас, независимо дали е основен или производен, от същия спецификатор, частен и му е забранен достъпът до него.

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

Защитен производен клас със защитени членове
Заменете спецификатора „public“ с „protected“ в декларацията на производния клас по-горе, както следва:

клас ChildCla: защитен TheCla

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

Частен производен клас със защитени членове
Заменете спецификатора „protected“ с „private“ в декларацията на производния клас по-горе, както следва:

клас ChildCla: частен TheCla

Компилирайте и стартирайте програмата и отбележете, че резултатът ще бъде както преди.

Публичен производен клас с частни членове
Заменете спецификатора „private“ с „public“ в декларацията на производния клас по-горе, както следва:

клас ChildCla: публичен TheCla

Направете членовете на производния клас частни. Компилирайте и стартирайте програмата. Резултатът не се различава от случая „Публичен производен клас със защитени членове“.

Защитен производен клас с частни членове
Заменете спецификатора „public“ с „protected“ в декларацията на производния клас по-горе, както следва:

клас ChildCla: защитен TheCla

Компилирайте и стартирайте програмата. Този резултат не се различава от случая „Защитен производен клас със защитени членове“.

Частен производен клас с частни членове
Заменете спецификатора „protected“ с „private“ в декларацията на производния клас по-горе, както следва:

клас ChildCla: частен TheCla

Компилирайте и стартирайте програмата. Този резултат не се различава от случая „Частен производен клас със защитени членове“.

Заключение

Спецификаторите за достъп на C ++ са думите „частен“, „защитен“ и „публичен“.”Те решават достъпа на членовете на клас. Областта на спецификатора за достъп започва от неговия етикет, до края на описанието на класа (дефиниция) или до началото на друг спецификатор за достъп. Всеки член на клас може да има достъп до всеки друг член на същия клас. Частен член на клас не може да бъде достъпен от външна функция, външен оператор или производен клас.

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

Публичен член на клас може да бъде достъпен от всяка външна функция, всеки външен оператор или производен клас.

При липса на спецификатор за достъп в клас се приема частният спецификатор. Тоест, спецификаторът за достъп по подразбиране е частен.

Препратки, използвани в тази работа

  • Алиреза Ебрахими, НАСЛЕДСТВО: ПОВТОРНОСТ И РАЗШИРЯЕМОСТ
  • С. Malik, Структури на данни, използващи C ++ 2-ро издание
Как да промените курсора на мишката и размера на курсора, цвета и схемата в Windows 10
Показалецът на мишката и курсорът в Windows 10 са много важни аспекти на операционната система. Това може да се каже и за други операционни системи, т...
Безплатни и игри с отворен код за разработване на Linux игри
Тази статия ще обхване списък с безплатни двигатели за игри с отворен код, които могат да се използват за разработване на 2D и 3D игри на Linux. Същес...
Урок Сянка на Tomb Raider за Linux
Shadow of the Tomb Raider е дванадесетото допълнение към поредицата Tomb Raider - франчайз за екшън-приключенска игра, създаден от Eidos Montreal. Игр...