c++ kompakt

Download C++ kompakt

If you can't read please download the document

Upload: peter-baeumle-courth

Post on 30-May-2015

3.162 views

Category:

Documents


5 download

DESCRIPTION

C++ kompakt (Buchtext) - Peter Baeumle-Courth

TRANSCRIPT

  • 1. 1Peter Baeumle-CourthNachstehendes Dokument ist i.w. der Text meines Buches C++ kompaktDieses Dokument darf nur zu Unterrichtszwecken im Rahmenvon Veranstaltungen der FHDW oder des b.i.b. Eingesetzt werden.Die Urheberrechte des Verlages und des Autors bleiben unberhrt.

2. 2Inhaltsverzeichnis1. Einfhrung1.1. Voraussetzungen: Was Sie immer schon wissen sollten...1.2. Datenabstraktion1.3. Was ist Objektorientierte Programmierung?1.4. Von C zu C++1.5. Erste Programme1.6. bersicht: Geschichtliche Entwicklung2. Das Klassenkonzept2.1. Klasse und Instanz2.2. Schnittstelle und Implementation2.3. Schutzbereiche2.4. Inline2.5. Zeiger auf Klassenlemente (Operatoren .* und ->*)3. Konstruktoren und Destruktoren3.1. Initialisierung von Objekten3.2. Konstruktoren, Destruktoren und das berladen3.3. Referenzen3.4. Der Kopierkonstruktor3.5. Statische Klassenmitglieder3.6. Konstante Klassenmitglieder4. Dynamische Speicherverwaltung4.1. C: malloc und free4.2. C++: new und delete5. berladen von Operatoren5.1. berladen als Klassenmitgliedsfunktionen5.2. berladen als Freundfunktion Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 3. 36. Streams I: Ein- und Ausgabe6.1. Standard-Streams des Betriebssystems UNIX6.2. Standard-Ein- und -Ausgabe in ANSI-C6.3. Ein- und Ausgabe-Streams in C++6.4. berladen der Schiebeoperatoren7. Freunde7.1. Befreundete Funktionen7.2. berladene Freundfunktionen7.3. Befreundete Klassen8. Vererbungslehre: Abgeleitete Klassen8.1. Vererbung und die Wiederverwendbarkeit von Code8.2. Vererbungsarten: private, protected und public8.3. Mehrfachvererbung8.4. Kopierkonstruktoren in abgeleiteten Klassen9. Polymorphismus in C++9.1. Virtual Reality9.2. Frhe und spte Bindung10. Streams II: Dateioperationen10.1. Sequentielle Ein- und Ausgabe10.2. Wahlfreier Zugriff (Random Access)11. Templates11.1. Template-Funktionen11.2. Klassen-Templates12. Exception Handling12.1. Exception Handling in C12.2. Exception Handling in C++Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 4. 413. Ausblickbungenbung 1: Das erste Programmbung 2: berladene Funktionenbung 3: berladene Funktionenbung 4: Tauschenbung 5: Tastatureingabe in C++bung 6: Rechnen mit Brchenbung 7: Konstruktoren und Destruktorenbung 8: Statische Klassenmitgliederbung 9: Operator Overloadbung 10: Operator Overloadbung 11: Referenzenbung 12: Klassendesignbung 13: Ein fehlerhaftes Programmbung 14: Vererbungslehre - Klasse ANGESTELLTERbung 15: Weitere Operatoren in der Klasse BRUCHbung 16: Eine String-Klassebung 17: Noch einmal eine String-Klassebung 18: Funktionstemplatesbung 19: Ein KlassentemplateA. Anhang I: Weitere BeispielprogrammeA.1. Beispielklasse KTime: Zeit und DatumA.2. Beispielklassen KElement und KListe: Lineare ListenA.3. Templateklassen KElement und KListeB. Anhang II: ErgnzungenB.1. DigraphenB.2. TrigraphenB.3. SchlsselwrterB.4. Vererbung und Objektorientiertes Design - Einige TipsPeter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 5. 51. EinfhrungObjektorientierte Programmierung bedeutet fr viele Software-Entwicklerinnen und-Entwickler1) hufig zwangslufig auch C++, denn diese Sprache ermglicht einensanften Umstieg von einer prozeduralen Sprache wie C. Anders als in der zweiten,recht weit verbreiteten objektorientierten Sprache Smalltalk, die eine radikaleUmgewhnung bereits in der Arbeitsweise der Programmerstellung erfordert, lt esC++ zu, da ganz langsam und gemtlich, je nach Arbeitstempo des einzelnen C-Pro-grammierers, mehr und mehr objektorientierte Elemente in die Programmierungeinflieen.Und dies genau ist einer der Hauptkritikpunkte an C++. Denn: es gibt viel zu vielsogenannten C++-Code, der noch sehr weit entfernt ist von Objektorientierung! DieSoftwarefirmen, die damit leben (mssen), werden dies sptestens beim ersten Update,beim Release- oder gar beim Betriebssystemwechsel deutlich spren!Im Rahmen dieses Buches soll daher von Anfang an der Hauptgedanke objektorien-tiertes Programmieren im Vordergrund stehen, C++ dient hierbei als das Werkzeug.Formale Grundlage ist der sogenannte ISO/ANSI C++ Draft, der (vorlufige bzw.geplante) Standard fr C++, den Sie im World Wide Web unter der Adressehttp://www.cygnus.com/misc/wp finden knnen2). Die hier vorgestellten Programmewurden unter UNIX (HP-UX von Hewlett-Packard) mit dem HP-C++-Compiler 3.0entwickelt und getestet, zum Teil auch unter MS-DOS mit Borland Turbo C++ 3.0und 5.0 sowie unter Microsoft Windows NT mit den Symantec C++ Compilern in denVersionen 6.11 und 7.21. Eventuelle compilerspezifische Sachverhalte sind im Einzel-fall besonders erwhnt.1.1. Voraussetzungen: Was Sie immer schon wissen sollten...Der vorliegende Text geht davon aus, da der Leser bzw. die Leserin ber solideKenntnisse der Programmiersprache C (ANSI-C) verfgt. Auf eine ausfhrlicheWiederholung von C wird in diesem Rahmen verzichtet.Insbesondere sind fr die Praxis von Bedeutung: Strukturen (structs in C, in Pascalrecords), das Arbeiten mit Headerfiles (#include , #include "xy.h"1) Ich bitte alle Leserinnen um Verstndnis, da ich im folgenden die im Deutschen bliche mnnliche Form verwende, damit der Satzbau nicht noch aufwendiger wird, als er bei meiner Vorliebe fr lange Stze manchmal zu werden droht.2) Wenn Sie wollen, knnen Sie auch dem ANSI-Komitee einen Brief schreiben und um die jeweils aktuelle Fassung des C++-Standards bitten. Die Adresse des Komitees lautet: American National Standards Institute (ANSI), Standards Secretariat: CBEMA, 1250 Eye Street NW, Suite 200, Washington DC 20005. Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 6. 6usw.), mit Projekten (make o. .) und zumindest im Ansatz auch mit den sogenanntenLibraries (Bibliotheken). Alleine aus Platzgrnden werden jedoch die hier vorgestell-ten Programme in der Regel am Stck und nicht auf mehrere Dateien verteiltvorgestellt.Unter UNIX enden C-Quelltext-Dateinamen in der Regel auf .c (kleingeschriebenesc), C++-Quelltexte auf .C (grogeschriebenes C); unter DOS/Windows wird zwischenGro- und Kleinschreibung nicht unterschieden, dort haben sich die Endungen .C frC- und .CPP fr C++-Quelltexte durchgesetzt.Da alle relevanten Compiler mit der Endung .CPP zurechtkommen, werden wir imfolgenden die Dateinamen von C++-Quelltexten auf .cpp enden lassen. Headerfileserhalten, wie bereits in C, die Endung .h.Fr die optische Gestaltung der Quelltexte (Einrckung, Leerzeilen, Klammerungusw.), die Kommentierungen usw. sollen hier keine verbindlichen Vorgaben gemachtwerden. Jeder sollte sich nur stets bemhen, ein einheitliches und bersicht gewh-rendes Konzept durch all seine Programme hindurch beizubehalten.Die Aufteilung des Quelltextes in Deklarationen, Definitionen und Impementationensollte bei etwas greren Projekten wohldurchdacht sein. Im folgenden3) werden schonaus Platzgrnden bei den kleineren Programmen oftmals alle Komponenten in eineeinzige cpp-Datei aufgenommen. Ebenso wird in vielen Beispielen ein Programm-quelltext auf die gerade relevanten Punkte reduziert, insbesondere findet dort dannkeine umfassende Alles-mgliche- kann-passieren-Fehlerbehandlung statt.1.2. Datenabstraktion4)Die grundlegende Idee hinter der Datenabstraktion ist die, da ein Objekt (z.B. eineDatei, ein Stack5), eine Warteschlange, ein Fenster usw.) nur ber Operationenverwendet und verndert wird; seine interne Struktur wird jedoch vor all denenverborgen, die dieses Objekt nutzen mchten. Dabei lassen sich zwei Grade derDatenabstraktion unterscheiden: die einfache Datenabstraktion und das Bilden von abstrakten Datentypen (ADT).3) Der Autor ist sich darber bewut, da die neue deutsche Rechtschreib-Reform (ehemals: Rechtschreibreform) von 1996 einige orthographische Spielrume lt. Dieser Text entstand ohne einen Duden neuester Auflage auf dem Schreibtisch.4) Dieser Abschnitt lehnt sich stark an das als Standardwerk zu bezeichnende Buch von Helmut Balzert (s. Literaturverzeichnis) an.5) Ein Stack (Stapel) ist ein LIFO-Speicher (last in, first out), das heit ein Speicherbereich, bei dem das zuletzt abgelegte Element als erstes wieder weggenommen wird. So funktioniert in der Kantine ein Tablettstapel.Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 7. 71.2.1. Einfache DatenabstraktionEine einfache Datenabstraktion besteht aus logisch zusammengehrenden Zugriffs-operationen, die selbst wiederum funktionale Abstraktionen darstellen; sie ist dadurchgekennzeichnet, da ihre Zugriffsoperationen auf ein gemeinsames internes Gedcht-nis zugreifen, das Daten ber das Aufruf-Ende einer Zugriffsoperation hinaus auf-bewahrt. Das interne Gedchtnis ist entweder an die Laufzeit des entsprechendenSoftware-Systems gebunden ist oder es werden dessen Daten in einer Dateigespeichert.Sie beschreibt ein Objekt nicht mehr durch dessen Struktur, sondern charakterisiert esausschlielich durch die Definition der darauf ausfhrbaren Operationen, und sie wirddurch ihre Beschreibung kreiert, d.h. mit der Beschreibung ist gleichzeitig die Verein-barung genau eines Exemplars verbunden.Beispiel: Ein abstrakter StackBei einem Stack (auch Kellerspeicher genannt) kann immer nur auf das oberste Objektzugegriffen werden; das Objekt, das zuletzt in den Kellerspeicher gebracht wurde,mu auch als erstes wieder entnommen werden. Ein Stack kann mit den folgendenOperationen bearbeitet werden: neues Objekt im Keller aufbewahren (push), oberstes Objekt aus Keller entnehmen (pop), oberstes Objekt im Keller ansehen (top oder tos - top of stack).Damit kann das abstrakte Objekt STACK allein durch die ihn charakterisierendenZugriffsoperationen definiert werden6):data abstractionINTEGER_STACK; procedure PUSH(in: Z: integer; out F: boolean); Die Zahl Z wird im Keller abgelegt. Bei berlauf des Kellers wird F := true gesetzt. procedure POP(out F: boolean); Die oberste Zahl wird aus dem Keller entfernt.6) Wir verwenden hier eine bewut an Pascal angelehnte Pseudocodenotation, damit deutlich wird, da dies nicht fr C++ spezifisch ist.Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 8. 8Bei leerem Keller wird F := true gesetzt.procedure TOP(out Z: integer, out F: boolean);Die oberste Zahl im Keller wird gelesen.Bei leerem Keller wird F := true gesetzt.end INTEGER_STACK;Wenn der Benutzer sich ber die Wirkung der Operationen im klaren ist, dann reichtdiese Beschreibung zur Benutzung der Datenabstraktion aus. Wie der Keller nun imDetail implementiert wird, ist fr den Benutzer der Datenabstraktion STACKunwichtig.Eine Implementierung kann z.B. aussehen wie folgt.implementation INTEGER_STACK;constN = 100; { internes Gedchtnis }varS : array[ 1 .. N ] of integer; DEPTH : integer;procedure PUSH(in: Z: integer; out F: boolean);beginF := false;if DEPTH >= N thenF := trueelse beginDEPTH := DEPTH + 1;S[DEPTH] := Zendend;procedure POP(out F: boolean); Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 9. 9beginF := false;if DEPTH >= 1 thenDEPTH := DEPTH - 1elseF := trueend;procedure TOP(out Z: integer, out F: boolean);beginF := false;if DEPTH >= 1 thenZ := S[DEPTH]elseF := trueend;procedure init;beginDEPTH := 0end;end implementation. Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 10. 10Die Verwendung der einfachen Datenabstraktion bringt einige Vorteile mit sich: Die abstrakten Datenobjekte knnen einzig und allein durch Anwendung derdefinierten Zugriffsoperationen benutzt werden, ohne da irgendwelche Kenntnisseber die konkrete Implementation vorliegen mten! Durch die Datenabstraktion wird das was vom wie getrennt. Die Zugriffsoperationen knnen von den Anforderungen der Anwendung herfestgelegt werden, ohne sich Gedanken ber die Struktur des internenGedchtnisses (z.B. Datei-, Satz- und Datenstrukturaufbau) zu machen. nderungen an einer Zugriffsoperation haben im allgemeinen keine Auswirkungenauf andere Zugriffsoperationen, whrend ohne Datenabstraktion eine nderung derDatenstruktur unter Umstnden Auswirkungen auf alle zugreifenden Anweisungenhaben knnen.Je weniger Daten in der Parameterliste einer Zugriffsoperation bertragen werden,desto nderungsfreundlicher ist eine Datenabstraktion; desto mehr zuimplementierende Zugriffsoperationen erhlt man dadurch aber auch.1.2.2. Abstrakte DatentypenBei den einfachen Datenabstraktionen bewirkt die Beschreibung der Zugriffsoperatio-nen und die Beschreibung der Implementierung die Erzeugung eines Exemplars derbeschriebenen Datenabstraktion; d.h. die Vereinbarung einer Datenabstraktionentspricht der Vereinbarung eines Datentyps inklusive der darauf zugelassenen Opera-tionen.Eine erste Verallgemeinerung der einfachen Datenabstraktion liegt vor, wenn mananalog zur Definition von Datentypen die Definition von Datenabstraktionstypenermglicht; d.h. Typdefinition und Variablenvereinbarung werden voneinandergetrennt. Dadurch knnen beliebig viele Exemplare eines ADT erzeugt werden. JedesExemplar besitzt dann sein eigenes internes Gedchtnis.Ein abstrakter Datentyp (ADT) definiert eine Klasse von abstrakten Objekten, dievollstndig durch die auf diesen Objekten verfgbaren Operationen charakterisiertsind. Das bedeutet, da ein abstrakter Datentyp durch Definition der charakteristi-schen Operationen durch diesen Typ definiert werden kann.Die Definition lt allerdings offen, was die charakteristischen Operationen fr einenTyp sind. Ebenso ist unklar, wann ein Typ vollstndig charakterisiert ist. Diese Fragenbetreffen im wesentlichen die Semantik einer Datenabstraktion.Abstrakte Datentypen ermglichen also die Definition von von Datenabstraktionen alsTypen. Von diesen Datenabstraktionstypen mssen erst Variable vereinbart werden,damit eine Datenabstraktion existiert. Von ADTs knnen mehrere Exemplare angelegtwerden.Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 11. 11Eine weitere Verallgemeinerung erreicht man durch Parametrisierung von ADTs:abstrakte Datentypen knnen mit formalen Parametern versehen werden, und solcheParameter knnen selbst wiederum abstrakte Datentypen sein. Die praktische Anwen-dung solcher Abstraktionskonzepte hngt dabei weitgehend von der Untersttzungdurch geeignete Sprachkonzepte ab.Beispiel: Ein generischer STACK-TypEine Definition eines generischen Stack-Typs7) wird nachstehend vorgestellt. Derhierbei verwendete Begriff template bedeutet Schablone und wird bei C++ alsSchlsselwort verwendet.type data abstraction STACKTYP;{ Vereinbarung der Exemplarvariablen / internes Gedchtnis }const N = 100;varS : array[ 1 .. N ] of ; DEPTH : integer;{ Vereinbarung der Zugriffsprozeduren } procedure PUSH(in: Z: ; out F: boolean); procedure POP ( out F: boolean); procedure TOP ( out Z: , out F: boolean);{ Implementierung der Zugriffsprozeduren } procedure PUSH(in: Z: ; out F: boolean); begin F := false; if DEPTH >= N then F := true else begin DEPTH := DEPTH + 1; S[DEPTH] := Z7) vgl. hierzu auch das Beispiel 11.2.1, das einen generischen Stack in C++ umsetzt.Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 12. 12endend;procedure POP(out F: boolean);beginF := false;if DEPTH >= 1 thenDEPTH := DEPTH - 1elseF := trueend; Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 13. 13procedure TOP(out Z: , out F: boolean);beginF := false;if DEPTH >= 1 then Z := S[DEPTH]else F := trueend;procedure init;beginDEPTH := 0end;end STACK;Eine konkrete Variablenvereinbarung (Deklaration):var S1, S2, S3 : STACKTYP;Und das Absenden entsprechender Botschaften an die Objekte:S1.PUSH (34); S2.POP(F); oderPUSH (S3, 68); TOP(S1, element, F).1.3. Was ist Objektorientierte Programmierung?Objektorientierte Programmiersprachen wie C++ sind im wesentlichen durch dreiEigenschaften gekennzeichnet: unsichtbare Daten (Objekt/Klasse), eine Hierarchievon Objektdefinitionen / Klassen (Vererbung) und Polymorphie. Im nachfolgendenwerden einige Erluterungen, im wesentlichen unabhngig von der konkretenProgrammiersprache C++, gegeben.1.3.1. Klassen und ObjekteObjekte bestehen aus Daten und den zugehrigen Vorschriften, wie diese zu verndernsind. Daten und Vorschriften sind in einer Einheit (untrennbar) verschmolzen.Objekte reagieren auf an sie gerichtete Botschaften und verndern ihren inneren Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 14. 14Zustand nach Vorschriften in Form von Programmcodes, die Methoden genanntwerden.Objektorientiert Programmieren bedeutet, Botschaften (messages) an Objekte zusenden. Sie entsprechen Prozedur- bzw. Funktionsaufrufen in anderen Programmier-sprachen. Eine Botschaft wird als Aufforderung an ein Objekt aufgefat, eine seinerOperationen auszufhren. Diese wird in Eigenverantwortung des Objektes ausgefhrt.Datenverarbeitung wird als innere Fhigkeit der Objekte angesehen, welche diegewnschte Aufgabe nach ihnen vorgegebenen Methoden erledigen. Der direkteZugriff von auen auf Datenelemente eines Objekts ist nicht notwendig - undblicherweise auch nicht erlaubt. Die Menge der anwendbaren Botschaften einesObjektes heit seine Schnittstelle oder sein Methoden-Interface.Objekte sind also das, was man sonst als abstrakte Datenobjekte bezeichnet. Die Ideehinter der Datenabstraktion ist die, da ein Objekt nur ber Operationen verndertwird, da seine Internstruktur vor allen Verwendern dieses Objekts aber verborgenwird. Dieses Prinzip wird Datenkapselung oder Geheimhaltungsprinzip (InformationHiding) genannt. Eine Konsequenz dieses Prinzips ist, da bestimmte Informationenlokal gehalten werden, sich damit nicht ber ein ganzes Softwaresystem verteilen unddieses Softwaresystem damit bersichtlich und gut vernderbar bleibt.Daten und Methoden (Unterprogramme) werden untrennbar voneinander in Objektengekapselt. Die Methoden greifen auf Datenelemente zu, die den Zustand des Objektesspeichern. Da Objekte aber immer als Reprsentanten, als sogenannte Exemplare einesObjekttyps, vorkommen, sprechen wir bei diesen Daten von ExemplarvariablenoderInstanzvariablen. Ein konkretes Objekt wird auch als Instanz bezeichnet.Gleichartige Objekte werden zu sogenannten Klassen zusammengefat. Eine Klasseenthlt alle Informationen, die notwendig sind, um Objekte dieser Klasse zu beschrei-ben, zu erzeugen und zu benutzen, hnlich wie Typ-Definitionen in konventionellenprozeduralen Sprachen. Instanzen einer Klasse hren auf dieselben Botschaften, habenalso dieselbe Funktionalitt und die gleiche Struktur des Datenspeichers. Sie unter-scheiden sich nur im Inhalt der konkreten Exemplarvariablen: die Instanzen kunde1und kunde2 haben denselben internen Aufbau und kennen dieselben Methoden, dieeine Instanz verwaltet jedoch den Kunden Meier, die andere die Kundin Mller.Zustzlich zu den Instanzvariablen knnen Objekte noch Klassenvariable benutzen.Klassenvariable sind globale Variable, die fr alle Instanzen einer Klasse zur Verf-gung stehen und nur einmal in der Klasse selbst vorhanden sind: beispielsweise kanneine Klassenvariable zaehler mitprotokollieren, wieviele Instanzen von einer bestimm-ten Klasse jeweils existieren.Bei den Methoden einer Klasse unterscheiden wir zwischen Instanzmethoden undKlassenmethoden. Instanzmethoden werden an die Instanzen der Klasse gebunden,Klassenmethoden an die Klasse selbst: so kann die oben erwhnte Klassenvariablezaehler z. B. von zwei Klassenmethoden InkrementZaehler() und DekrementZaehler() Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 15. 15aktualisiert werden. Dagegen ist Ausgabe() i. a. eine Instanzmethode, die die konkre-ten Daten einer bestimmten Instanz auf den Bildschirm schreibt.Abstrakte Klassen sind Klassen, die nur dazu da sind, ihre Eigenschaften zu vererben.Von ihnen existieren daher keine Instanzen. So kann eine abstrakte Klasse Graphik-Objekt gebildet werden, von der spter Kreise, Rechtecke und Dodekaeder abgeleitetwerden. In der Klasse GraphikObjekt finden sich dann z. B. die fr alle Graphik-klassen erwnschten Vereinbarungen von Schnittstellen, etwa fr eine Methode Print()zur Druckerausgabe. Dabei kann natrlich nicht der Code fr diese Methode(n) in derKlasse GraphikObjekt abgelegt werden, sondern i.a. nur die dann fr alle vererbtenKlassen verbindliche Vorgabe, welche Schnittstelle eine solche Methode Print() besit-zen wird.Die fast schon klassisch zu nennende objektorientierte Programmiersprache Smalltalkbeinhaltet ber einhundert bereits installierte Systemklassen, die jederzeit in Anwen-dungen eingesetzt werden knnen. Im Bereich von C++ sind die von den Compilernbereits mitgelieferten Klassen hufig etwas sparsamer ausgestattet. Hier ist es blich,professionelle Programme unter Einsatz eigens hinzugekaufter Klassenbibliotheken zuimplementieren8).Um sich einen berblick ber die Klassen zu verschaffen, gibt es bei den modernenOOP-Entwicklungssystemen ein mchtiges Werkzeug: den Class Hierarchy Browser9).Wie bereits erlutert, sind Objekte abstrakte Datenobjekte, d.h. Objekte, dieausschlielich ber Zugriffsoperationen vernderbar sind. Klassen dienen ausschlie-lich dazu, solche Objekte zu beschreiben. Eine Klasse ist also eine Schablone (templa-te) zur Erzeugung solcher abstrakter Datenobjekte und ferner eine Beschreibung ihrerVernderung, d.h. eine Klasse ist ein abstrakter Datentyp.1.3.2. VererbungObjektorientierte Systeme kennen eine Vielzahl von vordefinierten Klassen, undnahezu jede Anwendung fgt neue Klassen hinzu. Diese Klassen sind jedoch nichtunabhngig voneinander angeordnet, sondern werden ber eine Rangordnung zueinan-der in Beziehung gesetzt. Dieses Schema, Klassenhierarchie oder Taxonomie genannt,geht vom Allgemeinen zum Speziellen und bringt Ordnung in das Klassengefge.Klassen, die hierarchisch unter einer Klasse angesiedelt sind, heien Unterklassenoder Subklassen dieser Klasse. Eine Klasse, die hierarchisch hher liegt, heitOber-klasse oder Superklasse.Beispiel:8) Allerdings bieten moderne C++-Compiler heute ebenfalls weit ber den ANSI-Standard hinausgehende Klassenbibliotheken an: Borland C++ die Object Windows Library (OWL), Microsoft Visual C++ oder Symantec C++ die Microsoft Foundation Classes (MFC). In der derzeit neuesten Version des Borland Compiler-Systems ist allerdings auch die MFC enthalten.9) Zu Beginn von Kapitel 8 wird beispielhaft ein Bildschirmschnappschu des Class Editors von Symantec C++ 7.21 gezeigt.Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 16. 16Object CollectionBagIndexedCollectionSetMit dieser Beziehung ist eine bestimmte Semantik verbunden: Die Unterklasse erbtalle Eigenschaften der jeweiligen Oberklasse, sofern diese Eigenschaften nicht neudefiniert werden. Man drckt dies auch manchmal so aus, da eine Klasse ihre Eigen-schaften an die Unterklassen vererbt. Somit besitzen die Objekte der Klasse Set dieEigenschaften von Collection, darber hinaus aber auch die zustzlichen in Setdefinierten Eigenschaften. Man sagt dann auch, die Klasse Set ist eine Spezialisierungvon Collection. Da die Eigenschaft, wie Objekte selbst aufgebaut sind, nur klassen-internen Charakter haben10), betrifft die Vererbung nur die Schnittstelle einer Klasse,nmlich die anwendbaren Methoden. Somit ist eine Methode der Klasse Collectionauch fr Objekte der Klasse Set anwendbar, sofern Set diese Methode nicht neudefiniert hat, d.h. eine Methode mit dem gleichen Botschaftsmuster definiert wurde.Dies bezeichnet man auch als berladen (overloading) einer Methode.Diese Vererbungsbeziehung ist nun transitiv: die Objekte von Set haben nicht nur dieEigenschaften von Collection, sondern auch von Object. Der Vererbungsbaum hat dieKlasse Object als Wurzel, die alle Methoden enthlt, die auf alle Objekte, welcherKlasse auch immer, anwendbar sind. Die Klassen auf einem Pfad des Baumes nenntman Vererbungskette. Somit sind die auf ein Objekt der Klasse Set anwendbarenMethoden diejenigen der Vererbungskette einschlielich Object mit Ausnahme derMethoden, die neu definiert wurden.Die Vererbung der Eigenschaften einer Klasse auf ihre Unterklassen hat folgendeKonsequenzen:a) Der gesamte Datenspeicher, d.h. alle Instanz- oder Exemplarvariablen, werden bernommen. Eine Unterklasse wird vielleicht noch neue Exemplarvariablen hinzufgen, um das Verhalten ihrer Exemplare zu spezialisieren. Es ist aber generell nicht mglich, Exemplarvariable wegzulassen.10)Man kann sich dies konkret so vorstellen, da die Verwaltung von Mewerten in C++ sowohl einArray von float-Werten wie eine dynamische Liste von double-Werten verwendet werden kann.Dieses Implementierungsdetail ist aber (meist) insofern unwichtig, da die entsprechende Klasse inbeiden Fllen zum Beispiel eine Methode GetGroesstenMesswert() bereitstellen kann, die infloat-Darstellung den grten gespeicherten Wert zurckliefert.Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 17. 17b) Alle Methoden der Ober- oder Elternklassen knnen von Objekten einer Unter- klasse verwendet werden11). Jedes Objekt ist Instanz genau einer bestimmten Klasse, was seine interne Struktur und seine anwendbaren Methoden angeht. Die anwendbaren Methoden sind die der entsprechenden Klasse sowie des ent- sprechenden Vererbungspfades. Das Objekt der Klasse hat die Exemplarvariablen, die in der Klassendefinition angegeben sind. Dadurch, da die Methoden des Ver- erbungspfades anwendbar sind, die wiederum auf Komponenten bergeordneter Klassen wirken, hat dieses Objekt aber implizit auch die Komponenten, die in den bergeordneten Klassendefinitionen enthalten sind. Diese bergeordneten Kompo- nenten sind jedoch nicht zugreifbar, d.h. knnen somit nicht ber eine Zuweisung direkt verndert werden, sondern nur dadurch, da die Methoden der Klassen des Vererbungspfades aktiviert werden.Vererbte Methoden existieren nur einmal: Alle Unterklassen greifen auf denselben inder Elternklasse vorhandenen Code zu. Wenn eine Instanz einer Klasse eine Mittei-lung nicht verarbeiten kann, wird sie an die entsprechende Oberklasse geschickt. Kannauch diese die Mitteilung nicht verarbeiten, wird sie weiter geschickt. Dies geschiehtso lange, bis die Mitteilung verstanden wird oder es in der hchsten Klasse zu einemFehler kommt.Einfache Vererbung bedeutet, da Klassen nur Unterklassen einer einzelnen Klassesein knnen. Mehrfache Vererbung (multiple inheritance) bedeutet, da eine Klassemehrere Oberklassen haben kann. Sie wird vom derzeit aktuellen ANSI-C++-Standardund den entsprechenden Compilern untersttzt.Vererbung ist ein wichtiges Mittel, um bereits vorhandene Objekte und Methoden zubenutzen und damit Redundanz von Daten und Code zu vermeiden. Der Programmie-rer kann neue Klassen erzeugen, indem er die Unterschiede zu bestehenden Klassenbeschreibt. Er mu nicht jedesmal von Grund auf neu beginnen. Der Implementie-rungsaufwand wird dadurch stark reduziert. Viele schon vorhande Teile knnenwiederbenutzt werden (reusability). Der Programmcode fr eine bestimmte Aufgabebefindet sich an nur einem Platz. Dies erleichtert die Software-Pflege von komplexenSystemen.1.3.3. PolymorphismusDer Ausdruck Polymorphismus (oder Polymorphie) kommt aus dem Griechischen undbedeutet soviel wie viele Formen (habend).Polymorphismus besagt einfach, da mehr als eine Methode den gleichen Namenaufweisen kann. Die Methoden mssen zu unterschiedlichen Objekttypen gehren.Polymorphismus ist ein leistungsstarkes Werkzeug bei der Codestrukturierung. InVerbindung mit der Vererbung ermglicht die Polymorphie eine signifikante Teilung11)Bei C++ mssen solche Methoden im sogenannten public- oder protected-Schutzbereich definiertwerden. Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 18. 18und Wiederverwendbarkeit des Codes. Sie wird durch einen Mechanismus erreicht,der spte Bindung (late binding) genannt wird. Spte oder auch dynamische Bindungbedeutet, da ein Objekt zur Laufzeit entscheidet, welche Methode ausgefhrt, d.h. obeine Methode der unmittelbaren Klasse des Objekts oder eine Methode der Oberklasseausgefhrt wird. Es besteht eine dynamische Bindung von der Mitteilung zurMethode.Dagegen steht die frhe oder statische Bindung. Hier wird schon zur bersetzungszeitdes Programms festgelegt, welche Methode aufgerufen wird. Zur Laufzeit kann dannkeine Vernderung des Aufrufs mehr vorgenommen werden. Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 19. 191.3.4. Charakterisierung der ObjektorientiertheitObjektorientierte Vorgehensweise ist also: das Konzept der Abstrakten Datentypen(ADT), u.a. Kapselung der Daten und Information Hiding, wird erweitert um Verer-bung, dynamische Bindung, Methoden und Mitteilungsverbindungen, die Methodenauslsen.Bei der Entwicklung von komplexeren Softwaresystemen als strukturierten Sammlun-gen von Implementierungen derartiger abstrakter Datentypen haben sowohl das Zielder Wiederbenutzbarkeit als auch der Gedanke der Software-Bausteine (Verlage-rung von Leistungen in die einzelnen Bauelemente) einen entscheidenden Einflu.1.4. Von C zu C++Kritik erhebt sich an C++ hufig von objektorientierten Dogmatikern, z.B. Program-mierern aus der Smalltalk-Ecke, daran, da ein C++-Programm zunchst einmal auchein C-Programm sein kann. Mit anderen Worten: man kann sehr pragmatischlangsam in C++ hineinwachsen, whrend man lange Zeit noch vieles im Stil desguten alten C, also prozedural, programmiert.Dabei erfordert C++ als objektorientierte Sprache eigentlich ein ganz neues Denken,ein prinzipiell andersartiges Vorgehen als das der konventionellen strukturierten undprozeduralen Programmierweise. Gleichzeitig rekrutieren sich heutzutage die meistenC++-Programmierer aus Kreisen ehemaliger oder noch aktuell in C programmierenderPersonen, so da es nur natrlich erscheint, zunchst einmal die sanften bergngevon C zu C++ darzustellen. In spteren Kapiteln soll dann jedoch auch das objektori-entierte Design im Vordergrund stehen.Zunchst einmal bietet C++ neben den in C blichen Kommentaren der Form /* ... */auch die Mglichkeit, Zeilenkommentare zu schreiben; ab einem doppeltenSchrgstrich // wird der Rest der betreffenden Zeile als Kommentar verstanden undvom C++-Compiler ignoriert (bzw. durch den Prprozessor eliminiert).int i=1; // Dies ist ein Kommentar zur Definition der Variablen i.Desweiteren knnen Deklarationen bzw. Definitionen12) von (z.B.) Variablen berallvorkommen, nicht nur zu Beginn eines Blockes. Und selbst innerhalb der for-Schlei-fenklausel kann eine Variable vereinbart werden.13)12)Zur Erinnerung: unter einer Deklaration versteht man das namentliche Bekanntmachen einesBezeichners; die Definition einer Variablen ist der Ort, an dem fr diese auch Speicherplatzangelegt wird.13)Die bisherigen C++ Implementationen geben dieser Variablen i eine Lebensdauer bis zum Endedes Blockes, in dem die for-Schleife plaziert ist. Nach dem neuen ANSI/ISO-Standard ist dieLebensdauer jedoch auf den Block der for-Schleife selbst reduziert worden. Peter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 20. 20int main(){for (int i=0; iMitgliedsspezifiziererobjectpointer->member []Indizierung pointer[expression] ()Funktionsaufruf expression(expression-list) ()Wertkonstruktiontype(expression-list) sizeofGre eines Objektessizeof expression sizeofGre eines Typssizeof(type) 15++ -- pre/post in/decrement lvalue++ lvalue-- ++lvalue --lvalue ~ binres Komplement~expression ! Negation!expression + - unres Plus/Minus +expression -expression & Adresse von &lvalue * Dereferenzierung*expression new Allokierung new type deleteDeallokierung delete pointer delete[]Deallokierung (Array) delete [] pointer ()Cast(ing) (type) expression 14.*Mitgliedszugriffobject.*pointer-to-member ->* Mitgliedszugriffpointer->*pointer 13*/% Multiplikation, Division expression * expression (etc). 12+ - Addition, Subtraktion expressionexpression 11> Links/Rechts-Shiftexpression>>expression 10< expression > >= 9 ==gleichexpression==expression !=ungleichexpression!=expression 8 & bitweises Und expression & expressionPeter Baeumle-Courth: C++ kompakt (PDF-Version August 2001) 23. 237^ bitweises XOR expression ^ expression6| bitweises Oderexpression | expression5&&logisches Und expression && expression4||logisches Oderexpression || expression3? : Bedingungsoperatorexpression ? expression : expression2= Zuweisung lvalue = expression *= /= %=Kombinierte lvalue *= expression (etc.) += -= Zuweisungsoperatoren = &= ^= |=1 ,Komma-Operatorexpression, expression1.5. Erste ProgrammeSehen wir uns das nachfolgende kleine Beispielprogramm simple1.cpp an. Hierwird von der neuen Form der Zeilenkommentare Gebrauch gemacht; auerdem wirdeine erste Realisierung von berlagerung an einem einfachen Beispiel von zweiFunktionen namens Ausgabe() gezeigt , die anhand ihrer Parameterliste identifiziertwerden. Beachten Sie bitte (noch einmal), da es in C innerhalb eines Moduls keinezwei verschiedenen Funktionen desselben Namens geben kann!Schlielich wird der Operator