Die Programmiersprache C++ Objektorientierter Ansatz Dr.-Ing. E. Thiem Datum: 25.2.2018 class adressen { private: string name[30]; string vorname[30]; string strasse[40]; string ort[40]; string telefon[20]; string eMail[20]; public: int adr_eingeben(); int adr_schreiben(); int adr_listen(); };
21
Embed
c++ 5 OOP - staff.hs-mittweida.dethiem1/cpp/unterlagen/kap05/theorie05.pdf · C++ objektorientierte Programmierung Dr. Thiem C++ Konsolenprogrammierung 104 Objektorientierter Ansatz
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Die Programmiersprache
C++
Objektorientierter Ansatz
Dr.-Ing. E. Thiem Datum: 25.2.2018
class adressen
{ private: string name[30];
string vorname[30];
string strasse[40];
string ort[40];
string telefon[20];
string eMail[20];
public: int adr_eingeben();
int adr_schreiben();
int adr_listen();
};
C++ objektorientierte Programmierung
Dr. Thiem C++ Konsolenprogrammierung 103 Objektorientierter Ansatz
Gliederung
5 Objektorientierte Programmierung mit C++ ................................................................. 104
5.1 Idee ........................................................................................................................ 104
5.2 Objekte und Methoden ........................................................................................... 104
5.3 Klassen und die OOP ............................................................................................ 105
5.4 Konstruktoren und Destruktoren ............................................................................ 110
class adressen adressdaten[10]; adressdaten[0].x=7; adressdaten[0].adr_eingeben(); adressdaten[0].adr_schreiben();
}
//Anlegen einer Klasse
//Definition der Methoden
//Hauptfunktion
//Anlegen eines Objektes //Aufruf der Methoden
C++ objektorientierte Programmierung
Dr. Thiem C++ Konsolenprogrammierung 110 Objektorientierter Ansatz
5.4 Konstruktoren und Destruktoren
Jedes mit Hilfe einer Vereinbarung neu geschaffene Objekt wird als Instanz der Klasse
bezeichnet.
Der Aufbau einer solchen Instanz wird mit Hilfe eines Konstruktors und die Entfernung
der Instanz mit einem Destruktor (in C++: automatisch beim Aufruf der Klasse) vorge-
nommen.
Konstruktoren und Destruktoren
Spezielle Methoden einer Klasse
Konstruktoren heißen genau wie die Klasse
Destruktoren heißen wie die Klasse, jedoch mit dem Zeichen ~(126) vor dem Namen
Konstruktoren:
werden bei Instanzbildung einer Klasse automatisch gerufen
belegen Instanzvariable mit Anfangswerten
Destruktoren:
werden bei Ende der Lebensdauer eines Objektes automatisch gerufen
werden meist benutzt, um Speicherbereiche freizugeben, die über Instanzvariablen
addressiert werden
Konstruktoren/Destruktoren haben keinen Typ, sie liefern keinen Wert
(auch nicht void).
C++ objektorientierte Programmierung
Dr. Thiem C++ Konsolenprogrammierung 111 Objektorientierter Ansatz
Programmausschnitt:
Beispiel in C++: Projekt öffnen
#include <iostream> using namespace std; #include <string> class adressen {
private: string name; string vorname; string strasse; string ort; string telefon; string eMail; public: int x; adressen(); ~adressen(); int adr_eingeben(void); int adr_schreiben(void); int adr_listen(void);
}; //Konstruktor adressen::adressen() {
cout << "Anfangswerte setzen\n"; name = "Nobody"; // bei string vorname = "Nobody"; //bei string cout << name << " " << vorname << endl; } //Destruktor adressen::~adressen() {
cout<<"Freigabe des Speicherbereiches\n"; }
//Datendefinition mit Hilfe von //Datentypen //öffentliche Ganzzahl-Variable x, //Konstruktor //Destruktor //Methodendefinitionen mit Hilfe //von Funktionen //Setzen der Anfangswerte
//Freigabe des Speicherbereiches
C++ objektorientierte Programmierung
Dr. Thiem C++ Konsolenprogrammierung 112 Objektorientierter Ansatz
//Konstruktor v1, Konstruktor v2 //Dummyblock um Konstruktor zu testen //Dummy Block Beginn //Konstruktor v3, Konstruktor v4 //Destruktor v3, Destruktor v4 //Dummy Block Ende
Im Beispiel wurde eine Klasse namens „Klasse“ erklärt. Sie definiert als Datenwert die Va-
riable x und als Methoden zwei Konstruktoren - Klasse() und Klasse(int i) - und einen De-
struktor - ~Klasse() - . In der Hauptfunktion main werden die Instanzen v1 und v2 mit einer
einfachen Vereinbarung gebildet. Die Instanz v1 wird mit der Standard-Konstruktor-
Methode Klasse() und v2 mit der Konstruktormethode Klasse(int i) initialisiert. Die Initialisie-
rung bedeutet hier nur das Setzen der Variablen wert für v1 auf „0“ und für v2 auf „3“. Man
spricht bei der Erstellung neuer Objekte einer Klasse auch von einer Instanziierung der
Klasse.
v3 und v4 werden im eingeschobenen Dummy-Block zur Klasse „Klasse“ instanziiert.
C++ objektorientierte Programmierung
Dr. Thiem C++ Konsolenprogrammierung 113 Objektorientierter Ansatz
Durch diese Konstruktion wird es möglich, die Arbeit des Destruktors zum Abschluß des
Blockes zu beobachten. Die Zerstörung der Instanzen v1 und v2, die im Hauptblock aufge-
baut wurden, können durch cout nicht sichtbar gemacht werden.
5.5 Vererbung
Die Bildung einer Klasse ist eine für den Programmierer arbeitsintensive Sache, der er viel
Sorgfalt zuwenden muss. Zur Vereinfachung des Aufbaus von Klassen, die mit schon defi-
nierten eine „Ähnlichkeit“ besitzen kann durch die Nutzung der Vererbung etwas verein-
facht werden.
Unter Vererbung versteht man die Möglichkeit, Klassen von anderen Klassen abzulei-
ten. Die abgeleiteten Klassen (Kindklassen) erhalten zunächst alle Elemente der Basis-
klasse (Elternklasse). In der Kindklasse können noch zusätzliche Elemente verein-
bart werden. Voraussetzung dafür ist die Änderung der Zugriffsrechte von private auf
protected in der Elternklasse!!!
Im Kapitel 5.3 wurde eine Klasse „adressen“ definiert. Im folgenden Beispiel werden zwei
Kindklassen - „meine_freunde“ und „kunden“ - dieser Klasse aufgebaut, die neben den
Grundelementen der Basisklasse „adressen“ weitere Elemente definieren:
UML-Darstellung
adr_eingeben()adr_schreiben() adr listen()
namestrasse ort telefon eMail
(adressen)
schreibe_geburtstag() geburtstagsliste()
geburtstag
lieblingsessen
(meine_freunde)
lies_kundennummer()lies_umsatz(int monat)
kundennummer umsatz
(kunden)
C++ objektorientierte Programmierung
Dr. Thiem C++ Konsolenprogrammierung 114 Objektorientierter Ansatz
Programmausschnitt:
Beispiel in C++: Projekt öffnen
class adressen { protected: string name; string vorname; string strasse; string ort; string telefon; string eMail; public: int x; adressen(); ~adressen(); int adr_eingeben(void); int adr_schreiben(void); int adr_listen(void); };
class meine_freunde : public adressen { private: char geburtstag[10]; char lieblingsessen[50]; public: int schreibe_geburtstag(void); int geburtstagsliste(int monat); }; class kunden : public adressen { private: int kundennummer; int umsatz[12]; public: int lies_kundennummer(void); int lies_umsatz(int monat); };
//Basisklasse Adressen
// Aenderung der Zugriffsrechte
//von private auf protected
//Abgeleitete Klasse meine_freunde
//Vererbung der Eigenschaften und
// Funktionen aus Basisklasse adressen
//zusätzliche Eigenschaften
//zusätzliche Funktionen
//Abgeleitete Klasse kunden
//Vererbung der Eigenschaften und
// Funktionen aus Klasse adressen
void main(void)
{ class kunden kd_daten[10];
kd_daten[0].lies_kundennummer(); }
// Anlegen eines Objektes kd_daten
//Zugriff auf Methode lies_kundennummer() //der
abgeleiteten Klasse kunden
C++ objektorientierte Programmierung
Dr. Thiem C++ Konsolenprogrammierung 115 Objektorientierter Ansatz
Der Zusatz „: public adressen“ legt die Elternklasse fest; alle nachfolgenden Deklarationen
gelten zusätzlich. Im Beispiel sehen wir eine sogenannte Einfach-Vererbung, es sind aller-
dings auch Mehrfachvererbungen möglich. Für die abgeleitete Klasse „kunden“ könnte
eine weitere Klasse mit zusätzlichen Elementen definiert werden:
Es ist wohl erkennbar, wie die Vererbungsmethodik dem Programmierer die Arbeit erleich-
tert. Allerdings wird vom Programmierer Kenntnis der verwendeten Basisklassen verlangt.
Gerade bei der Ausbildung von Programmierern ist deshalb die Kenntnisvermittlung zu den
Eigenschaften und Methoden der allgemeinen Basisklassen, die in bekannten Entwick-
lungsumgebungen (Visual C++, Borland C++ Builder, ...) vordefiniert sind, ein wesentlicher
Bestandteil der Wissensvermittlung.
class stammkunden : public kunden { ... }
C++ objektorientierte Programmierung
Dr. Thiem C++ Konsolenprogrammierung 116 Objektorientierter Ansatz
Zusammenfassung des bisherigen Beispiels:
#include <iostream> using namespace std; #include <string> //Basisklasse adressen class adressen { protected: string name; string vorname; string strasse; string ort; string telefon; string eMail; public: int x; adressen(); ~adressen(); int adr_eingeben(void); int adr_schreiben(void); int adr_listen(void); }; //Abgeleitete Klasse meine_freunde class meine_freunde : public adressen { private: string geburtstag; string lieblingsessen; public: int schreibe_geburtstag(void); int geburtstagsliste(int monat); }; //Abgeleitete Klasse kunde class kunden : public adressen { private:
int kundennummer; int umsatz[12]; public:
int lies_kundennummer(void); int lies_umsatz(int monat); }; //Konstruktor adressen::adressen() {cout<<"Anfangswerte setzen\n"; } //Destruktor adressen::~adressen() {cout<<"Freigabe des Speicherbereiches\n"; }
// int adressen::adr_eingeben(void) { cout<<"Name: "; cin >>name; cout<<"Vorname: "; cin >>vorname; return 1; } int adressen::adr_schreiben(void) { cout<<"Name: "; cout <<name<<endl; cout<<"Vorname: "; cout <<voname<<endl; return 1; } int adressen::adr_listen(void) { return 1; } int meine_freunde ::schreibe_geburtstag(void) { adressen:adr_eingeben(); cout<<"Geburtstag: "; cin>>geburtstag; return 1; } int kunden::lies_kundennummer(void) { adressen:adr_eingeben(); int kundennummer; cout<<"Kundennummer: "; cin>>kundennummer; return 1; } void main(void) { class meine_freunde freundedaten[10]; cout<<"Daten der Freunde\n"; freundedaten[0].schreibe_geburtstag(); cout<<"Daten der Kunden\n"; class kunden kd_daten[10]; kd_daten[0].lies_kundennummer(); }
C++ objektorientierte Programmierung
Dr. Thiem C++ Konsolenprogrammierung 117 Objektorientierter Ansatz
5.6 Polymorphie
Mit Hilfe der in C++ möglichen Polymorphie kann erreicht werden, dass gleichnamige
Methoden sich in Eltern- und verschiedenen vererbten Klassen unterschiedlich ver-
halten. Die Polymorphie wird mit Hilfe der sogenannten Überladung realisiert, die virtuelle
Klassenbestandteile benutzt.
Wir betrachten das folgende Beispiel mit Bezug auf die in den bisherigen Kapiteln definier-
ten Basis- und Kindklassen:
class adressen { protected: string name; string vorname; string strasse; string ort; string telefon; string eMail; public: int x; adressen(); ~adressen(); virtual int adr_eingeben(); int adr_schreiben(); int adr_listen(); };
class meine_freunde : public adressen { private: string geburtstag; string lieblingsessen; public: int adr_eingeben(); int geburtstagsliste(int monat); }; int meine_freunde :: adr_eingeben() {adressen:adr_eingeben(); cout<<"Geburtstag: "; cin>>geburtstag; return 1; }
//durch das Schlüsselwort virtual kann diese Methode
in den abgeleiteten Klassen überschrieben werden
//Methode adr_eingeben aus Klasse meine_freunde
//Aufruf der Methode adr_eingeben
//aus Klasse adressen
Beispiel in C++: Projekt öffnen
void main(void) { class meine_freunde freundedaten[10]; cout<<"Daten der Freunde eingeben:"<<endl;
freundedaten[0].adr_eingeben();
}
// Anzahl der meine_freunde-Datensätze festlegen
// Aufruf der Methode adr_eingeben() aus der
//Klasse meine_freunde
C++ objektorientierte Programmierung
Dr. Thiem C++ Konsolenprogrammierung 118 Objektorientierter Ansatz
Die Polymorphie bewirkt durch die unterschiedliche Wirksamkeit von Methoden gleichen
Namens eine uneindeutige Zuordnung zur gewünschten Ausführung. Wie bereits unter 5.3
sichert der Scope-Operator "<Basisklasse> :: <Methodenname>“ die Zuordnung einer
benutzten polymorphen Methode zur Klasse.
Zusammenfassung des bisherigen Beispiels:
#include <iostream> using namespace std; #include <string> // Basisklasse //*********************************************** class adressen { protected: string name; string vorname; string strasse; string ort; string telefon; string eMail; public: int x; adressen(); ~adressen(); virtual int adr_eingeben(); int adr_schreiben(); int adr_listen(); }; //Vererbung der Basisklasse //*********************************************** class meine_freunde : public adressen { private: string geburtstag; string lieblingsessen; public: int adr_eingeben(); int geburtstagsliste(int monat); }; //Konstruktor //********************************************** adressen::adressen() {cout<<"Anfangswerte setzen\n"; } //Destruktor //********************************************** adressen::~adressen() {cout<<"Freigabe des Speicherbereiches\n"; }
//Methoden der Basis-Klasse //********************************************** int adressen::adr_eingeben() { cout<<"Name: "; cin >>name; cout<<"Vorname: "; cin >>vorname; return 1; } int adressen::adr_schreiben() { cout<<"Name: "; cout <<name<<endl; cout<<"Vorname: ";
cout <<vorname<<endl; return 1; } int adressen::adr_listen() { return 1; } //Polymorphie //******************************************** int meine_freunde :: adr_eingeben() { adressen::adr_eingeben(); cout<<"Geburtstag:"; cin>>geburtstag; return 1; } //Hauptfunktion //******************************************** void main(void) { class meine_freunde freundedaten[10]; cout<<"Daten der Freunde eingeben:"<<endl; freundedaten[0].adr_eingeben(); }
C++ objektorientierte Programmierung
Dr. Thiem C++ Konsolenprogrammierung 119 Objektorientierter Ansatz
Das folgende Komplexbeispiel zur OOP stellt noch einmal die behandelte Methodik umfas-send dar.
Beispiel in C++: Projekt öffnenl // Programmbeispiel: "tanken.cpp" // Kostenabrechnung fuer einen Tankwart in C++ // Aus Bd.3 Lernfelder und Lernkompetenzen IT-Ausbildung // Medieninstitut Bremen 1998 S.145-148 #include <iostream> // Standard I/O-Klassen using namespace std; #include <iomanip> // wird fuer setw() gebraucht #include <stdio.h> // fuer getch() #include <stdlib.h> // fuer exit() und system() const int MWSTSATZ = 19; // Mwstsatz in % void linie(int anz) // Eine Linie der Laenge anz ausgeben { for (int i = 0; i < anz; i++) cout << '-'; } //--------------------------------------------------------------------------- class Kraftstoff // Die Klasse "Kraftstoff" vereinbaren { private: double literpreis; char * bezeichnung; public: Kraftstoff() // Konstruktor (default) { literpreis = 0.0; bezeichnung = ""; } Kraftstoff(double lp, char * n) // Konstruktor (mit Parametern) { literpreis = lp; bezeichnung = n; } double ArtPreis() // Funktion Literpreisrueckgabe { return literpreis; } char * ArtName() // Funktion Bezeichnungsrueckgabe { return bezeichnung; } }; // Ende der Klassenvereinbarung "Kraftstoff" //--------------------------------------------------------------------------- class Beleg // Die Klasse "Beleg" vereinbaren { private: double liter; double preis; double mwst; double BruttoFaktor; Kraftstoff art; // Aufbau der Instanz "art" zur Klasse "Kraft-stoff" public: Beleg() // Konstruktor (default) { liter = preis = mwst = 0.0; } void setart(Kraftstoff a) // Die Art des Kraftstoffes festlegen { art = a; } void frgliter() { cout << endl << "Kassenabrechnung fuer Kraftstoff: "
C++ objektorientierte Programmierung
Dr. Thiem C++ Konsolenprogrammierung 120 Objektorientierter Ansatz