Zugriffsbezeichner in C++
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 34 von 104.
C++ bietet drei Zugriffsbezeichner, die steuern, wer auf Klassenmitglieder zugreifen kann: public, protected und private. Sie bilden die Grundlage der Kapselung.
class Account {
public:
std::string ownerName; // Von überall zugänglich
protected:
double interestRate; // Zugänglich in dieser Klasse und abgeleiteten Klassen
private:
double balance; // Nur innerhalb dieser Klasse zugänglich
};Auf öffentliche Member kann von überall aus zugegriffen werden – innerhalb der Klasse, von abgeleiteten Klassen und von externem Code. Private Member sind am stärksten eingeschränkt und nur innerhalb der Klasse selbst zugänglich. Geschützte Member liegen dazwischen – für die Außenwelt verhalten sie sich wie private Member, aber abgeleitete Klassen können auf diese Member zugreifen.
class Account {
private:
double balance;
public:
Account() : balance(0) {}
void deposit(double amount) {
balance += amount; // OK - innerhalb der Klasse
}
};
int main() {
Account acc;
acc.deposit(100); // OK - deposit ist public
// acc.balance = 500; // ERROR - balance ist private
}Standardmäßig sind alle Mitglieder einer Klasse privat, wenn kein Spezifizierer angegeben wird. Dadurch wirst du dazu angehalten, ausdrücklich zu entscheiden, was zugänglich gemacht werden soll. Im Allgemeinen werden Datenmitglieder privat gemacht und öffentliche Methoden bereitgestellt, um sicher mit ihnen zu interagieren.
Aufgabe
EinfachErstellen wir ein einfaches Mitarbeiterverwaltungssystem, das zeigt, wie Zugriffsbezeichner steuern, wer worauf zugreifen kann. Du erstellst eine Klasse, in der einige Daten vollständig privat sind, einige für mögliche Unterklassen zugänglich sind und einige für alle offenstehen.
Du erstellst zwei Dateien, um deinen Code zu organisieren:
Employee.h: Definiere eineEmployee-Klasse, die alle drei Zugriffsbezeichner verwendet, um Daten angemessen zu schützen:- Öffentlich: Der
name(string) des Mitarbeiters. Darauf kann von überall aus zugegriffen werden - Geschützt: Die
department(string) des Mitarbeiters: innerhalb der Klasse und von abgeleiteten Klassen aus zugänglich, aber nicht von außerhalb - Privat: Das
salary(double) des Mitarbeiters: nur innerhalb der Klasse selbst zugänglich - Ein Konstruktor, der name, department und salary entgegennimmt, um alle drei Member zu initialisieren
- Eine öffentliche Methode
getSalary(), die den privaten salary-Wert zurückgibt - Eine öffentliche Methode
getDepartment(), die den geschützten department-Wert zurückgibt - Eine öffentliche Methode
giveRaise(double amount), die das salary um den angegebenen Betrag erhöht (nur wenn amount positiv ist) - Eine öffentliche Methode
displayInfo(), die die Informationen des Mitarbeiters im folgenden Format ausgibt:"Name: <name>, Department: <department>, Salary: $<salary>"
- Öffentlich: Der
main.cpp: Zeige, wie Zugriffsbezeichner funktionieren, indem du mit einem Employee-Objekt interagierst. Lies den Namen, die Abteilung und das Gehalt eines Mitarbeiters aus der Eingabe ein (drei separate Zeilen), und:- Erstelle einen
Employeemit den Eingabewerten - Gib den Namen des Mitarbeiters direkt aus, indem du auf das öffentliche Member zugreifst:
"Direct access - Name: <name>" - Gib die Abteilung mithilfe des Getters aus:
"Via getter - Department: <department>" - Gib das Gehalt mithilfe des Getters aus:
"Via getter - Salary: $<salary>" - Gib dem Mitarbeiter eine Gehaltserhöhung von
5000.0 - Gib
"After raise:"aus - Rufe
displayInfo()auf, um die aktualisierten Informationen anzuzeigen
- Erstelle einen
Formatiere alle Gehaltswerte mit zwei Dezimalstellen mithilfe von std::fixed und std::setprecision(2) aus <iomanip>. Wandle die Gehaltseingabe mithilfe von std::stod() von einem String in einen Double-Wert um.
Die zentrale Erkenntnis ist, dass du zwar aus main direkt auf name zugreifen kannst, aber nicht direkt auf department oder salary. Du musst die öffentlichen Getter-Methoden verwenden. Das ist Kapselung in der Praxis: Die Klasse steuert, wie auf ihre Daten zugegriffen wird und wie diese geändert werden.
Probier es selbst
#include <iostream>
#include <string>
#include <iomanip>
#include "Employee.h"
using namespace std;
int main() {
// Eingabe lesen
string name;
string department;
string salaryStr;
getline(cin, name);
getline(cin, department);
getline(cin, salaryStr);
double salary = stod(salaryStr);
// Präzision für die Gehaltsausgabe festlegen
cout << fixed << setprecision(2);
// TODO: Erstelle ein Employee-Objekt mit den Eingabewerten
// TODO: Gib den Namen des Mitarbeiters aus, indem du direkt auf das öffentliche Mitglied zugreifst
// Format: "Direct access - Name: <name>"
// TODO: Gib die Abteilung mit der Getter-Methode aus
// Format: "Via getter - Department: <department>"
// TODO: Gib das Gehalt mit der Getter-Methode aus
// Format: "Via getter - Salary: $<salary>"
// TODO: Gib dem Mitarbeiter eine Gehaltserhöhung von 5000.0
// TODO: Gib "After raise:" aus
// TODO: Rufe displayInfo() auf, um die aktualisierten Informationen anzuzeigen
return 0;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamespaces & GültigkeitsbereichEinführung in OOP mit C++Klassen vs. ObjekteDer „this“-ZeigerMethoden (Member-Funktionen)Attribute (Datenmember)Grundlagen zu Ctors & DtorsRückblick – Einfacher Taschenrechner4Klassenattribute
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen und -KlassenZusammenfassung – Bankkontoverwaltung7Vererbung
Grundlagen der VererbungZugriffsebenen bei der VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick – Mitarbeiterhierarchie2Speicherverwaltung
Stack- vs. Heap-SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Intelligente Zeiger in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsbezeichner in C++Zugriffsbezeichner im DetailInformationsverbergungStruct vs. KlasseVerschachtelte und innere KlassenWiederholung – Studierendenverwaltungssystem8Polymorphie
Polymorphie zur Compilezeit vs. LaufzeitFunktionsüberladungVirtuelle Funktionen erneut betrachtetRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIRückblick – Shape-Calculator3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorMove-KonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktor im DetailDrei-/Fünf-/Null-RegelZusammenfassung – String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladung der Operatoren [] und ()TypkonvertierungsoperatorenWiederholung – Matrix-Klasse9Templates
FunktionstemplatesKlassen-TemplatesTemplate-SpezialisierungVariadische TemplatesGrundlagen zu SFINAE und Type TraitsRückblick – Generischer ContainerÜbe selbstständig: Online-C++-Compiler