Das Wort Zugriff bedeutet, den Wert einer Variablen zu lesen oder zu ändern, und es bedeutet auch, eine Funktion zu verwenden. C++-Zugriffsspezifizierer sind die Wörter „private“, „protected“ und „public“.” Sie entscheiden, ob ein Mitglied auf andere Mitglieder seiner Klasse zugreifen kann, oder ob eine Funktion oder ein Operator außerhalb der Klasse und nicht zur Klasse gehört auf jedes Mitglied der Klasse zugreifen kann. Sie entscheiden auch, ob ein Mitglied einer abgeleiteten (untergeordneten) Klasse auf ein Mitglied einer übergeordneten Klasse zugreifen kann.
Grundkenntnisse in C++ sind erforderlich, um diesen Artikel zu verstehen und den bereitgestellten Code zu testen.
Artikelinhalt
- Die öffentlichen und privaten Spezifizierer
- Der geschützte Spezifizierer
- Abgeleitete Klassenspezifizierer und Memberspezifizierer
- Fazit
Die öffentlichen und privaten Spezifizierer
Klasse
Jedes Mitglied einer Klasse kann auf jedes andere Mitglied derselben Klasse zugreifen, unabhängig davon, ob es „öffentlich“ oder „privat“ ist.” Betrachten Sie das folgende Programm:
Verwenden von Namespace-Std;
Klasse TheCla
Privatgelände:
int num1;
int num2;
Öffentlichkeit:
TheCla(int n1, int n2)
Anzahl1 = n1; Anzahl2 = n2;
int-Methode ()
Rückgabezahl1;
;
int main()
TheCla obj(10, 20);
int no2 = obj.Methode();
cout<
0 zurückgeben;
Die Ausgabe ist 10. Die privaten Mitglieder sind num1 und num2. Die öffentlichen Mitglieder sind TheCla() und method(). Beachten Sie, dass TheCla() die Konstruktorfunktion ist, die interessierende Variablen initialisiert. Der Bereich eines Zugriffsspezifizierers beginnt von seinem Label bis zum Ende der Klassenbeschreibung (Definition) oder bis zum Anfang eines anderen Zugriffsspezifizierers.
In der Funktion main() ist die erste Anweisung die Instanziierung mit der Konstruktorfunktion, die num1 und num2 initialisiert. Die nächste Anweisung ruft den öffentlichen Member method() der Klasse auf.
Nun greift in der Klassenbeschreibung (Definition) die öffentliche Memberfunktion TheCla() auf die privaten Member num1 und num2 zu. Außerdem greift die öffentliche Memberfunktion method() auf das private Member num1 . zu. Jedes Mitglied innerhalb einer Klassenbeschreibung kann auf jedes andere Mitglied innerhalb derselben Klassenbeschreibung zugreifen; Es spielt keine Rolle, welches Mitglied privat oder öffentlich ist.
Eine Funktion oder ein Operator, die nicht in der Klassenbeschreibung und außerhalb der Klassenbeschreibung deklariert sind, kann jedoch nur auf öffentliche Mitglieder der Klasse zugreifen. Die Funktion main() zum Beispiel ist eine Funktion, die außerhalb der Klassenbeschreibung deklariert ist. Es konnte nur auf method() und die öffentlichen Mitglieder von TheCla() zugreifen. Innerhalb der Funktion main() ist die Funktion TheCla() obj(10, 20).
Eine externe Funktion oder ein externer Operator wie die Funktion main() kann nicht auf die privaten Member der Klasse zugreifen, wie z. B. num1 oder num2. Entfernen Sie den Kommentarindikator // aus der vorletzten Anweisung in main(). Wenn Sie versuchen, das Programm zu kompilieren, beachten Sie, dass das Programm nicht kompiliert wird und eine Fehlermeldung ausgibt.
Standardbezeichner
Der Standardbezeichner für eine Klasse ist "private".” Die obige Klassenbeschreibung ist also dieselbe wie die folgende Beschreibung, privat, aber ohne den Bezeichner:
int num1;
int num2;
Öffentlichkeit:
TheCla(int n1, int n2)
Anzahl1 = n1; Anzahl2 = n2;
int-Methode ()
Rückgabezahl1;
;
Hinweis: Die Bezeichnung des Zugriffsbezeichners beginnt mit dem Bezeichner, gefolgt von einem Doppelpunkt.
Der geschützte Spezifizierer
Innerhalb einer Klassenbeschreibung und von einer externen Funktion oder einem externen Operator ist der geschützte Bezeichner derselbe wie der private Bezeichner. Ersetzen Sie nun den privaten Bezeichner im obigen Programm durch den Bezeichner, schützen und entfernen Sie den Kommentarindikator // aus der vorletzten Anweisung in der main()-Funktion. Wenn Sie versuchen, das Programm zu kompilieren, beachten Sie, dass das Programm nicht kompiliert wird und eine Fehlermeldung ausgibt.
Das Problem des geschützten Bezeichners tritt auf, wenn Mitglieder der abgeleiteten (geerbten) Klasse auf Mitglieder der Basisklasse (Elternklasse) zugreifen müssen.
Öffentliche abgeleitete Klasse mit öffentlichen Mitgliedern
Betrachten Sie das folgende Programm:
Verwenden von Namespace-Std;
Klasse TheCla
Öffentlichkeit:
int num1 = 10;
geschützt:
int num2 = 20;
Privatgelände:
int num3 = 30;
;
Klasse ChildCla : öffentlich TheCla
Öffentlichkeit:
int-Methode1()
Rückgabezahl1;
int-Methode2()
Rückgabezahl2;
/*int-Methode3()
Rückgabenummer3;
*/
;
int main()
ChildCla childObj;
int no1 = childObj.Methode 1();
cout<
cout<
Die Ausgabe ist:
10
20
In der Basisklasse ist num1 öffentlich, num2 ist geschützt und num3 ist privat. In der abgeleiteten Klasse sind alle Memberfunktionen öffentlich. Die erste Funktion method1() greift auf den öffentlichen Datenmember num1 . zu. Die zweite Funktion method2() greift auf das geschützte Datenelement num2 . zu. Die dritte Funktion, method3(), sollte, obwohl sie derzeit auskommentiert ist, auf den privaten Datenmember num3 . zugreifen.
Eine abgeleitete Klasse wird nicht ohne Zugriffsbezeichner (öffentlich, geschützt oder privat) deklariert. Oben wird die abgeleitete Klasse mit dem öffentlichen Bezeichner deklariert, d. h.:
Klasse ChildCla : public TheClaEntkommentieren Sie nun die dritte Memberfunktionsdefinition in der abgeleiteten Klasse. Wenn Sie versuchen, das Programm zu kompilieren, beachten Sie, dass es sich nicht kompilieren lässt und eine Fehlermeldung ausgibt.
Hinweis: Wenn die gesamte abgeleitete Klasse als öffentlich deklariert wird, können ihre Member nicht auf die privaten Member der Basisklasse zugreifen. Ihre Member können jedoch auf die öffentlichen und geschützten Member der Basisklasse zugreifen. Das obige Programm veranschaulicht dies.
Beachten Sie jedoch, dass ein öffentliches Mitglied der öffentlichen abgeleiteten Klasse auf ein geschütztes Mitglied der Basisklasse zugreifen kann.
Abgeleitete Klassenspezifizierer und Memberspezifizierer
Geschützte abgeleitete Klasse mit öffentlichen Membern
Ersetzen Sie in der Deklaration der abgeleiteten Klasse oben den Bezeichner „public“ durch „protected“ wie folgt:
Kompilieren Sie das Programm und führen Sie es aus und beachten Sie, dass das Ergebnis dasselbe ist wie zuvor.
Wenn also die gesamte abgeleitete Klasse als geschützt deklariert wird, können ihre Member nicht auf die privaten Member der Basisklasse zugreifen. Ihre Member können jedoch auf die öffentlichen und geschützten Member der Basisklasse zugreifen. Dies ist dasselbe, als wenn die abgeleitete Klasse als öffentlich deklariert wird.
Hinweis: Ein geschützter Member der öffentlichen abgeleiteten Klasse kann auf einen geschützten Member der Basisklasse zugreifen.
Private abgeleitete Klasse mit öffentlichen Mitgliedern
Ersetzen Sie in der Deklaration der abgeleiteten Klasse oben den Bezeichner „protected“ durch „private“ wie folgt:
Kompilieren Sie das Programm und führen Sie es aus und beachten Sie, dass das Ergebnis dasselbe ist wie zuvor.
Wenn also die gesamte abgeleitete Klasse als privat deklariert wird, können ihre Member nicht auf die privaten Member der Basisklasse zugreifen. Ihre Member können jedoch auf die öffentlichen und geschützten Member der Basisklasse zugreifen. Dies ist dasselbe wie wenn die abgeleitete Klasse als geschützt oder öffentlich deklariert wird.
Öffentliche abgeleitete Klasse mit geschützten Membern
Geben Sie das folgende Programm ein, kompilieren Sie es und führen Sie es aus, in dem die gesamte abgeleitete Klasse und ihre Member ebenfalls geschützt sind. Einige Codesegmente sind wie folgt:
Verwenden von Namespace-Std;
Klasse TheCla
Öffentlichkeit:
int num1 = 10;
geschützt:
int num2 = 20;
Privatgelände:
int num3 = 30;
;
Klasse ChildCla : öffentlich TheCla
geschützt:
int-Methode1()
Rückgabezahl1;
int-Methode2()
Rückgabezahl2;
/*int-Methode3()
Rückgabenummer3;
*/
;
int main()
/*ChildCla childObj;
int no1 = childObj.Methode 1();
cout<
cout<
Das Programm funktioniert wie es ist. Es gibt keine Ausgabe, und es soll keine Ausgabe geben, je nachdem, wie das Programm eingegeben wurde.
Entkommentieren Sie nun die Funktionsdefinition method3() in der abgeleiteten Klasse. Wenn Sie versuchen, das Programm zu kompilieren, beachten Sie, dass es sich nicht kompilieren lässt und eine Fehlermeldung ausgibt. Dies bedeutet, dass auf einen privaten Member nicht von einer externen Funktion, einem externen Operator oder einer abgeleiteten Klasse zugegriffen werden kann. Dies ist die gleiche Schlussfolgerung wie oben in Bezug auf den Zugang zu einem privaten Mitglied.
Hinweis: Ein geschützter Member der geschützten abgeleiteten Klasse kann auf einen geschützten Member der Basisklasse zugreifen.
Fügen Sie nun die Kommentare zurück in die abgeleitete Klasse und entkommentieren Sie das erste Codesegment in der main()-Funktion. Wenn Sie versuchen, das Programm zu kompilieren, beachten Sie, dass das Programm aufgrund des ersten Codesegments in der Funktion main() nicht kompiliert wird. Dieser Effekt ist nicht neu. Abgesehen von der abgeleiteten Klasse, externen Funktionen und externen Operatoren haben die geschützten und privaten Member einer (Basis- oder abgeleiteten) Klasse denselben Bezeichner, private. Die main()-Funktion sieht das geschützte Member jeder Klasse, ob base oder abgeleitet, mit demselben Spezifizierer, private, und hat keinen Zugriff darauf.
Wenn das zweite Codesegment der main()-Funktion nicht auskommentiert ist, gilt die gleiche Erklärung. Das heißt, die main()-Funktion kann nicht auf einen geschützten oder privaten Member der abgeleiteten Klasse oder der Basisklasse zugreifen. Dies ist unabhängig davon, ob ein geschützter Member der abgeleiteten Klasse auf einen geschützten Member der Basisklasse zugreifen könnte.
Geschützte abgeleitete Klasse mit geschützten Membern
Ersetzen Sie in der Deklaration der abgeleiteten Klasse oben den Bezeichner „public“ durch „protected“ wie folgt:
Fügen Sie den Kommentar der Codesegmente zurück in die main()-Funktion, falls dies noch nicht geschehen ist. Kompilieren und starten Sie das Programm und beachten Sie, dass das Ergebnis wie zuvor ist.
Private abgeleitete Klasse mit geschützten Mitgliedern
Ersetzen Sie in der Deklaration der abgeleiteten Klasse oben den Bezeichner „protected“ durch „private“ wie folgt:
Kompilieren und starten Sie das Programm und beachten Sie, dass das Ergebnis wie zuvor sein wird.
Öffentliche abgeleitete Klasse mit privaten Mitgliedern
Ersetzen Sie in der Deklaration der abgeleiteten Klasse oben den Bezeichner „private“ durch „public“ wie folgt:
Machen Sie die Member der abgeleiteten Klasse privat. Kompilieren und starten Sie das Programm. Das Ergebnis unterscheidet sich nicht vom Fall „Public Derived Class with Protected Members“.
Geschützte abgeleitete Klasse mit privaten Mitgliedern
Ersetzen Sie in der Deklaration der abgeleiteten Klasse oben den Bezeichner „public“ durch „protected“ wie folgt:
Kompilieren und starten Sie das Programm. Dieses Ergebnis unterscheidet sich nicht vom Fall „Geschützte abgeleitete Klasse mit geschützten Mitgliedern“.
Private abgeleitete Klasse mit privaten Mitgliedern
Ersetzen Sie in der Deklaration der abgeleiteten Klasse oben den Bezeichner „protected“ durch „private“ wie folgt:
Kompilieren und starten Sie das Programm. Dieses Ergebnis unterscheidet sich nicht vom Fall „Private Derived Class with Protected Members“.
Fazit
C++-Zugriffsspezifizierer sind die Wörter "private", "protected" und "public".” Sie entscheiden über den Zugang für Mitglieder einer Klasse. Der Bereich eines Zugriffsbezeichners beginnt mit seinem Label, bis zum Ende der Klassenbeschreibung (Definition) oder bis zum Anfang eines anderen Zugriffsbezeichners. Jedes Mitglied einer Klasse kann auf jedes andere Mitglied derselben Klasse zugreifen. Auf einen privaten Member einer Klasse kann von keiner externen Funktion, keinem externen Operator oder einer abgeleiteten Klasse zugegriffen werden.
Der Member der Basisklasse muss geschützt werden, damit ein Member der abgeleiteten Klasse auf einen privaten Member der Basisklasse zugreifen kann. Dieser geschützte Member der Basisklasse wird von einer externen Funktion oder einem externen Operator als privater Member der Basisklasse angesehen.
Auf einen öffentlichen Member einer Klasse kann von jeder externen Funktion, jedem externen Operator oder einer abgeleiteten Klasse zugegriffen werden.
Wenn in einer Klasse kein Zugriffsbezeichner vorhanden ist, wird der private Bezeichner angenommen. Das heißt, der Standardzugriffsbezeichner ist privat is.
In dieser Arbeit verwendete Referenzen
- Alireza Ebrahimi, VERERBUNG: WIEDERVERWENDBARKEIT UND ERWEITERBARKEIT
- S. Malik, Datenstrukturen mit C++ 2nd Edition