Specifikátory přístupu C ++

C Access Specifiers



V jazyce C ++ je třída sada proměnných a funkcí, které byly nakonfigurovány tak, aby spolupracovaly. Když jsou proměnným třídy dány hodnoty, získá se objekt. Objekt má stejné proměnné a funkce jako třída, ale tentokrát mají proměnné hodnoty. Z jedné třídy lze vytvořit mnoho objektů. Jeden objekt se liší od jiného objektu podle různé sady hodnot přiřazených proměnným druhého objektu. Vytváření objektu ze třídy se říká o instanci objektu. I když dva různé objekty mají pro své proměnné stejné hodnoty, tyto objekty jsou různé entity, identifikované různými názvy v programu. Proměnné pro objekt a jeho odpovídající třídu se nazývají datové členy. Funkce objektu a jeho odpovídající třídy se nazývají členské funkce. Datové členy a členské funkce se nazývají členy.

Slovo přístup znamená číst nebo měnit hodnotu proměnné a také to znamená používat funkci. Specifikátory přístupu v jazyce C ++ jsou slova, soukromá, chráněná a veřejná. Rozhodují, zda má člen přístup k ostatním členům své třídy, nebo zda má funkce nebo operátor mimo třídu, které do třídy nepatří, přístup k jakémukoli členovi třídy. Také rozhodují, zda člen odvozené (podřízené) třídy může přistupovat ke členu nadřazené třídy.







K pochopení tohoto článku a k otestování poskytnutého kódu jsou nutné základní znalosti C ++.



Obsah článku

Veřejné a soukromé specifikátory

Třída
Každý člen třídy má přístup k jakémukoli jinému členovi téže třídy, bez ohledu na to, který je označen jako veřejný nebo soukromý. Zvažte následující program:



#zahrnout
použitím jmenný prostorhodiny;

třídaTheCla
{
soukromé:
intčíslo 1;
intnum2;
veřejnost:
TheCla(intn1,intn2)
{
číslo 1=n1;num2=n2;
}
intmetoda()
{
vrátit sečíslo 1;
}
};

inthlavní()
{
TheCla obj(10,dvacet);
intč. 2=obj.metoda();
náklady<<č. 2<<' n';

// int no1 = obj.num1;

vrátit se 0;
}

Výstup je 10. Soukromí členové jsou num1 a num2. Veřejnými členy jsou TheCla () a method (). Všimněte si, že TheCla () je funkce konstruktoru, která inicializuje požadované proměnné. Oblast specifikátoru přístupu začíná od jeho označení na konec popisu třídy (definice) nebo na začátek jiného specifikátoru přístupu.





Ve funkci main () je prvním příkazem instance zahrnující funkci konstruktoru, která inicializuje num1 a num2. Další příkaz volá veřejného člena třídy (metoda ()).

Nyní, v popisu třídy (definice), veřejná členská funkce, TheCla (), přistupuje k soukromým členům, num1 a num2. Veřejná členská funkce, metoda (), také přistupuje k soukromému členovi, číslo 1. Jakýkoli člen v popisu třídy má přístup k jakémukoli jinému členovi v rámci stejného popisu třídy; nezáleží na tom, který člen je soukromý nebo veřejný.



Funkce nebo operátor, které nejsou deklarovány v popisu třídy a mimo popis třídy, však mají přístup pouze k veřejným členům třídy. Funkce main () je například funkce deklarovaná mimo popis třídy. Má přístup pouze k veřejným členům metody () a TheCla (). Uvnitř funkce main () je funkce TheCla () obj (10, 20).

Externí funkce nebo externí operátor, jako je například funkce main (), nemůže přistupovat k žádným soukromým členům třídy, například num1 nebo num2. Odeberte indikátor komentáře // z příkazu last-but-one v main (). Pokusíte -li se program zkompilovat, mějte na paměti, že se program nezkompiluje a zobrazí se chybová zpráva.

Výchozí specifikátor
Výchozí specifikátor pro třídu je soukromý. Výše uvedený popis třídy je tedy stejný jako následující popis, soukromý, ale bez specifikátoru:

třídaTheCla
{
intčíslo 1;
intnum2;
veřejnost:
TheCla(intn1,intn2)
{
číslo 1=n1;num2=n2;
}
intmetoda()
{
vrátit sečíslo 1;
}
};

Poznámka : popisek specifikátoru přístupu začíná specifikátorem a za ním následuje dvojtečka.

Chráněný specifikátor

V rámci popisu třídy a od vnější funkce nebo od externího operátora je chráněný specifikátor stejný jako soukromý specifikátor. Nyní nahraďte soukromý specifikátor ve výše uvedeném programu specifikátorem, chráňte a odstraňte indikátor komentáře // z příkazu last-but-one ve funkci main (). Pokusíte -li se program zkompilovat, mějte na paměti, že se program nezkompiluje a zobrazí se chybová zpráva.

Problém chráněného specifikátoru nastává, když členové odvozené (zděděné) třídy musí přistupovat ke členům základní (nadřazené) třídy.

Veřejně odvozená třída s veřejnými členy
Zvažte následující program:

#zahrnout
použitím jmenný prostorhodiny;

třídaTheCla
{
veřejnost:
intčíslo 1= 10;
chráněný:
intnum2= dvacet;
soukromé:
intnum3= 30;
};

třídaChildCla: veřejnostTheCla
{
veřejnost:
intmetoda 1()
{
vrátit sečíslo 1;
}
intmetoda 2()
{
vrátit senum2;
}
/*int metoda3 ()
{
vrátit num3;
} * /

};

inthlavní()
{
ChildCla dítěObj;
intč.1=dítěObj.metoda 1();
náklady<<č.1<<' n';

intč. 2=dítěObj.metoda 2();
náklady<<č. 2<<' n';

vrátit se 0;
}

Výstup je:
10
dvacet

V základní třídě je num1 veřejné, num2 je chráněno a num3 je soukromé. V odvozené třídě jsou všechny členské funkce veřejné. První funkce, method1 (), přistupuje k veřejnému datovému členu, num1. Druhá funkce, method2 (), přistupuje k chráněnému datovému členu, num2. Třetí funkce, method3 (), přestože je aktuálně komentována, by měla přistupovat k soukromému datovému členu, num3.

Odvozená třída není deklarována bez specifikátoru přístupu (veřejný, chráněný nebo soukromý). Odvozená třída je výše deklarována pomocí veřejného specifikátoru, tj.

třídaChildCla: veřejnostTheCla{}

Nyní zrušte komentář definice třetí členské funkce v odvozené třídě. Pokud se pokusíte program zkompilovat, všimněte si, že se nezkompiluje a zobrazí chybová zpráva.

Poznámka : Když je celá odvozená třída deklarována jako veřejná, její členové nemají přístup k soukromým členům základní třídy. Jeho členové však mají přístup k veřejným a chráněným členům základní třídy. Výše uvedený program to ilustruje.

Všimněte si však, že veřejný člen veřejné odvozené třídy má přístup k chráněnému členu základní třídy.

Odvozené specifikátory tříd a specifikátory členů

Chráněná odvozená třída s veřejnými členy
Veřejný specifikátor nahraďte chráněným v deklaraci odvozené třídy výše:

třídaChildCla: chráněnýTheCla{}

Zkompilujte a spusťte program a všimněte si, že výsledek je stejný jako dříve.

Když je tedy celá odvozená třída deklarována jako chráněná, její členové nemají přístup k soukromým členům základní třídy. Jeho členové však mají přístup k veřejným a chráněným členům základní třídy. To je stejné, jako když je odvozená třída deklarována jako veřejná.

Poznámka : chráněný člen veřejné odvozené třídy má přístup k chráněnému členu základní třídy.

Soukromá odvozená třída s veřejnými členy
Nahraďte chráněný specifikátor privátním v deklaraci odvozené třídy výše takto:

třídaChildCla: soukroméTheCla{}

Zkompilujte a spusťte program a všimněte si, že výsledek je stejný jako dříve.

Když je tedy celá odvozená třída prohlášena za soukromou, její členové nemají přístup k soukromým členům základní třídy. Jeho členové však mají přístup k veřejným a chráněným členům základní třídy. To je stejné, jako když je odvozená třída deklarována jako chráněná nebo veřejná.

Veřejně odvozená třída s chráněnými členy
Zadejte, zkompilujte a spusťte následující program, ve kterém je chráněna celá odvozená třída a jsou chráněni i její členové. Některé segmenty kódu jsou následující:

#zahrnout
použitím jmenný prostorhodiny;

třídaTheCla
{
veřejnost:
intčíslo 1= 10;
chráněný:
intnum2= dvacet;
soukromé:
intnum3= 30;
};

třídaChildCla: veřejnostTheCla
{
chráněný:
intmetoda 1()
{
vrátit sečíslo 1;
}
intmetoda 2()
{
vrátit senum2;
}
/*int metoda3 ()
{
vrátit num3;
} * /

};

inthlavní()
{
/*ChildCla childObj;
int no1 = childObj.method1 ();
náklady<
/*int no2 = childObj.method2 ();
náklady<
vrátit se 0;
}

Program funguje tak, jak je. Neexistuje žádný výstup a nemá být žádný výstup podle toho, jak byl program napsán.

Nyní zrušte komentář definice funkce, method3 (), v odvozené třídě. Pokud se pokusíte program zkompilovat, všimněte si, že se nezkompiluje a zobrazí chybová zpráva. To znamená, že k soukromému členovi nelze přistupovat z vnější funkce, externího operátora nebo odvozené třídy. Jedná se o stejný závěr, jaký byl učiněn výše, týkající se přístupu k soukromému členovi.

Poznámka : chráněný člen chráněné odvozené třídy má přístup k chráněnému členu základní třídy.

Nyní vložte komentáře zpět do odvozené třídy a zrušte komentář u prvního segmentu kódu ve funkci main (). Pokud se pokusíte program zkompilovat, všimněte si, že program nebude kompilovat kvůli prvnímu segmentu kódu ve funkci main (). Tento efekt není nový. Kromě odvozené třídy, vnějších funkcí a vnějších operátorů mají chránění a soukromí členové (základní nebo odvozené) třídy stejný specifikátor, soukromý. Funkce main () vidí chráněného člena jakékoli třídy, ať už základní nebo odvozené, podle stejného specifikátoru, soukromého, a má k ní zakázaný přístup.

Pokud je druhý segment kódu funkce main () bez komentáře, bude platit stejné vysvětlení. To znamená, že funkce main () nebude mít přístup k chráněnému nebo soukromému členu odvozené třídy nebo základní třídy. To je nezávislé na tom, zda chráněný člen odvozené třídy mohl přistupovat k chráněnému členu základní třídy.

Chráněná odvozená třída s chráněnými členy
Veřejný specifikátor nahraďte chráněným v deklaraci odvozené třídy výše:

třídaChildCla: chráněnýTheCla{}

Vložte komentář segmentů kódu zpět do funkce main (), pokud to již nebylo provedeno. Zkompilujte a spusťte program a všimněte si, že výsledek je jako dříve.

Soukromá odvozená třída s chráněnými členy
Nahraďte chráněný specifikátor privátním v deklaraci odvozené třídy výše takto:

třídaChildCla: soukroméTheCla

Zkompilujte a spusťte program a všimněte si, že výsledek bude jako dříve.

Veřejně odvozená třída se soukromými členy
Nahraďte soukromý specifikátor veřejným v deklaraci odvozené třídy výše takto:

třídaChildCla: veřejnostTheCla{}

Nastavit členy odvozené třídy jako soukromé. Zkompilujte a spusťte program. Výsledek se neliší od případu Public Derived Class with Protected Members.

Chráněná odvozená třída se soukromými členy
Veřejný specifikátor nahraďte chráněným v deklaraci odvozené třídy výše:

třídaChildCla: chráněnýTheCla{}

Zkompilujte a spusťte program. Tento výsledek se neliší od případu Protected Derived Class with Protected Members.

Soukromá odvozená třída se soukromými členy
Nahraďte chráněný specifikátor privátním v deklaraci odvozené třídy výše takto:

třídaChildCla: soukroméTheCla{}

Zkompilujte a spusťte program. Tento výsledek se neliší od případu Soukromá odvozená třída s chráněnými členy.

Závěr

Specifikátory přístupu C ++ jsou slova private, protected a public. Rozhodují o přístupu pro členy třídy. Oblast specifikátoru přístupu začíná od jeho označení, na konec popisu třídy (definice) nebo na začátek jiného specifikátoru přístupu. Každý člen třídy má přístup k jakémukoli jinému členovi téže třídy. K soukromému členovi třídy nemůže přistupovat žádná vnější funkce, žádný externí operátor ani odvozená třída.

Člen základní třídy musí být chráněn, aby k členu odvozené třídy měl přístup soukromý člen základní třídy. Tento chráněný člen základní třídy je externí funkcí nebo externím operátorem vnímán jako soukromý člen základní třídy.

K veřejnému členovi třídy může přistupovat jakákoli vnější funkce, jakýkoli externí operátor nebo odvozená třída.

Při absenci jakéhokoli specifikátoru přístupu ve třídě se předpokládá soukromý specifikátor. To znamená, že výchozí specifikátor přístupu je soukromý.

Reference použité v této práci