C++-Zugriffsspezifizierer

C Access Specifiers



In C++ ist eine Klasse ein Satz von Variablen und Funktionen, die für die Zusammenarbeit konfiguriert wurden. Wenn den Variablen der Klasse Werte zugewiesen werden, wird ein Objekt erhalten. Ein Objekt hat dieselben 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 verschiedenen 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 Datenmember bezeichnet. Die Funktionen eines Objekts und seiner entsprechenden Klasse werden Memberfunktionen genannt. Datenmember und Memberfunktionen werden Member genannt.

Der Wortzugriff 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 Member auf andere Member seiner Klasse zugreifen kann oder ob eine Funktion oder ein Operator außerhalb der Klasse, die nicht zur Klasse gehört, auf jedes Member 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:



#enthalten
mit Namensraumstd;

KlasseTheCla
{
Privatgelände:
intnum1;
intnum2;
öffentlich:
TheCla(intn1,intn2)
{
num1=n1;num2=n2;
}
intMethode()
{
Rückkehrnum1;
}
};

inthauptsächlich()
{
TheCla obj(10,zwanzig);
intnein2=obj.Methode();
Kosten<<nein2<<' ';

// int no1 = obj.num1;

Rückkehr 0;
}

Die Ausgabe ist 10. Die privaten Mitglieder sind num1 und num2. Die öffentlichen Member sind TheCla() und method(). Beachten Sie, dass TheCla() die Konstruktorfunktion ist, die die interessierenden Variablen initialisiert. Der Bereich eines Zugriffsbezeichners beginnt von seinem Label bis zum Ende der Klassenbeschreibung (Definition) oder bis zum Anfang eines anderen Zugriffsbezeichners.





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.

In der Klassenbeschreibung (Definition) greift nun 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() beispielsweise ist eine außerhalb der Klassenbeschreibung deklarierte Funktion. Es war nur in der Lage, auf die öffentlichen Member method() und TheCla() zuzugreifen. 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 privat. Die obige Klassenbeschreibung ist also dieselbe wie die folgende Beschreibung, privat, jedoch ohne den Bezeichner:

KlasseTheCla
{
intnum1;
intnum2;
öffentlich:
TheCla(intn1,intn2)
{
num1=n1;num2=n2;
}
intMethode()
{
Rückkehrnum1;
}
};

Notiz : Die Bezeichnung des Zugriffsbezeichners beginnt mit dem Bezeichner, gefolgt von einem Doppelpunkt.

Der geschützte Bezeichner

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 Sie und entfernen Sie den Kommentarindikator // aus der vorletzten Anweisung in der Funktion main(). 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 Member der abgeleiteten (geerbten) Klasse auf Member der Basisklasse (Elternklasse) zugreifen müssen.

Öffentliche abgeleitete Klasse mit öffentlichen Mitgliedern
Betrachten Sie das folgende Programm:

#enthalten
mit Namensraumstd;

KlasseTheCla
{
öffentlich:
intnum1= 10;
geschützt:
intnum2= zwanzig;
Privatgelände:
intnum3= 30;
};

KlasseKindCla: öffentlichTheCla
{
öffentlich:
intMethode 1()
{
Rückkehrnum1;
}
intMethode2()
{
Rückkehrnum2;
}
/*int-Methode3()
{
Rückgabenummer3;
} * /

};

inthauptsächlich()
{
KindCla KindObj;
intnein1=kindObj.Methode 1();
Kosten<<nein1<<' ';

intnein2=kindObj.Methode2();
Kosten<<nein2<<' ';

Rückkehr 0;
}

Die Ausgabe ist:
10
zwanzig

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 einen Zugriffsbezeichner (öffentlich, geschützt oder privat) deklariert. Oben wird die abgeleitete Klasse mit dem öffentlichen Bezeichner deklariert, d. h.:

KlasseKindCla: öffentlichTheCla{}

Entkommentieren Sie nun die dritte Memberfunktionsdefinition in der abgeleiteten Klasse. Wenn Sie versuchen, das Programm zu kompilieren, beachten Sie, dass es nicht kompiliert wird und eine Fehlermeldung ausgibt.

Notiz Hinweis: Wenn die gesamte abgeleitete Klasse als öffentlich deklariert wird, können ihre Member nicht auf die privaten Member der Basisklasse zugreifen. Seine Member können jedoch auf die öffentlichen und geschützten Member der Basisklasse zugreifen. Das obige Programm veranschaulicht dies.

Beachten Sie jedoch, dass ein öffentlicher Member der öffentlichen abgeleiteten Klasse auf einen geschützten Member der Basisklasse zugreifen kann.

Abgeleitete Klassenspezifizierer und Memberspezifizierer

Geschützte abgeleitete Klasse mit öffentlichen Membern
Ersetzen Sie den öffentlichen Bezeichner in der obigen Deklaration der abgeleiteten Klasse wie folgt durch protected:

KlasseKindCla: geschütztTheCla{}

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. Seine 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.

Notiz : 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 den geschützten Bezeichner in der obigen Deklaration der abgeleiteten Klasse durch private wie folgt:

KlasseKindCla: PrivatgeländeTheCla{}

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. Seine Member können jedoch auf die öffentlichen und geschützten Member der Basisklasse zugreifen. Dies ist dasselbe, als 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:

#enthalten
mit Namensraumstd;

KlasseTheCla
{
öffentlich:
intnum1= 10;
geschützt:
intnum2= zwanzig;
Privatgelände:
intnum3= 30;
};

KlasseKindCla: öffentlichTheCla
{
geschützt:
intMethode 1()
{
Rückkehrnum1;
}
intMethode2()
{
Rückkehrnum2;
}
/*int-Methode3()
{
Rückgabenummer3;
} * /

};

inthauptsächlich()
{
/*ChildCla childObj;
int no1 = childObj.method1();
Kosten<
/*int no2 = childObj.method2();
Kosten<
Rückkehr 0;
}

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 nicht kompiliert wird 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.

Notiz : Ein geschützter Member der geschützten abgeleiteten Klasse kann auf einen geschützten Member der Basisklasse zugreifen.

Fügen Sie nun die Kommentare wieder in die abgeleitete Klasse ein 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 main()-Funktion 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 einer beliebigen Klasse, ob base oder abgeleitet, mit demselben Spezifizierer, private, und hat keinen Zugriff darauf.

Wenn das zweite Codesegment der Funktion main() 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 den öffentlichen Bezeichner in der obigen Deklaration der abgeleiteten Klasse wie folgt durch protected:

KlasseKindCla: geschütztTheCla{}

Fügen Sie den Kommentar der Codesegmente wieder in die main()-Funktion ein, falls dies noch nicht geschehen ist. Kompilieren Sie das Programm und führen Sie es aus und beachten Sie, dass das Ergebnis wie zuvor ist.

Private abgeleitete Klasse mit geschützten Mitgliedern
Ersetzen Sie den geschützten Bezeichner in der obigen Deklaration der abgeleiteten Klasse durch private wie folgt:

KlasseKindCla: PrivatgeländeTheCla

Kompilieren Sie das Programm und führen Sie es aus und beachten Sie, dass das Ergebnis wie zuvor ist.

Öffentliche abgeleitete Klasse mit privaten Mitgliedern
Ersetzen Sie den privaten Bezeichner in der obigen Deklaration der abgeleiteten Klasse durch public wie folgt:

KlasseKindCla: öffentlichTheCla{}

Machen Sie die Member der abgeleiteten Klasse privat. Kompilieren Sie das Programm und führen Sie es aus. Das Ergebnis unterscheidet sich nicht vom Fall Public Derived Class with Protected Members.

Geschützte abgeleitete Klasse mit privaten Mitgliedern
Ersetzen Sie den öffentlichen Bezeichner in der obigen Deklaration der abgeleiteten Klasse wie folgt durch protected:

KlasseKindCla: geschütztTheCla{}

Kompilieren Sie das Programm und führen Sie es aus. Dieses Ergebnis unterscheidet sich nicht vom Fall Protected Derived Class with Protected Members.

Private abgeleitete Klasse mit privaten Mitgliedern
Ersetzen Sie den geschützten Bezeichner in der obigen Deklaration der abgeleiteten Klasse durch private wie folgt:

KlasseKindCla: PrivatgeländeTheCla{}

Kompilieren Sie das Programm und führen Sie es aus. Dieses Ergebnis unterscheidet sich nicht vom Fall Private abgeleitete Klasse mit geschützten Mitgliedern.

Abschluss

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.

In dieser Arbeit verwendete Referenzen