Słowo dostęp oznacza odczytywanie lub zmianę wartości zmiennej, a także użycie funkcji. Specyfikatorami dostępu w języku C++ są słowa „prywatny”, „chroniony” i „publiczny”.Decydują, czy członek może uzyskać dostęp do innych członków swojej klasy, czy też funkcja lub operator spoza klasy i nienależące do klasy może uzyskać dostęp do dowolnego członka klasy. Decydują również, czy członek klasy pochodnej (podrzędnej) może uzyskać dostęp do członka klasy nadrzędnej.
Do zrozumienia tego artykułu i przetestowania dostarczonego kodu wymagana jest podstawowa znajomość C++.
Treść artykułu
- Specyfikatory publiczne i prywatne
- Chroniony specyfikator
- Specyfikatory klas pochodnych i specyfikatory składowe
- Wniosek
Specyfikatory publiczne i prywatne
Klasa
Każdy członek klasy może uzyskać dostęp do dowolnego innego członka tej samej klasy, niezależnie od tego, który jest oznaczony jako „publiczny” lub „prywatny.Rozważ następujący program:
przy użyciu standardowej przestrzeni nazw;
klasa TheCla
prywatny:
int numer1;
int num2;
publiczny:
TheCla(int n1, int n2)
liczba1 = n1; liczba2 = n2;
int metoda()
zwróć num1;
;
int main()
TheCla obj(10, 20);
int nr2 = obj.metoda();
Cout<
zwróć 0;
Wyjście to 10. Członkowie prywatni to num1 i num2. Członkami publicznymi są TheCla() i method(). Zauważ, że TheCla() jest funkcją konstruktora, która inicjuje zmienne będące przedmiotem zainteresowania. Region specyfikatora dostępu zaczyna się od jego etykiety do końca opisu klasy (definicji) lub do początku innego specyfikatora dostępu.
W funkcji main() pierwsza instrukcja jest instancją zawierającą funkcję konstruktora, która inicjuje num1 i num2. Następna instrukcja wywołuje publiczny element, method(), klasy.
Teraz, w opisie klasy (definicji), publiczna funkcja składowa TheCla() uzyskuje dostęp do prywatnych składowych num1 i num2. Ponadto funkcja elementu publicznego, method(), uzyskuje dostęp do elementu prywatnego, num1. Dowolny element członkowski w opisie klasy może uzyskać dostęp do dowolnego innego elementu członkowskiego w ramach tego samego opisu klasy; nie ma znaczenia, który członek jest prywatny czy publiczny.
Jednak funkcja lub operator nie zadeklarowany w opisie klasy i poza opisem klasy może uzyskać dostęp tylko do publicznych członków klasy. Na przykład funkcja main() jest funkcją zadeklarowaną poza opisem klasy. Był w stanie uzyskać dostęp tylko do metod() i publicznych członków TheCla(). Wewnątrz funkcji main() funkcja TheCla() to obj(10, 20).
Funkcja zewnętrzna lub operator zewnętrzny, taki jak funkcja main(), nie może uzyskać dostępu do żadnego z prywatnych elementów klasy, takich jak num1 lub num2. Usuń wskaźnik komentarza, //, z przedostatniej instrukcji w main(). Jeśli spróbujesz skompilować program, zauważ, że program się nie skompiluje, wyświetlając komunikat o błędzie.
Domyślny specyfikator
Domyślnym specyfikatorem klasy jest „prywatna”.” Tak więc powyższy opis klasy jest taki sam jak następujący, prywatny, ale bez specyfikatora:
int numer1;
wewn num2;
publiczny:
TheCla(int n1, int n2)
liczba1 = n1; liczba2 = n2;
int metoda()
zwróć numer1;
;
Uwaga: etykieta specyfikatora dostępu zaczyna się od specyfikatora, po którym następuje dwukropek.
Chroniony specyfikator
W opisie klasy i z funkcji zewnętrznej lub operatora zewnętrznego chroniony specyfikator jest taki sam jak specyfikator prywatny. Teraz zastąp specyfikator private w powyższym programie specyfikatorem, chroń i usuń wskaźnik komentarza, //, z przedostatniej instrukcji w funkcji main(). Jeśli spróbujesz skompilować program, zauważ, że program się nie skompiluje, wyświetlając komunikat o błędzie.
Problem chronionego specyfikatora pojawia się, gdy członkowie klasy pochodnej (dziedziczonej) muszą uzyskać dostęp do członków klasy bazowej (rodzicielskiej).
Klasa pochodna publiczna z członkami publicznymi
Rozważ następujący program:
przy użyciu standardowej przestrzeni nazw;
klasa TheCla
publiczny:
int liczba1 = 10;
chroniony:
int liczba2 = 20;
prywatny:
int liczba3 = 30;
;
klasa ChildCla : publiczne TheCla
publiczny:
int metoda1()
zwróć num1;
int metoda2()
zwróć num2;
/*int metoda3()
zwróć num3;
*/
;
int main()
ChildCla childObj;
int nr1 = childObj.metoda1();
Cout<
Cout<
Dane wyjściowe to:
10
20
W klasie bazowej num1 jest publiczne, num2 jest chronione, a num3 jest prywatne. W klasie pochodnej wszystkie funkcje składowe są publiczne. Pierwsza funkcja, method1(), uzyskuje dostęp do publicznej składowej danych, num1. Druga funkcja, method2(), uzyskuje dostęp do chronionego elementu danych, num2. Trzecia funkcja, method3(), chociaż obecnie zakomentowana, powinna uzyskać dostęp do prywatnego elementu danych, num3.
Klasa pochodna nie jest zadeklarowana bez specyfikatora dostępu (publiczny, chroniony lub prywatny). Powyżej klasa pochodna jest zadeklarowana ze specyfikatorem public, czyli:
class ChildCla : public TheClaTeraz odkomentuj trzecią definicję funkcji składowej w klasie pochodnej. Jeśli spróbujesz skompilować program, zauważ, że się nie skompiluje, co spowoduje wyświetlenie komunikatu o błędzie.
Uwaga: Gdy cała klasa pochodna jest zadeklarowana jako publiczna, jej członkowie nie mogą uzyskać dostępu do prywatnych członków klasy bazowej. Jego członkowie mogą jednak uzyskać dostęp do publicznych i chronionych członków klasy bazowej base. Powyższy program ilustruje to.
Należy jednak pamiętać, że publiczny element członkowski publicznej klasy pochodnej może uzyskać dostęp do chronionego elementu członkowskiego klasy bazowej.
Specyfikatory klas pochodnych i specyfikatory składowe
Chroniona klasa pochodna z członkami publicznymi
Zastąp specyfikator „public” słowem „protected” w powyższej deklaracji klasy pochodnej w następujący sposób:
Skompiluj i uruchom program i zauważ, że wynik jest taki sam jak poprzednio.
Tak więc, gdy cała klasa pochodna jest zadeklarowana jako chroniona, jej członkowie nie mogą uzyskać dostępu do prywatnych członków klasy bazowej. Jego członkowie mogą jednak uzyskać dostęp do publicznych i chronionych członków klasy bazowej base. To jest tak samo, jak wtedy, gdy klasa pochodna jest zadeklarowana jako public.
Uwaga: chroniony element członkowski publicznej klasy pochodnej może uzyskać dostęp do chronionego elementu członkowskiego klasy bazowej.
Prywatna klasa pochodna z członkami publicznymi
Zastąp specyfikator „protected” słowem „private” w deklaracji klasy pochodnej powyżej w następujący sposób:
Skompiluj i uruchom program i zauważ, że wynik jest taki sam jak poprzednio.
Tak więc, gdy cała klasa pochodna jest zadeklarowana jako prywatna, jej członkowie nie mogą uzyskać dostępu do prywatnych członków klasy bazowej. Jego członkowie mogą jednak uzyskać dostęp do publicznych i chronionych członków klasy bazowej base. To jest to samo, gdy klasa pochodna jest zadeklarowana jako chroniona lub publiczna.
Publiczna klasa pochodna z chronionymi członkami
Wpisz, skompiluj i uruchom następujący program, w którym cała klasa pochodna jest chroniona, a jej elementy członkowskie są również chronione. Niektóre segmenty kodu są następujące:
przy użyciu standardowej przestrzeni nazw;
klasa TheCla
publiczny:
int liczba1 = 10;
chroniony:
int liczba2 = 20;
prywatny:
int liczba3 = 30;
;
klasa ChildCla : publiczne TheCla
chroniony:
int metoda1()
zwróć num1;
int metoda2()
zwróć num2;
/*int metoda3()
zwróć num3;
*/
;
int main()
/*ChildCla childObj;
int nr1 = childObj.metoda1();
Cout<
Cout<
Program działa tak, jak jest. Nie ma wyjścia i nie powinno być żadnego wyjścia, w zależności od tego, jak program został napisany.
Teraz odkomentuj definicję funkcji, method3(), w klasie pochodnej. Jeśli spróbujesz skompilować program, zauważ, że się nie skompiluje, co spowoduje wyświetlenie komunikatu o błędzie. Oznacza to, że prywatny element członkowski nie może być dostępny z funkcji zewnętrznej, operatora zewnętrznego lub klasy pochodnej. Jest to ten sam wniosek, który wywnioskowano powyżej, w odniesieniu do dostępu do członka prywatnego.
Uwaga: chroniony element członkowski chronionej klasy pochodnej może uzyskać dostęp do chronionego elementu członkowskiego klasy bazowej.
Teraz umieść komentarze z powrotem w klasie pochodnej i odkomentuj pierwszy segment kodu w funkcji main(). Jeśli spróbujesz skompilować program, zauważ, że program nie skompiluje się z powodu pierwszego segmentu kodu w funkcji main(). Ten efekt nie jest nowy. Oprócz klasy pochodnej, funkcji zewnętrznych i operatorów zewnętrznych, chronione i prywatne elementy klasy (podstawowej lub pochodnej) mają ten sam specyfikator, private. Funkcja main() widzi chronionego członka dowolnej klasy, zarówno podstawowej, jak i pochodnej, jako tego samego specyfikatora, prywatnego i nie ma do niego dostępu.
Jeśli drugi segment kodu funkcji main() nie zostanie zakomentowany, zastosowanie będzie miało to samo wyjaśnienie. Oznacza to, że funkcja main() nie będzie mogła uzyskać dostępu do chronionego lub prywatnego elementu członkowskiego klasy pochodnej lub klasy bazowej. Jest to niezależne od tego, czy chroniony element członkowski klasy pochodnej może uzyskać dostęp do chronionego elementu członkowskiego klasy bazowej.
Chroniona klasa pochodna z chronionymi członkami
Zastąp specyfikator „public” słowem „protected” w deklaracji klasy pochodnej powyżej w następujący sposób:
Umieść komentarz segmentów kodu z powrotem w funkcji main(), jeśli nie zostało to jeszcze zrobione. Skompiluj i uruchom program i zauważ, że wynik jest taki, jak poprzednio.
Prywatna klasa pochodna z chronionymi członkami
Zastąp specyfikator „protected” słowem „private” w deklaracji klasy pochodnej powyżej w następujący sposób:
Skompiluj i uruchom program i zauważ, że wynik będzie taki jak poprzednio.
Publiczna klasa pochodna z członkami prywatnymi
Zamień specyfikator „private” na „public” w powyższej deklaracji klasy pochodnej w następujący sposób:
Uczyń członków klasy pochodnej prywatnymi. Skompiluj i uruchom program. Wynik nie różni się od przypadku „Publiczna klasa pochodna z chronionymi członkami”.
Chroniona klasa pochodna z członkami prywatnymi
Zastąp specyfikator „public” słowem „protected” w powyższej deklaracji klasy pochodnej w następujący sposób:
Skompiluj i uruchom program. Ten wynik nie różni się od przypadku „Protected Derived Class with Protected Members”.
Prywatna klasa pochodna z prywatnymi członkami
Zastąp specyfikator „protected” słowem „private” w deklaracji klasy pochodnej powyżej w następujący sposób:
Skompiluj i uruchom program. Ten wynik nie różni się od przypadku „Prywatnej klasy pochodnej z chronionymi członkami””.
Wniosek
Specyfikatorami dostępu C++ są słowa „prywatny”, „chroniony” i „publiczny.” Decydują o dostępie dla członków klasy. Region specyfikatora dostępu zaczyna się od jego etykiety, do końca opisu klasy (definicji) lub do początku innego specyfikatora dostępu. Każdy członek klasy może uzyskać dostęp do dowolnego innego członka tej samej klasy. Dostęp do prywatnego członka klasy nie może uzyskać żadna funkcja zewnętrzna, żaden operator zewnętrzny ani klasa pochodna.
Składowa klasy bazowej musi być chroniona, aby prywatny członek klasy bazowej był dostępny dla członka klasy pochodnej. Ten chroniony element klasy bazowej jest postrzegany jako prywatny element klasy bazowej przez funkcję zewnętrzną lub zewnętrzny operator.
Dostęp do publicznego członka klasy można uzyskać za pomocą dowolnej funkcji zewnętrznej, dowolnego operatora zewnętrznego lub klasy pochodnej.
W przypadku braku jakiegokolwiek specyfikatora dostępu w klasie, zakładany jest specyfikator prywatny. Oznacza to, że domyślnym specyfikatorem dostępu jest prywatny.
Referencje użyte w tej pracy
- Alireza Ebrahimi, DZIEDZICTWO: MOŻLIWOŚĆ PONOWNEGO WYKORZYSTANIA I ROZSZERZENIA
- S. Malik, Struktury danych w języku C++ druga edycja