Programmieren in C/C++ und MATLAB - Christian

Werbung
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
Herunterladen