Špecifikátory prístupu C ++

C Access Specifiers



V C ++ je trieda sada premenných a funkcií, ktoré boli nakonfigurované tak, aby spolupracovali. Keď sú premenným triedy dané hodnoty, získa sa objekt. Objekt má rovnaké premenné a funkcie ako trieda, ale tentoraz majú premenné hodnoty. Z jednej triedy je možné vytvoriť veľa objektov. Jeden objekt sa líši od iného objektu podľa odlišného súboru hodnôt priradených premenným druhého objektu. Vytvorenie objektu z triedy je údajne inštanciou objektu. Aj keď dva rôzne objekty majú pre svoje premenné rovnaké hodnoty, tieto objekty sú rôznymi entitami, ktoré sú v programe označené rôznymi názvami. Premenné pre objekt a jeho zodpovedajúcu triedu sa nazývajú dátové členy. Funkcie objektu a jeho zodpovedajúcej triedy sa nazývajú členské funkcie. Dátové členy a členské funkcie sa nazývajú členovia.

Slovo prístup znamená prečítať alebo zmeniť hodnotu premennej a tiež znamená použiť funkciu. Špecifikátormi prístupu v jazyku C ++ sú slová súkromné, chránené a verejné. Rozhodujú, či má člen prístup k iným členom svojej triedy, alebo či má funkcia alebo operátor mimo triedu a nepatriaci do triedy prístup k akémukoľvek členovi triedy. Tiež rozhodujú, či má člen odvodenej (podradenej) triedy prístup k členovi rodičovskej triedy.







Na pochopenie tohto článku a testovanie poskytnutého kódu sú potrebné základné znalosti C ++.



Obsah článku

Verejní a súkromní špecifikátori

Trieda
Každý člen triedy má prístup k akémukoľvek ďalšiemu členovi tej istej triedy, nezávisle od toho, ktorý je označený ako verejný alebo súkromný. Zvážte nasledujúci program:



#zahrnúť
použitím priestor mienhodiny;

triedaTheCla
{
súkromné:
intnum1;
intnum2;
verejná:
TheCla(intn1,intn2)
{
num1=n1;num2=n2;
}
intmetóda()
{
vrátiť sanum1;
}
};

intHlavná()
{
TheCla obj(10,dvadsať);
intč.2=obj.metóda();
náklady<<č.2<<' n';

// int no1 = obj.num1;

vrátiť sa 0;
}

Výstup je 10. Súkromní členovia sú num1 a num2. Verejnými členmi sú TheCla () a method (). Všimnite si toho, že TheCla () je funkcia konštruktora, ktorá inicializuje požadované premenné. Oblasť špecifikátora prístupu začína od jeho označenia po koniec popisu (definície) triedy alebo do začiatku iného špecifikátora prístupu.





Vo funkcii main () je prvým príkazom inštancionalizácia zahŕňajúca funkciu konštruktora, ktorá inicializuje čísla num1 a num2. Nasledujúce vyhlásenie volá verejného člena triedy (metóda ()).

V popise (definícii) triedy teraz verejná členská funkcia TheCla () pristupuje k súkromným členom num1 a num2. Verejná členská funkcia, metóda (), tiež pristupuje k súkromnému členovi, číslo 1. Každý člen v rámci popisu triedy má prístup k akémukoľvek inému členovi v rámci rovnakého popisu triedy; nezáleží na tom, ktorý člen je súkromný alebo verejný.



Funkcia alebo operátor, ktoré nie sú uvedené v popise triedy a mimo popisu triedy, však majú prístup iba k verejným členom triedy. Funkcia main () je napríklad funkcia deklarovaná mimo popisu triedy. Má prístup iba k verejným členom metódy () a TheCla (). Vnútri funkcie main () je funkcia TheCla () obj (10, 20).

Externá funkcia alebo externý operátor, ako napríklad funkcia main (), nemôže pristupovať k žiadnym súkromným členom triedy, ako napríklad num1 alebo num2. Odstráňte indikátor komentára // z príkazu last-one-one v main (). Ak sa pokúsite program skompilovať, upozorňujeme, že program sa neskompiluje, pričom sa zobrazí chybové hlásenie.

Predvolený špecifikátor
Predvolený špecifikátor pre triedu je súkromný. Vyššie uvedený popis triedy je teda rovnaký ako nasledujúci popis, súkromný, ale bez špecifikátora:

triedaTheCla
{
intnum1;
intnum2;
verejná:
TheCla(intn1,intn2)
{
num1=n1;num2=n2;
}
intmetóda()
{
vrátiť sanum1;
}
};

Poznámka : štítok špecifikátora prístupu začína špecifikátorom a potom nasleduje dvojbodka.

Chránený špecifikátor

V rámci popisu triedy a od vonkajšej funkcie alebo od externého operátora je chránený špecifikátor rovnaký ako súkromný špecifikátor. Teraz nahraďte súkromný špecifikátor vo vyššie uvedenom programe špecifikátorom, chráňte ho a odstráňte indikátor komentára // z príkazu last-one-one vo funkcii main (). Ak sa pokúsite program skompilovať, upozorňujeme, že program sa neskompiluje, pričom sa zobrazí chybové hlásenie.

Problém chráneného špecifikátora nastáva, keď členovia odvodenej (zdedenej) triedy musia pristupovať k členom základnej (nadradenej) triedy.

Verejne odvodená trieda s verejnými členmi
Zvážte nasledujúci program:

#zahrnúť
použitím priestor mienhodiny;

triedaTheCla
{
verejná:
intnum1= 10;
chránené:
intnum2= dvadsať;
súkromné:
intnum3= 30;
};

triedaChildCla: verejnáTheCla
{
verejná:
intmetóda 1()
{
vrátiť sanum1;
}
intmetóda 2()
{
vrátiť sanum2;
}
/*int metóda3 ()
{
návrat num3;
} * /

};

intHlavná()
{
ChildCla dieťaObj;
intč. 1=dieťaObj.metóda 1();
náklady<<č. 1<<' n';

intč.2=dieťaObj.metóda 2();
náklady<<č.2<<' n';

vrátiť sa 0;
}

Výstup je:
10
dvadsať

V základnej triede je num1 public, num2 je chránený a num3 je súkromný. V odvodenej triede sú všetky členské funkcie verejné. Prvá funkcia, method1 (), pristupuje k verejnému dátovému členovi, číslo 1. Druhá funkcia, method2 (), pristupuje k chránenému dátovému členu, num2. Tretia funkcia, method3 (), aj keď je v súčasnej dobe komentovaná, by mala pristupovať k súkromnému dátovému členovi, num3.

Odvodená trieda nie je deklarovaná bez špecifikátora prístupu (verejného, ​​chráneného alebo súkromného). Odvodená trieda je vyššie deklarovaná pomocou verejného špecifikátora, tj.

triedaChildCla: verejnáTheCla{}

Teraz zrušte komentár k definícii tretej členskej funkcie v odvodenej triede. Ak sa pokúsite program skompilovať, všimnite si, že sa neskompiluje, pričom sa zobrazí chybové hlásenie.

Poznámka : Keď je celá odvodená trieda vyhlásená za verejnú, jej členovia nemajú prístup k súkromným členom základnej triedy. Jej členovia však majú prístup k verejným a chráneným členom základnej triedy. Vyššie uvedený program to ilustruje.

Všimnite si však, že verejný člen z verejnej odvodenej triedy má prístup k chránenému členovi základnej triedy.

Odvodené špecifikátory tried a špecifikátory členov

Chránená odvodená trieda s verejnými členmi
Verejný špecifikátor nahraďte chráneným vo vyššie uvedenej deklarácii odvodenej triedy:

triedaChildCla: chránenéTheCla{}

Zostavte a spustite program a všimnite si, že výsledok je rovnaký ako predtým.

Keď je teda celá odvodená trieda vyhlásená za chránenú, jej členovia nemajú prístup k súkromným členom základnej triedy. Jej členovia však majú prístup k verejným a chráneným členom základnej triedy. Je to rovnaké, ako keď je odvodená trieda vyhlásená za verejnú.

Poznámka : chránený člen z verejnej odvodenej triedy má prístup k chránenému členovi základnej triedy.

Súkromná odvodená trieda s verejnými členmi
Chránený špecifikátor nahraďte vo vyhlásení odvodenej triedy vyššie za súkromný takto:

triedaChildCla: súkromnéTheCla{}

Zostavte a spustite program a všimnite si, že výsledok je rovnaký ako predtým.

Keď je teda celá odvodená trieda vyhlásená za súkromnú, jej členovia nemajú prístup k súkromným členom základnej triedy. Jej členovia však majú prístup k verejným a chráneným členom základnej triedy. Je to rovnaké, ako keď je odvodená trieda vyhlásená za chránenú alebo verejnú.

Verejne odvodená trieda s chránenými členmi
Napíšte, skompilovajte a spustite nasledujúci program, v ktorom je chránená celá odvodená trieda a sú chránené aj jej členovia. Niektoré segmenty kódu sú nasledujúce:

#zahrnúť
použitím priestor mienhodiny;

triedaTheCla
{
verejná:
intnum1= 10;
chránené:
intnum2= dvadsať;
súkromné:
intnum3= 30;
};

triedaChildCla: verejnáTheCla
{
chránené:
intmetóda 1()
{
vrátiť sanum1;
}
intmetóda 2()
{
vrátiť sanum2;
}
/*int metóda3 ()
{
návrat num3;
} * /

};

intHlavná()
{
/*ChildCla dieťaObj;
int no1 = childObj.method1 ();
náklady<
/*int no2 = childObj.method2 ();
náklady<
vrátiť sa 0;
}

Program funguje ako má. Na základe toho, ako bol program napísaný, neexistuje žiadny výstup a údajne ani žiadny výstup neexistuje.

Teraz zrušte komentár k definícii funkcie, method3 (), v odvodenej triede. Ak sa pokúsite program skompilovať, všimnite si, že sa neskompiluje, pričom sa zobrazí chybové hlásenie. To znamená, že k súkromnému členovi nie je možné získať prístup z externej funkcie, externého operátora alebo odvodenej triedy. Ide o rovnaký záver, ako bol uzavretý vyššie, pokiaľ ide o prístup k súkromnému členovi.

Poznámka : chránený člen chránenej odvodenej triedy má prístup k chránenému členovi základnej triedy.

Teraz vložte komentáre späť do odvodenej triedy a zrušte komentovanie prvého segmentu kódu vo funkcii main (). Ak sa pokúsite program skompilovať, upozorňujeme, že program sa nebude kompilovať kvôli prvému segmentu kódu vo funkcii main (). Tento efekt nie je nový. Okrem odvodenej triedy, vonkajších funkcií a externých operátorov majú chránení a súkromní členovia (základnej alebo odvodenej) triedy rovnaký špecifikátor, súkromný. Funkcia main () vidí chráneného člena akejkoľvek triedy, či už základného alebo odvodeného, ​​podľa rovnakého špecifikátora, súkromného, ​​a má k nemu zakázaný prístup.

Ak druhý kódový segment funkcie main () nie je komentovaný, použije sa rovnaké vysvetlenie. To znamená, že funkcia main () nebude mať prístup k chránenému alebo súkromnému členovi odvodenej triedy alebo základnej triedy. Toto je nezávislé od toho, či chránený člen odvodenej triedy môže pristupovať k chránenému členovi základnej triedy.

Chránená odvodená trieda s chránenými členmi
Verejný špecifikátor nahraďte chráneným vo vyššie uvedenej deklarácii odvodenej triedy:

triedaChildCla: chránenéTheCla{}

Vložte komentár k segmentom kódu späť do funkcie main (), ak to ešte nebolo urobené. Zostavte a spustite program a všimnite si, že výsledok je ako predtým.

Súkromná odvodená trieda s chránenými členmi
Chránený špecifikátor nahraďte vo vyhlásení odvodenej triedy vyššie za súkromný takto:

triedaChildCla: súkromnéTheCla

Zostavte a spustite program a všimnite si, že výsledok bude rovnaký ako predtým.

Verejne odvodená trieda so súkromnými členmi
Vo vyššie uvedenom vyhlásení odvodenej triedy nahraďte súkromný špecifikátor za verejný takto:

triedaChildCla: verejnáTheCla{}

Nastaviť členov odvodenej triedy ako súkromných. Zostavte a spustite program. Výsledok sa nelíši od prípadu Verejne odvodenej triedy s chránenými členmi.

Chránená odvodená trieda so súkromnými členmi
Verejný špecifikátor nahraďte chráneným vo vyššie uvedenej deklarácii odvodenej triedy:

triedaChildCla: chránenéTheCla{}

Zostavte a spustite program. Tento výsledok sa nelíši od prípadu chránenej odvodenej triedy s chránenými členmi.

Súkromná odvodená trieda so súkromnými členmi
Chránený špecifikátor nahraďte vo vyhlásení odvodenej triedy vyššie za súkromný takto:

triedaChildCla: súkromnéTheCla{}

Zostavte a spustite program. Tento výsledok sa nelíši od prípadu súkromnej odvodenej triedy s chránenými členmi.

Záver

Špecifikátormi prístupu v jazyku C ++ sú slová súkromné, chránené a verejné. Rozhodujú o prístupe pre členov triedy. Oblasť špecifikátora prístupu začína od jeho označenia po koniec popisu triedy (definícia) alebo začiatok iného špecifikátora prístupu. Každý člen triedy má prístup k akémukoľvek inému členovi tej istej triedy. K súkromnému členovi triedy nemôže získať prístup žiadna vonkajšia funkcia, žiadny externý operátor ani odvodená trieda.

Člen základnej triedy musí byť chránený tak, aby k súkromnému členovi základnej triedy mal prístup člen odvodenej triedy. Tento chránený člen základnej triedy je vonkajšou funkciou alebo externým operátorom považovaný za súkromného člena základnej triedy.

K verejnému členovi triedy môže mať prístup akákoľvek vonkajšia funkcia, akýkoľvek externý operátor alebo odvodená trieda.

Ak v triede neexistuje žiadny špecifikátor prístupu, predpokladá sa súkromný špecifikátor. To znamená, že predvolený špecifikátor prístupu je súkromný.

Referencie použité v tejto práci