C ++ hozzáférési specifikátorok

C Access Specifiers



A C ++ nyelvben az osztály olyan változók és függvények halmaza, amelyek együtt működnek. Ha az osztály változóinak értékeket adunk, akkor egy objektumot kapunk. Egy objektum ugyanazokkal a változókkal és funkciókkal rendelkezik, mint egy osztály, de ezúttal a változóknak értékeik vannak. Sok objektum hozható létre egy osztályból. Az egyik objektum abban különbözik a másik objektumtól, hogy a másik objektum változóira van rendelve. Egy objektum osztályból való létrehozása azt jelenti, hogy az objektum példányosítása. Még akkor is, ha két különböző objektum azonos értékekkel rendelkezik a változóikhoz, ezek az objektumok különböző entitások, amelyeket a program különböző nevekkel azonosít. Az objektum és a hozzá tartozó osztály változóit adattagoknak nevezzük. Az objektum és a hozzá tartozó osztály funkcióit tagfüggvényeknek nevezzük. Az adattagokat és a tagfüggvényeket tagoknak nevezzük.

Az access szó egy változó értékének olvasását vagy megváltoztatását jelenti, és egy függvény használatát is jelenti. A C ++ hozzáférési specifikátorok a privát, védett és nyilvános szavak. Ők döntik el, hogy egy tag hozzáférhet -e osztályának többi tagjához, vagy az osztályon kívüli, nem az osztályhoz tartozó funkció vagy operátor hozzáférhet az osztály bármely tagjához. Azt is eldöntik, hogy egy származtatott (gyermek) osztály tagja hozzáférhet -e egy szülőosztály tagjához.







A cikk megértéséhez és a megadott kód teszteléséhez alapvető C ++ ismeretekre van szükség.



Cikk tartalma

A nyilvános és a magánmeghatározók

Osztály
Az osztály bármely tagja hozzáférhet ugyanazon osztály bármely más tagjához, függetlenül attól, hogy nyilvános vagy magánjellegű. Tekintsük a következő programot:



#befoglalni
segítségével névtérórák;

osztályTheCla
{
magán:
intszám1;
intszám2;
nyilvános:
TheCla(intn1,intn2)
{
szám1=n1;szám2=n2;
}
intmódszer()
{
Visszatérésszám1;
}
};

intfő-()
{
TheCla obj(10,húsz);
intno2=obj.módszer();
költség<<no2<<' n';

// int no1 = obj.num1;

Visszatérés 0;
}

A kimenet 10. A privát tagok száma1 és szám2. A nyilvános tagok a TheCla () és a method (). Vegye figyelembe, hogy a TheCla () a konstruktor függvény, amely inicializálja az érdeklődő változókat. A hozzáférési specifikátor régiója a címkéjétől az osztályleírás (definíció) végéig vagy egy másik hozzáférési specifikátor kezdetéig kezdődik.





A main () függvényben az első utasítás a konstruktor függvényt magában foglaló példányosítás, amely inicializálja a num1 és num2 értékeket. A következő állítás meghívja az osztály nyilvános tagját, metódust ().

Most az osztályleírásban (definíció) a nyilvános tagfüggvény, a TheCla () hozzáfér a privát tagokhoz, a szám1 és a szám2. Ezenkívül a nyilvános tag függvény, metódus (), hozzáfér a privát taghoz, a szám1. Az osztályleíráson belül bármely tag hozzáférhet bármely más taghoz ugyanazon osztályleíráson belül; nem számít, hogy melyik tag magán- vagy állami.



Az osztályleírásban és az osztályleíráson kívül nem deklarált függvény vagy operátor azonban csak az osztály nyilvános tagjainak férhet hozzá. A fő () függvény például az osztályleíráson kívül deklarált függvény. Csak a metódust () és a TheCla () nyilvános tagjait tudta elérni. A fő () függvényen belül a TheCla () függvény az obj (10, 20).

Egy külső funkció vagy külső operátor, például a fő () függvény, nem férhet hozzá az osztály bármely privát tagjához, például a szám1 -hez vagy a szám2 -hez. Távolítsa el a megjegyzés indikátort, //, a main () utolsó mondatából. Ha megpróbálja lefordítani a programot, vegye figyelembe, hogy a program nem fordít, és hibaüzenetet ad.

Alapértelmezett megadó
Az osztály alapértelmezett specifikátora privát. Tehát a fenti osztályleírás megegyezik a következő leírással, privát, de a specifikátor nélkül:

osztályTheCla
{
intszám1;
intszám2;
nyilvános:
TheCla(intn1,intn2)
{
szám1=n1;szám2=n2;
}
intmódszer()
{
Visszatérésszám1;
}
};

jegyzet : a hozzáférési specifikátor címke a specifikátorral kezdődik, majd kettőspont következik.

A védett specifikátor

Az osztályleírásban és egy külső függvényben vagy külső operátorban a védett specifikátor megegyezik a privát specifikátorral. Most cserélje le a privát specifikátort a fenti programban a specifikátorral, védje meg és távolítsa el a megjegyzés indikátort, //, a main () függvény utolsó kijelentéséből. Ha megpróbálja lefordítani a programot, vegye figyelembe, hogy a program nem fordít, és hibaüzenetet ad.

A védett specifikátor kérdése akkor merül fel, amikor a származtatott (örökölt) osztály tagjainak hozzá kell férniük az alap (szülő) osztály tagjaihoz.

Nyilvános származtatott osztály nyilvános tagokkal
Tekintsük a következő programot:

#befoglalni
segítségével névtérórák;

osztályTheCla
{
nyilvános:
intszám1= 10;
védett:
intszám2= húsz;
magán:
intszám3= 30;
};

osztályChildCla: nyilvánosTheCla
{
nyilvános:
intmódszer1()
{
Visszatérésszám1;
}
intmódszer2()
{
Visszatérésszám2;
}
/*int metódus3 ()
{
return szám3;
} * /

};

intfő-()
{
ChildCla childObj;
intno1=gyermekObj.módszer1();
költség<<no1<<' n';

intno2=gyermekObj.módszer2();
költség<<no2<<' n';

Visszatérés 0;
}

A kimenet az:
10
húsz

Az alaposztályban a szám1 nyilvános, a szám2 védett és a szám privát. A származtatott osztályban minden tagfüggvény nyilvános. Az első függvény, a method1 (), hozzáfér a nyilvános adattaghoz, a num1 -hez. A második függvény, a method2 (), hozzáfér a szám2 védett adattaghoz. A harmadik függvény, a method3 (), bár jelenleg kommentálva van, hozzá kell férnie a privát adattaghoz, a num3 -hoz.

A származtatott osztály nincs deklarálva hozzáférési specifikátor nélkül (nyilvános, védett vagy privát). Fentebb a származtatott osztályt a nyilvános specifikátorral deklaráljuk, azaz:

osztályChildCla: nyilvánosTheCla{}

Most vegye ki a megjegyzést a származtatott osztály harmadik tagfüggvény-definíciójából. Ha megpróbálja lefordítani a programot, vegye figyelembe, hogy nem fordítja le, és hibaüzenetet ad.

jegyzet : Amikor az egész származtatott osztály nyilvánossá válik, tagjai nem férhetnek hozzá az alaposztály privát tagjaihoz. Tagjai azonban hozzáférhetnek az alaposztály nyilvános és védett tagjaihoz. A fenti program ezt szemlélteti.

Ne feledje azonban, hogy a nyilvános származtatott osztály nyilvános tagja hozzáférhet az alaposztály védett tagjához.

Származtatott osztály -specifikátorok és tag -specifikátorok

Védett származtatott osztály nyilvános tagokkal
Cserélje ki a nyilvános specifikátort védettre a fenti származtatott osztály deklarációjában, az alábbiak szerint:

osztályChildCla: védettTheCla{}

Fordítsa le és futtassa a programot, és vegye figyelembe, hogy az eredmény ugyanaz, mint korábban.

Tehát amikor az egész származtatott osztály védetté nyilvánul, tagjai nem férhetnek hozzá az alaposztály privát tagjaihoz. Tagjai azonban hozzáférhetnek az alaposztály nyilvános és védett tagjaihoz. Ez ugyanaz, mint amikor a származtatott osztály nyilvánossá válik.

jegyzet : a nyilvános származtatott osztály védett tagja hozzáférhet az alaposztály védett tagjához.

Privát származtatott osztály nyilvános tagokkal
Cserélje le a védett specifikátort privátra a fenti származtatott osztály deklarációjában, az alábbiak szerint:

osztályChildCla: magánTheCla{}

Fordítsa le és futtassa a programot, és vegye figyelembe, hogy az eredmény ugyanaz, mint korábban.

Tehát, amikor az egész származtatott osztályt nyilvánossá nyilvánítják, tagjai nem férhetnek hozzá az alaposztály privát tagjaihoz. Tagjai azonban hozzáférhetnek az alaposztály nyilvános és védett tagjaihoz. Ez ugyanaz, mint amikor a származtatott osztályt védetté vagy nyilvánossá nyilvánítják.

Nyilvános származtatott osztály védett tagokkal
Írja be, fordítsa le és futtassa a következő programot, amelyben a teljes származtatott osztály és tagjai is védettek. Néhány kódszegmens a következő:

#befoglalni
segítségével névtérórák;

osztályTheCla
{
nyilvános:
intszám1= 10;
védett:
intszám2= húsz;
magán:
intszám3= 30;
};

osztályChildCla: nyilvánosTheCla
{
védett:
intmódszer1()
{
Visszatérésszám1;
}
intmódszer2()
{
Visszatérésszám2;
}
/*int metódus3 ()
{
return szám3;
} * /

};

intfő-()
{
/*ChildCla childObj;
int no1 = gyermekObj.metod1 ();
költség<
/*int no2 = gyermekObj.metod2 ();
költség<
Visszatérés 0;
}

A program úgy működik, ahogy van. Nincs kimenet, és állítólag nincs kimenet sem, a program begépelésének módja alapján.

Most szüntesse meg a megjegyzést a metódus3 () függvénydefinícióval a származtatott osztályban. Ha megpróbálja lefordítani a programot, vegye figyelembe, hogy nem fordítja le, és hibaüzenetet ad. Ez azt jelenti, hogy egy privát tag nem érhető el külső funkcióból, külső operátorból vagy származtatott osztályból. Ez ugyanaz a következtetés, mint a fentiekben levont következtetés a magánszemélyhez való hozzáférés tekintetében.

jegyzet : a védett származtatott osztály védett tagja hozzáférhet az alaposztály védett tagjához.

Most helyezze vissza a megjegyzéseket a származtatott osztályba, és távolítsa el a megjegyzést a main () függvény első kódszegmenséből. Ha megpróbálja lefordítani a programot, vegye figyelembe, hogy a program nem fordítja le a fő () függvény első kódszegmense miatt. Ez a hatás nem új. A származtatott osztályon, a külső függvényeken és a külső operátorokon kívül az (alap vagy származtatott) osztály védett és privát tagjai azonos specifikációjúak, privátok. A fő () függvény látja bármely osztály védett tagját, legyen az alap vagy származtatott, ugyanazon specifikátor, privát, és tilos hozzáférni hozzá.

Ha a main () függvény második kódszegmensének megjegyzése megszűnik, ugyanez a magyarázat érvényes. Vagyis a fő () függvény nem lesz képes hozzáférni a származtatott osztály vagy az alaposztály védett vagy privát tagjához. Ez független attól, hogy a származtatott osztály védett tagja hozzáférhet -e az alaposztály védett tagjához.

Védett származtatott osztály védett tagokkal
Cserélje ki a nyilvános specifikátort védettre a fenti származtatott osztály deklarációjában, az alábbiak szerint:

osztályChildCla: védettTheCla{}

Tegye vissza a kódszegmensek megjegyzését a main () függvénybe, ha ez még nem történt meg. Fordítsa le és futtassa a programot, és vegye figyelembe, hogy az eredmény olyan, mint korábban.

Privát származtatott osztály védett tagokkal
Cserélje le a védett specifikátort privátra a fenti származtatott osztály deklarációjában, az alábbiak szerint:

osztályChildCla: magánTheCla

Fordítsa le és futtassa a programot, és vegye figyelembe, hogy az eredmény olyan lesz, mint korábban.

Nyilvános származású osztály magántagokkal
Cserélje le a privát specifikátort nyilvánosra a fenti származtatott osztály deklarációjában, az alábbiak szerint:

osztályChildCla: nyilvánosTheCla{}

A származtatott osztály tagjait tegye priváttá. Fordítsa le és futtassa a programot. Az eredmény nem különbözik a Nyilvános származtatott osztály védett tagokkal esettől.

Védett származtatott osztály magántagokkal
Cserélje ki a nyilvános specifikátort védettre a fenti származtatott osztály deklarációjában, az alábbiak szerint:

osztályChildCla: védettTheCla{}

Fordítsa le és futtassa a programot. Ez az eredmény nem különbözik a Védett származtatott osztály védett tagokkal esettől.

Privát származtatott osztály privát tagokkal
Cserélje le a védett specifikátort privátra a fenti származtatott osztály deklarációjában, az alábbiak szerint:

osztályChildCla: magánTheCla{}

Fordítsa le és futtassa a programot. Ez az eredmény nem különbözik a privát származékos osztály védett tagokkal esetétől.

Következtetés

A C ++ hozzáférési specifikátorok a privát, védett és nyilvános szavak. Ők döntenek az osztály tagjainak hozzáféréséről. A hozzáférési specifikátor régiója a címkéjétől az osztályleírás (definíció) végéig vagy egy másik hozzáférési specifikátor kezdetéig kezdődik. Az osztály bármely tagja hozzáférhet ugyanazon osztály bármely más tagjához. Egy osztály privát tagjához semmilyen külső funkció, külső operátor vagy származtatott osztály nem férhet hozzá.

Az alaposztály tagját védetté kell tenni, hogy az alaposztály privát tagjához a származtatott osztály tagja hozzáférhessen. Az alaposztály ezen védett tagját az alaposztály privát tagjának tekinti egy külső funkció vagy egy külső operátor.

Az osztály nyilvános tagjához bármely külső funkció, bármely külső operátor vagy származtatott osztály hozzáférhet.

Ha nincs hozzáférési specifikátor az osztályban, akkor a privát specifikátort kell feltételezni. Vagyis az alapértelmezett hozzáférési specifikátor privát.

Ebben a munkában használt hivatkozások