Programmieren in C/C++ und MATLAB Sebastian Bauer Institut für Geowissenschaften Christian-Albrechts-Universität zu Kiel Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 8-1 Objektorientiertes Programmieren Die Programme, die bisher in diesem Kurs verwendet wurden, sind alle klein und überschaubar (wenn auch nicht „einfach“ zu programmieren). Tatsächlich verwendete moderne Software ist häufig komplex und sehr groß/umfangreich (Beispiele: Windows oder Linux- Betriebssysteme, Grafikprogramme, Fensterchen-Programme, Excel, ...). Solche Software kann nicht von einer Person geschrieben und entwickelt werden, sondern es arbeitet eine ganze Gruppe von Entwicklern zusammen an dem Programm. Daher sind Methoden notwenig: - zur Handhabung der Komplexität von Programmen und - zur gemeinsamen Entwicklung von Software in Gruppen Diese Anforderungen begründen das objekt-orientierte Programmieren. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 8-2 Objekte Meistens werden Programme geschrieben, um Vorgänge in der realen Welt zu modellieren, zu unterstützen oder zu automatisieren. In der realen Welt sind wir von Dingen = Objekten umgeben. Daher liegt es nahe, auch in Programmen mit Objekten umzugehen. Der erste Schritt zu einem objekt-orientiertem Programm (OOP) ist es daher, im betrachteten Ausschnitt der Realität die vorkommenden Objekte mit ihren Charakteristika zu identifizieren und ihre Beziehungen untereinander zu beschreiben. Oldtimer Hersteller: Opel Herstellungsdatum: 1962 Preis: 7500 Euro Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU Stretchlimousine Hersteller: Lincoln Herstellungsdatum: 2005 Preis: 51000 Dollar 8-3 Objekte Ein weiteres Beispiel sind die Menüs in graphischen Benutzeroberflächen (z.B. Windows). Diese haben gemeinsame Eigenschaften (pop-up, anklickbare Einträge) sind aber mit unterschiedlichen Einträgen gefüllt und somit auch unterschiedliche groß. Objekte haben also Eigenschaften, durch die sie charakterisiert werden. Sie können auch Zustände haben (beim Menü: Ist gerade geöffnet), die sich auf mögliche Aktionen auswirken (kein anderes Menü kann geöffnet werden) Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 8-4 Objekte und Klasse „Verwandte“ Objekte haben also ähnliche Verhaltensweisen und Charakteristiken. Sie unterscheiden sich in den Werten ihrer Eigenschaften und Zustände. Man kann für ein Objekt die Eigenschaften abstrahieren und zu einer Schablone zusammenfassen – eine solche Abstraktion nennt man eine Klasse. Das einzelne Objekt nennt man dann eine Instanz. Name Hersteller: Herstellungsdatum: Preis: Klasse Auto Instanzen der Klasse Auto Admiral Hersteller: Opel Herstellungsdatum: 1962 Preis: 7500 Euro Sebastian Bauer Institut für Geowissenschaften Stretchlimousine Hersteller: Lincoln Herstellungsdatum: 2005 Preis: 51324.56 Dollar Programmieren in C/C++ und MATLAB CAU 8-5 Golf Hersteller: VW Herstellungsdatum: 2009 Preis: 25000 Euro Klasse - Eine Klasse ist eine Schablone, mit der man gleichartige Objekte beschreiben kann. Sie fasst dabei alle im Kontext wichtigen Merkmale und Zustände zusammen. Eine Klasse ist ein benutzerdefinierter Datentyp. - Ein Objekt ist die Ausprägung einer Klasse. Man bezeichnet es als Instanz oder Exemplar einer Klasse. Von einer Klasse können mehrere Objekte existieren. - Jede Klasse kann Daten enthalten (in Form von Variablen). Diese in einer Klasse gespeicherten Daten nennt man Attribute oder Datenelemente einer Klasse. Die Art der Daten wird durch die Klasse festgelegt, die Werte der Daten können für jedes Objekt (=Instanz) variieren und für jedes Objekt einzeln geändert werden. - Jede Klasse kann Elementfunktionen (=Methoden) beinhalten, die mit den Datenobjekten auch etwas machen Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 8-6 Klassendeklaration Da eine Klasse ein von Ihnen definierter (=benutzerdefinierter) Datentyp ist, muss eine Klasse genau wie ein Variable deklariert werden. Die Syntax besteht aus dem Schlüsselwort class, dem Klassennamen gefolgt von den Bestandteilen der Klasse (Datenelemente und Methoden) in geschweiften Klammern und einem abschließenden Semikolon (wichtig!): class CName { // ... Daten // ... Methoden }; Dem Namen der Klasse wird häufig ein „C“ vorangestellt, um die Klasse klar zu kennzeichnen. Die Deklaration muss außerhalb des Hauptprogramms stattfinden. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 8-7 Klassendeklaration Die Datenelemente und die Elementfunktionen einer Klasse werden bei der Deklaration einer Klasse mit aufgeführt. Für das Beispiel der Klasse Auto könnte das also so aussehen, wenn z.B. eine Internetseite mit zu verkaufenden Autos erstellt werden soll: class CAuto { public: // = Zugriffsbeschränkung // Datenelemente string Name; string Hersteller; double Preis; bool verkauft; int AnzahlTüren; // Elementfunktionen CAuto(); // Konstruktor ~CAuto(); // Destruktor void ShowOnScreen(void); void SetzePreis(double); }; Sebastian Bauer Institut für Geowissenschaften Die Datenelemente haben zumeist Standarddatentypen (string, int, double) und sind einzelne Variablen oder auch z.B. Felder; es kann auch eine weitere Klasse Datenelement einer Klasse sein. Die Elementfunktionen werden wie normale Funktionen deklariert, mit Rückgabewert, Namen und Argumentliste. Programmieren in C/C++ und MATLAB CAU 8-8 Klassendefinition Bei der Deklaration einer Klasse wird angegeben, welche Datenelemente und welche Methoden vorhanden sind. Bei der Definition der Klasse wird (genau wie bei den Funktionen) die eigentliche Methode implementiert, d.h. der source-code für die einzelnen Funktionen wird aufgeschrieben. Zur Implementierung einer Methode muss sowohl der Name der Funktion als auch die Klasse, zu der sie gehört, angegeben werden. void CAuto::SetzePreis (double p) { if(p > 0.0) Preis = p; return; } Die Methode hat alle Merkmale einer Funktion, nur wird zusätzlich noch gekennzeichnet, zu welcher Klasse diese Funktion gehört. Da diese Funktion eine Methode der Klasse CAuto ist, kennt sie das Datenelement Preis und kann direkt darauf zugreifen. Es muss nicht gekennzeichnet werden, das Preis ein Datenelement der Klasse CAuto ist. Die Definition einer Methode muss außerhalb des Hauptprogramms stattfinden, sowie nach der Deklaration der Klasse. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 8-9 Konstruktor und Destruktor Die wichtigsten Methoden einer Klasse sind der Konstruktor und der Destruktor. Diese müssen immer vorhanden sein. Der Konstruktor einer Klasse hat denselben Namen wie die Klasse, der Destruktor hat ein dem Namen vorangestelltes ~. Der Konstruktor wird automatisch aufgerufen beim Erzeugen einer Instanz einer Klasse, der Destruktor beim Zerstören (Speicherplatzfreigabe) einer Instanz. class CAuto { … CAuto(); // Konstruktordeklaration ~CAuto(); // Destruktordeklaration … }; CAuto::CAuto(void) // Konstruktordefinition { } CAuto::~CAuto(void) // Destruktordefinition { } Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 8-10 Konstruktor und Destruktor Der Konstruktor kann verwendet werden, um die Datenelemente zu initialisieren und somit mit Standardwerten vorzubelegen. void CAuto::CAuto(void) // Konstruktordefinition { Name = “unbekannt“; Preis = 0.0; verkauft = false; } Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 8-11 Datenschutz Eine wichtige Eigenschaft der Sprache C++ ist es, die Datenelemente und Methoden einer Klasse unterschiedlich sichtbar zu machen. Dies macht man, um die Daten vor Zugriff zu schützen. Dazu werden die Schlüsselwörter „private“ und „public“ bei der Klassendeklaration verwendet. Daten des Typs „public“ sind überall sichtbar und können somit auch von überall über den direkten Zugriff verändert werden. Daten des Typs „private“ sind nur innerhalb der eigenen Klasse sichtbar, auf diese kann nur mit Methoden der eigenen Klasse zugegriffen werden. class CAuto { public: string Name; string Hersteller; private: double Preis; public: CAuto(); // Konstruktor ~CAuto(); // Destruktor void Anzeigen(void); void SetzePreis(double); double GetPreis(void); }; Sebastian Bauer Institut für Geowissenschaften Alle nachfolgenden Elemente hinter einem der Schlüsselwörter sind entsprechend dem Schlüsselwort entweder public oder private, solange bis eines dieser Schlüsselwörter erneut verwendet wird oder die Klassendeklaration endet. Wird kein Schlüsselwort angegeben sind alle Elemente private. Programmieren in C/C++ und MATLAB CAU 8-12 Datenschutz Im gegebenen Beispiel kann also der Wert der Variablen Preis nur mit Hilfe der Methode void CAuto::SetzePreis(double) verändert werden. Ein direkter Zugriff ist nicht möglich, da Preis als private deklariert ist. Da gar kein Zugriff von außen erfolgen kann, muss auch eine eigene Funktion geschrieben werden, die den Preis liefert, falls man ihn abfragen möchte: double CAuto::SetzePreis(void) . Die Zugriffsfunktionen auf ein private-Datenelement müssen public sein. void CAuto::SetzePreis (double p) { if(p > 0.0) Preis = p; return; } double CAuto::GetPreis (void) { return Preis; } Diese Art der Zugriffsbeschränkung macht vor allem bei mehreren Programmierern Sinn, wenn jeder Programmierer für ein Objekt zuständig ist, die aber gegenseitig verwendet werden. Damit ist der Zugriff auf ein Objekt sehr klar geregelt, und die interne Struktur des Objekts kann nachträglich geändert werden, ohne dass Seiteneffekte auftreten. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 8-13 Instanzen einer Klasse Instanzen einer Klasse können erzeugt werden, indem eine Variable des Klassentyps deklariert wird. Dabei wird automatisch der Konstruktor aufgerufen. int main (void) { // Erzeugt eine Variable vom Klassentyp CAuto CAuto m_auto_1; // Erzeugt noch eine Variable vom Klassentyp CAuto CAuto m_auto_2; ... } Zugriff auf ein Datenelement der Instanz ist entweder über den . Operator, wenn dieses Datenelement public ist: m_auto_1.Hersteller = „VW“; // Schreiben in das Datenelement Hersteller Ist das Datenelement private, muss die entsprechende Zugriffsfunktion verwendet werden: m_auto_1.SetzePreis(2563.50); // Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 8-14 Übung Studentendatei Sie sollen ein Programm zur Verwaltung von Studenten (Büchern, Autos, Supermarktartikeln, etc...) schreiben. Erstellen Sie eine Klasse CStudent mit den Datenattributen Vorname, Nachname und Matrikelnummer. Vorname und Nachname sind public, die Matrikelnummer ist private. Initialisieren Sie die Datenelemente über den Konstruktor mit geeigneten Werten. Erstellen Sie geeignete Zugriffsfunktionen für das Datenelement Matrikelnummer. Erstellen Sie eine Instanz von CStudent und ändern sie die Matrikelnummer über die Get/Set Methoden. Ändern Sie ebenfalls den Vornamen. Geben Sie den Inhalt der Instanz am Bildschirm aus. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 8-15 Übung Hinweise: Die Abfolge im Programm ist: - Deklaration der Klasse - Definition der Methoden - Hauptprogramm Die Klasse muss als Methoden den Konstruktor, den Destruktor und die Zugriffsfunktionen für die Matrikelnummer enthalten, eine die die Matrikelnummer schreibt und eine, die die Matrikelnummer liest (Get und Set). Der Destruktor ist leer, der Konstruktor wird zur Initialisierung verwendet. Sebastian Bauer Institut für Geowissenschaften Programmieren in C/C++ und MATLAB CAU 8-16