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

C Access Specifiers



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

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







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



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

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

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



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

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

intглавен()
{
TheCla obj(10,двайсет);
int№2=obj.метод();
цена<<№2<<'н';

// int no1 = obj.num1;

връщане 0;
}

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





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

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



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

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

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

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

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

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

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

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

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

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

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

класChildCla: общественTheCla
{
обществен:
intметод1()
{
връщаненомер1;
}
intметод2()
{
връщаненомер2;
}
/*int метод3 ()
{
възвращаем номер3;
} * /

};

intглавен()
{
ChildCla childObj;
int№1=childObj.метод1();
цена<<№1<<'н';

int№2=childObj.метод2();
цена<<№2<<'н';

връщане 0;
}

Изходът е:
10
двайсет

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

класChildCla: общественTheCla
{
защитени:
intметод1()
{
връщаненомер1;
}
intметод2()
{
връщаненомер2;
}
/*int метод3 ()
{
възвращаем номер3;
} * /

};

intглавен()
{
/*ChildCla childObj;
int no1 = childObj.method1 ();
цена<
/*int no2 = childObj.method2 ();
цена<
връщане 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

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

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