Abstrakte Datentypen (ADT)
Abstrakte Datentypen sollen die Richtigkeit der Daten sicherstellen. Bisher wurden Daten in einzelnen Variablen
gespeichert oder in eine Sturktur gepackt. Wer unsere Daten auf welche Weise verändert wurde bisher nicht
kontrolliert. Das bedeutet, dass Opertionen auf Daten ausgeführt werden können, die dem Sinn der Daten
nicht entsprechen oder Inkonsistenz erzeugen, wie beispielsweise Geld an eine Ampel zu überweisen oder ein
Konto auf gelb zu schalten.
Klassen und Objekte
Ein ADT der in einer Programmiersprache formuliert ist, heißt Klasse. Sie ist eine Beschreibung
von in der Realwelt existierenden Objekten mit einer Abbildung ihrer Eigenschaften. Die Werte der
Eigenschaften sind unsere Daten, die es zu verwalten gilt. Um Änderungen an Eigenschaften nun nicht
willkürlich zu zulassen, bieten Klassen Methoden die als öffentliche Schnittstelle zu den Daten dienen.
Die Methoden werden in C++ mit dem Schlüsselwort public gekennzeichnet. Die Eigenschaften bzw. Daten des
Objektes dagegen mit private.
von Methoden, Konstruktoren und Instanzen
Im Quelltext sieht eine Klasse für Segelboote beispielsweise wie folgt aus:
boot ist der Name der Klasse, private und public kennzeichenen den geschützten und öffentlichen Teil der Klasse.
Dies ist das Grundgerüst einer Klasse. Methoden, die nur eine kurze Definition enthalten, können inline geschrieben werden. Das heißt der Quellcode befindet sich wie bei der Methode int v_max () in der Klassendefinition. Andernfalls müssen Funktionen als Methode einer Klasse gekennzeichnet werden. Die Kennzeichnung erfolgt mittels des Klassennamen und dem Operator ::.
Dies ist das Grundgerüst einer Klasse. Methoden, die nur eine kurze Definition enthalten, können inline geschrieben werden. Das heißt der Quellcode befindet sich wie bei der Methode int v_max () in der Klassendefinition. Andernfalls müssen Funktionen als Methode einer Klasse gekennzeichnet werden. Die Kennzeichnung erfolgt mittels des Klassennamen und dem Operator ::.
boot (); ist eine besondere Methode: Sie heißt wie die Klasse selbst und ist ein Konstruktor. Ein Konstruktor bestitzt keinen Rückgabetyp
und dient der Initialisierung einer Instanz. Eine Instanz ist also ein tatsächlich existierendes Exemplar des Objektes, welches duch die Klasse
beschrieben wird. Je nach dem, ob bei der Initalisierung Parameter übergeben werden, setzt der Konstruktor diese als Startwerte der Daten ein oder
Defaultwerte und stellt Speicherplatz bereit.
Das Erzeugen einer Instanz funktioniert genauso wie die Deklaration unserer bisherigen Variablen: Datentyp Variablenname. Als Datentyp dient nun der
Name der Klasse. Außerdem wird der Konstruktor I für das Objekte black_pearl aufgerufen. Die privaten Elemente der black_pearl bestitzen jetz die dort
festgelegten Defaultwerte. Für das Objekt lagoon_560 wird der Konstruktor II aufgerufen und die in Klammern stehenden Werte den privaten Elementen zugewiesen.
Der Aufruf einer Methode erfolgt mit dem Punktoperator:
Überladen von Operatoren
In C++ ist es möglich den vordefinierten Operatorsymbolen für Klassen eine neue Bedeutung zuzuordnen.
Betrachten wir beispielsweise den Vergleichsoperator. Üblicherweise werden hier linker und rechter Oprand verglichen und es wird true oder false zurück gegeben (z.B. x==y). Für alle Grunddatentypen wie int oder float ist das unproblematisch. Wenn wir aber eine Klasse zum Speichern von Matrizen betrachten, muss der Algorithmus zum Vergleichen von 2 Matrizen beim Operator == hinterlegt werden.
⊗ steht für die möglichen C++-Operatoren.
Betrachten wir beispielsweise den Vergleichsoperator. Üblicherweise werden hier linker und rechter Oprand verglichen und es wird true oder false zurück gegeben (z.B. x==y). Für alle Grunddatentypen wie int oder float ist das unproblematisch. Wenn wir aber eine Klasse zum Speichern von Matrizen betrachten, muss der Algorithmus zum Vergleichen von 2 Matrizen beim Operator == hinterlegt werden.
⊗ steht für die möglichen C++-Operatoren.