Studenten
wurden als public
klassifiziert,
d.h., jeder kann auf diese Daten zugreifen, wie mittels
mike.pvorname
.
Um diese Daten vor unerwünschtem Zugriff zu schützen und um das
Datenlayout evtl. nachträglich ändern zu können,
kapselt man die Daten so in die Klasse ein, daß sie nur noch
über Zugriffsmethoden erreichbar sind. Die diesbezügliche Klassifikation
wird durch das Schlüsselwort private
angegeben.
Damit ändert sich der Deklarationsteil der Klasse Studenten
in
// studenten2.hh #include <iostream.h> class Studenten { // Data in Studenten are private now!! private: long int matrikel; int skz; char *pname, *pvorname; // Methods in Studenten public: // Constructors, Destructor, Access operator ... // Output operator friend ostream & operator<<(ostream & s, const Studenten & orig); // Methods to access the private data // Methods for data manipulation in Studenten void SetVorname(const char vorname[]); void SetName(const char name[]); void SetMatrikel(const long int mat_nr); void SetSKZ(const int skz_nr); // Methods that don't manipulate data in Studenten const long int& GetMatrikel() const; const int& GetSKZ() const; const char* GetVorname() const; const char* GetName() const; }; |
In obigen Methoden sind zwei const
Deklarationen zu finden.
Ein const
am Ende der Deklarationszeile zeigt an, daß die
Daten in Studenten
von der entsprechenden Methode, z.B.,
GetSKZ
nicht verändert werden. Das const
am Zeilenanfang
gehört zum Ergebnistyp und zeigt an, daß die Daten auf welche mit
der Referenz int&
verwiesen wird nicht verändert werden dürfen.
Damit wird gesichert, daß die Daten auch nicht unabsichtlich über
Zeiger oder Referenzen manipuliert werden können.
Die Zugriffsmethoden werden wie folgt definiert:
// studenten2.cc #include "studenten2.hh" ... void Studenten :: SetVorname(const char vorname[]) { if (pvorname != 0) delete [] pvorname; pvorname = new char[strlen(vorname)+1]; strcpy(pvorname,vorname); return; } void Studenten :: SetSKZ(const int skz_nr) { skz = skz_nr; return; } ... const char* Studenten :: GetVorname() const { return pvorname; } const int& Studenten :: GetSKZ() const { return skz; } |
Diese neuen Zugriffsmethoden können wie folgt benutzt werden:
// Ex861.cc #include <iostream.h> #include <strings.h> #include "studenten2.hh" int main() { Studenten mike("Arni", "Schwarz", 812, 7938592); cout << "mike : " << mike << endl; cout << endl; // Data in Studenten are private therefore --> inaccessible: // cout << "Access to public data : "; // cout << "mike.pvorname = " << mike.pvorname << endl; // Data in Studenten are private therefore : cout << "Access to private data via methods: " << endl; cout << "mike.pvorname = " << mike.GetVorname() << endl; // mike.GetVorname()[3] = 'k'; // not allowed because of 'const' // char *pp = mike.GetVorname();// not allowed because of 'const' char tmp[40]; strcpy(tmp,mike.GetVorname()); // allowed return 0; } |
Einige Zugriffsfunktionen, z.B., SetSKZ
und
GetSKZ
sind so kurz, daß sich ein Funktionsaufruf
wegen des Aufwandes der Parameterübergabe eigentlich
nicht lohnt. In diesem Falle werden Deklaration und
Definition einer Methode miteinander im Headerfile verknüpft,
die Methode/Funktion wird inline definiert.
Diese inline-Zeilen ersetzen jedesmal den Funktionsaufruf.
// studenten3.hh #include <iostream.h> class Studenten { ... void SetSKZ(const int skz_nr) { skz = skz_nr; }; // inline function ... const int& GetSKZ() const { return skz; }; // inline function }; |