C++

Specyfikatory dostępu C++

Specyfikatory dostępu C++
W C++ klasa jest zbiorem zmiennych i funkcji, które zostały skonfigurowane do współpracy. Gdy zmiennym klasy są podane wartości, otrzymujemy obiekt. Obiekt ma te same zmienne i funkcje co klasa, ale tym razem zmienne mają wartości. Z jednej klasy można stworzyć wiele obiektów. Jeden obiekt różni się od innego obiektu w zależności od innego zestawu wartości przypisanych do zmiennych drugiego obiektu. Mówi się, że tworzenie obiektu z klasy jest tworzeniem instancji obiektu. Nawet jeśli dwa różne obiekty mają te same wartości dla swoich zmiennych, te obiekty są różnymi bytami, identyfikowanymi przez różne nazwy w programie. Zmienne obiektu i odpowiadającej mu klasy nazywane są członkami danych. Funkcje obiektu i odpowiadającej mu klasy nazywamy funkcjami składowymi. Członkowie danych i funkcje członkowskie są nazywane członkami.

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

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:

#zawierać
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<//int nr1 = obj.numer1;
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:

klasa TheCla

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:

#zawierać
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<int nr2 = childObj.metoda2();
Cout<zwróć 0;

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 TheCla

Teraz 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:

class ChildCla : chronione TheCla

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:

class ChildCla : prywatny TheCla

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:

#zawierać
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</*int no2 = childObj.metoda2();
Cout<zwróć 0;

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:

class ChildCla : chronione TheCla

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:

klasa ChildCla : prywatny TheCla

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:

class ChildCla : public TheCla

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:

class ChildCla : chronione TheCla

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:

class ChildCla : prywatny TheCla

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
Gry SuperTuxKart for Linux
SuperTuxKart for Linux
SuperTuxKart is a great title designed to bring you the Mario Kart experience free of charge on your Linux system. It is pretty challenging and fun to...
Gry Battle for Wesnoth Tutorial
Battle for Wesnoth Tutorial
The Battle for Wesnoth is one of the most popular open source strategy games that you can play at this time. Not only has this game been in developmen...
Gry 0 A.D. Tutorial
0 A.D. Tutorial
Out of the many strategy games out there, 0 A.D. manages to stand out as a comprehensive title and a very deep, tactical game despite being open sourc...