Objektorientierte Programmierung - Kapitel 2 - Datenabstraktion und Datenkapselung
Inhalte von Dr. E. Nadobnyh
2.1. Klasse
Datentyp und Klasse
Ein Datentyp ist eine Zusammenfassung von Wertebereichen und der darauf anwendbaren Operationen.
Ein Typ stellt das Muster dar, nach dem beliebig viele Variablen (Instanzen, Exemplaren, Objekten) erzeugt werden können.
Es gibt in C++ eingebaute Datentypen (z.B. int, float usw.) und benutzerdefinierte Datentypen. Eine Klasse ist ein benutzerdefinierter Datentyp.
Eine Klasse ist eine Typbeschreibung, die folgende Merkmale enthält: ´
1) Daten (auch Attribute und Eigenschaften genannt),
2) Operationen (auch Methoden, Elementfunktionen und Fähigkeiten genannt).
Datenabstraktion
Die Abstraktion ist ein gängiges Mittel, Komplexität zu reduzieren. Die komplexen Dinge werden auf das Wesentliche reduziert und mit einem Oberbegriff versehen.Die Sprache C++ unterstützt die Datenabstraktion durch den Begriff Klasse.
Eine Klasse ermöglicht:
1) mehrere zusammengehörige Daten (Attribute) in einen Datentyp zu bündeln und
2) den Zugriff auf die Attribute nicht direkt, sondern über die Methoden durchzuführen.
Vorteile der Datenabstraktion
1) Die interne Darstellung der Daten braucht das Anwendungsprogramm nicht zu kennen.
2) Der Zugriff auf die Daten erfolgt in kontrollierter Weise über die Methoden.
3) Bei Bedarf kann die interne Darstellung der Daten auch geändert werden, ohne das Anwendungsprogramm davon betroffen wird.
Datenkapselung
Attribute und Methoden der Klasse können als geschützt oder öffentlich deklariert werden. Normaleweise werden Attribute als private und Methoden als public d.h. öffentlich deklariert.
Ohne Datenkapselung können die Vorteile der Datenabstraktion durch das sogenannte Vorbeiprogrammieren an Methoden zerstört werden.
Beispiel: Ein Element auf Stack legen
Prozedurale Lösung
Prozedurale Lösung mit Datenabstraktion
Lösung mit Datenabstraktion und Datenkapselung
Schnittstelle einer Klasse
Die Deklarationen von allen public- Methoden bilden die öffentliche Schnittstelle (Interface). Durch die öffentliche Schnittstelle kommuniziert ein Objekt mit der Umgebung.
Die Schnittstelle sagt nichts über die Implementierung (über die interne Darstellung der Daten) aus. Die Datenabstraktion realisiert das Prinzip der Trennung von Schnittstelle und Implementierung.
Das Anwendungsprogramm merkt keine Veränderungen in der Implementierung, wenn die Schnittstelle dieselbe bleibt.
ADT
Der abstrakten Datentyp (ADT) ist ein Konzept der Entwurfsphase.
Als ADT bezeichnet man spezielle Datentypen:
1) deren Operationen und das korrekten Zusammenspiel der Operationen genau spezifiziert sind,
2) die jedoch nicht an einen konkreten Wertebereich gebunden sind.
Die Spezifikation des ADT kann:
1) durch natürliche Sprache,
2) durch eine Reihe von Axiomen,
3) durch Methodendeklaration mit Kommentaren usw. beschrieben werden.
Vorsicht: Ein benutzerdefinierter Typ wird häufig als ADT bezeichnet.
2.2. Definition von Klassen und Objekten
Deklaration, Definition und Verwendung
Eine Deklaration bestimmt, welche Bedeutung ein Bezeichner im Programmtext besitzt.
Jede Definition stellt auch eine Deklaration dar.
Bei der Definition:
1) einer Variable (eines Objektes) wird Speicherplatz reserviert.
2) einer Funktion (Methode) wird der Rumpf festgelegt.
3) eines Typs(Klasse) werden alle Merkmale festgelegt.
Vor der Verwendung muss jede Variable(Objekt), jede Funktion(Methode), jeder Typ(Klasse) definiert werden.
Beispiele für Deklaration, Definition, Verwendung
Deklaration | Definition | Verwendung | |
Typ |
//Vorwärtsdeklaration class A; |
class A{…}; | A a1, a3; |
Variable, Objekt |
extern A a1; class B { A a1; }; |
A a1; |
// Zugriff f(a1); a1 = a3; |
Funktion, Methode |
//Prototyp extern void f(A a2); class B { void m (A a2); }; |
void f(A a2){…} void B::m(A a2){…} |
//Aufruf f(a3); a1.m(a3); |
Definition von Klassen
Definition einer Klasse legt den Namen der Klasse sowie die Namen und Typen von Merkmalen (Klassenelementen, members)
fest. Merkmale sind Attribute (Daten) und Methoden (Elementfunktionen).
Bei der Klassendefinition werden die Attribute nur deklariert, d.h. keine Speicherreservierung.
Definition von Objekten
Definition eines Objektes erfolgt durch Angabe des Datentyps und des Objektnamens. Für jedes Objekt wird der Speicherplatz reserviert.
Verwendung von Objekten
Ein Anwendungsprogramm kann nur auf public- Attribute des Objektes zugreifen und public- Methoden aufrufen. Dies geschieht mit Hilfe des Punktoperators oder des Pfeiloperators.
Der this-Zeiger
Jede Methode erhält den so genannte this-Zeiger als verstecktes Argument beim Aufruf. Der this-Zeiger enthält die Adresse des
aktuellen Objekts. Die Adresse des Objektes im Speicherbereich ist das Identitätskriterium.
2.3. Methoden
Konstruktoren
Ein Konstruktor ist eine spezielle Methode für die Initialisierung des neu angelegten Objektes.
Besonderheiten:
1. Der Name des Konstruktors ist gleich dem Namen der Klasse.
2. Ein Konstruktor besitzt keinen Rückgabetyp, auch nicht void.
3. Die Konstruktoren sind überladbar. Eine Klasse kann mehrere Konstruktoren mit der unterschiedlichen Signatur besitzen.
4. Einer der Konstruktoren wird bei der Definition eines Objektes implizit ausgeführt.
5. Ein Konstruktor ohne Parameter heißt Default- Konstruktor oder parameterloser Konstruktor.
Destruktor
Ein Destruktor ist eine spezielle Methode für den Abbau eines Objektes.
Besonderheiten:
1. Der Name des Destruktors besteht aus dem Klassennamen mit führendem ~ („Tilde“)
2. Ein Destruktor besitzt keinen Rückgabetyp, auch nicht void.
3. Ein Destruktor besitzt keine Parameterliste. Jede Klasse hat nur einen Destruktor.
4. Ein Destruktor wird bei den Abbau eines Objektes implizit ausgeführt, z.B. wird ein lokales Objekt am Ende des Blocks abgebaut, in dem es definiert ist.
5. Ein Destruktor muss bestimmte Aktionen vom Konstruktor und von anderen Methoden wieder rückgängig machen, z.B. reservierten Speicherplatz wieder freigeben oder geöffnete Dateien wieder schließen.
Aufruf von Konstruktor und Destruktor
Aufbau und Abbau des Objekts
Objekt im dynamischen Speicher
Aufbau und Abbau des namenlosen Objektes
Standardmethoden
In jeder Klasse sind vier Standardmethoden automatisch vorhanden:
1) der Default- Konstruktor,
2) der Destruktor,
3) der Kopier- Konstruktor,
4) der Zuweisungsoperator.
Der Kopier- Konstruktor initialisiert ein Objekt mit einem anderen Objekt desselben Typs. Dabei werden alle Attribute vom Parameter-Objekt in das neu angelegten Objekt bitweise kopiert.
Er wird implizit aufgerufen:
1) bei der Definition von Objekten,
2) bei der Übergabe des Objektes per „call-by-value“,
3) bei der Übergabe des Objektes per „Rückgabe per Wert“.
Der Zuweisungsoperator kopiert alle Attribute eines Objekts in das andere bereits existierende Objekt desselben Typs.
Standard-Kopier-Konstruktor
CategoryObjektorientierteProgrammierung