C++

C++-Zugriffsspezifizierer

C++-Zugriffsspezifizierer
In C++ ist eine Klasse ein Satz von Variablen und Funktionen, die so konfiguriert wurden, dass sie zusammenarbeiten. Wenn den Variablen der Klasse Werte zugewiesen werden, wird ein Objekt erhalten. Ein Objekt hat die gleichen Variablen und Funktionen wie eine Klasse, aber diesmal haben die Variablen Werte. Viele Objekte können aus einer Klasse erstellt werden. Ein Objekt unterscheidet sich von einem anderen Objekt durch die unterschiedlichen Werte, die den Variablen des anderen Objekts zugewiesen sind. Das Erstellen eines Objekts aus einer Klasse wird als Instanziieren des Objekts bezeichnet. Auch wenn zwei unterschiedliche Objekte die gleichen Werte für ihre Variablen haben, sind diese Objekte unterschiedliche Entitäten, die im Programm durch unterschiedliche Namen identifiziert werden. Die Variablen für ein Objekt und seine entsprechende Klasse werden als Datenelemente bezeichnet. Die Funktionen eines Objekts und seiner entsprechenden Klasse heißen Memberfunktionen. Datenmember und Memberfunktionen werden Member genannt.

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

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:

#einschließen
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<//int no1 = obj.num1;
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:

Klasse TheCla

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:

#einschließen
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<int no2 = childObj.method2();
cout<0 zurückgeben;

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 TheCla

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

Klasse ChildCla : protected TheCla

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:

Klasse ChildCla : privater TheCla

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:

#einschließen
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</*int no2 = childObj.method2();
cout<0 zurückgeben;

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:

Klasse ChildCla : protected TheCla

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:

Klasse ChildCla : privat TheCla

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:

Klasse ChildCla : public TheCla

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:

Klasse ChildCla : protected TheCla

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:

Klasse ChildCla : privater TheCla

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
Beste Befehlszeilenspiele für Linux
Die Befehlszeile ist nicht nur Ihr größter Verbündeter bei der Verwendung von Linux – sie kann auch eine Quelle der Unterhaltung sein, da Sie damit vi...
Beste Gamepad-Mapping-Apps für Linux
Wenn du Spiele unter Linux gerne mit einem Gamepad statt mit einem typischen Tastatur- und Maus-Eingabesystem spielst, gibt es einige nützliche Apps f...
Nützliche Tools für Linux-Spieler
Wenn Sie gerne unter Linux spielen, haben Sie wahrscheinlich Apps und Dienstprogramme wie Wine, Lutris und OBS Studio verwendet, um das Spielerlebnis ...