Lizenziert für [email protected]. © 2017 Carl Hanser Fachbuchverlag. Alle Rechte vorbehalten. Keine unerlaubte Weitergabe oder Vervielfältiugulnrgi.ch BREYMANN AKTUELL N ZU E OR C++ 1 7 T U A EXTRA E-Book INSIDE 5. Aufl age C++ - orderid - 25403069 - transid - 25403069_1D - DER E N PROGRAMMIERER I L D // C++ LERNEN A // PROFESSIONELL ANWENDEN E // LÖSUNGEN NUTZEN H Im Internet: alle Beispiele und mehr auf www.cppbuch.de Lizenziert für [email protected]. © 2017 Carl Hanser Fachbuchverlag. Alle Rechte vorbehalten. Keine unerlaubte Weitergabe oder Vervielfältigung. Breymann Der C++-Programmierer - orderid - 25403069 - transid - 25403069_1D - Bleiben Sie auf dem Laufenden! Unser Computerbuch-Newsletter informiert Sie monatlich über neue Bücher und Termine. Profitieren Sie auch von Gewinnspielen und exklusiven Leseproben. Gleich anmelden unter www.hanser-fachbuch.de/newsletter Hanser Update ist der IT-Blog des Hanser Verlags mit Beiträgen und Praxistipps von unseren Autoren rund um die Themen Online Marketing, Webent- wicklung, Programmierung, Softwareentwicklung sowie IT- und Projekt management. Lesen Sie mit und abonnieren Sie unsere News unter www.hanser-fachbuch.de/update Lizenziert für [email protected]. © 2017 Carl Hanser Fachbuchverlag. Alle Rechte vorbehalten. Keine unerlaubte Weitergabe oder Vervielfältigung. - orderid - 25403069 - transid - 25403069_1D - Lizenziert für [email protected]. © 2017 Carl Hanser Fachbuchverlag. Alle Rechte vorbehalten. Keine unerlaubte Weitergabe oder Vervielfältigung. Ulrich Breymann Der C++-Programmierer C++ lernen – professionell anwenden – Lösungen nutzen Aktuell zu C++17 - orderid - 25403069 - transid - 25403069_1D - 5., überarbeitete Auflage Lizenziert für [email protected]. © 2017 Carl Hanser Fachbuchverlag. Alle Rechte vorbehalten. Keine unerlaubte Weitergabe oder Vervielfältigung. Prof. Dr. Ulrich Breymann lehrte Informatik an der Fakultät Elektrotechnik und Informatik der Hochschule Bremen. Kontakt: [email protected] Alle in diesem Buch enthaltenen Informationen, Verfahren und Darstellungen wurden nach bestem Wissen zusammengestellt und mit Sorgfalt getestet. Dennoch sind Fehler nicht ganz auszuschließen. Aus diesem Grund sind die im vorliegenden Buch enthaltenen Informatio- nen mit keiner Verpflichtung oder Garantie irgendeiner Art verbunden. Autor und Verlag übernehmen infolgedessen keine juristische Verantwortung und werden keine daraus fol- gende oder sonstige Haftung übernehmen, die auf irgendeine Art aus der Benutzung dieser Informationen – oder Teilen davon – entsteht. Ebenso übernehmen Autor und Verlag keine Gewähr dafür, dass beschriebene Verfahren usw. frei von Schutzrechten Dritter sind. Die Wiedergabe von Gebrauchsnamen, Handels- namen, Warenbezeichnungen usw. in diesem Buch berechtigt deshalb auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften. Bibliogr-af ioscrhed Inefrorimda ti-o n2 d5er4 D0eu3ts0ch6en9 N -a titornaalbnibsliiodth e-k : 25403069_1D - Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbiblio- grafie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar. Dieses Werk ist urheberrechtlich geschützt. Alle Rechte, auch die der Übersetzung, des Nachdruckes und der Vervielfältigung des Buches, oder Teilen daraus, vorbehalten. Kein Teil des Werkes darf ohne schriftliche Genehmigung des Verlages in irgendeiner Form (Fotokopie, Mikrofilm oder ein anderes Verfahren) – auch nicht für Zwecke der Unterrichtsgestaltung – reproduziert oder unter Verwendung elektroni- scher Systeme verarbeitet, vervielfältigt oder verbreitet werden. © 2018 Carl Hanser Verlag München, www.hanser-fachbuch.de Lektorat: Brigitte Bauer-Schiewek Copy editing: Petra Kienle, Fürstenfeldbruck Herstellung: Irene Weilhart Umschlagdesign: Marc Müller-Bremer, www.rebranding.de, München Umschlagrealisation: Stephan Rönigk Datenbelichtung, Druck und Bindung: Kösel, Krugzell Ausstattung patentrechtlich geschützt. Kösel FD 351, Patent-Nr. 0748702 Printed in Germany Print-ISBN: 978-3-446-44884-1 E-Book-ISBN: 978-3-446-45386-9 Lizenziert für [email protected]. © 2017 Carl Hanser Fachbuchverlag. Alle Rechte vorbehalten. Keine unerlaubte Weitergabe oder Vervielfältigung. Inhalt Vorwort........................................................................................... 23 Teil I: Einführung in C++ ........................................................ 27 1 Esgehtlos!............................................................................... 29 - orderid - 25403069 - transid - 25403069_1D - 1.1 Historisches.................................................................................... 29 1.2 ObjektorientierteProgrammierung......................................................... 30 1.3 WerkzeugezumProgrammieren............................................................ 32 1.4 DasersteProgramm.......................................................................... 33 1.4.1 Namenskonventionen ............................................................. 39 1.5 IntegrierteEntwicklungsumgebung........................................................ 39 1.6 EinfacheDatentypenundOperatoren...................................................... 42 1.6.1 Ausdruck............................................................................ 42 1.6.2 GanzeZahlen....................................................................... 42 1.6.3 ReelleZahlen....................................................................... 49 1.6.4 Konstanten.......................................................................... 53 1.6.5 Zeichen.............................................................................. 54 1.6.6 LogischerDatentypbool.......................................................... 58 1.6.7 Referenzen.......................................................................... 59 1.6.8 RegelnzumBildenvonAusdrücken ............................................ 60 1.6.9 Standard-Typumwandlungen .................................................... 61 1.7 GültigkeitsbereichundSichtbarkeit........................................................ 62 1.7.1 Namespacestd...................................................................... 64 Lizenziert für [email protected]. © 2017 Carl Hanser Fachbuchverlag. Alle Rechte vorbehalten. Keine unerlaubte Weitergabe oder Vervielfältigung. 6 Inhalt 1.8 Kontrollstrukturen............................................................................ 65 1.8.1 Anweisungen....................................................................... 65 1.8.2 Sequenz(Reihung)................................................................. 67 1.8.3 Auswahl(Selektion,Verzweigung) .............................................. 67 1.8.4 Fallunterscheidungenmitswitch ................................................ 72 1.8.5 Wiederholungen.................................................................... 75 1.8.6 Kontrollemitbreakundcontinue ............................................... 82 1.9 BenutzerdefinierteundzusammengesetzteDatentypen................................. 84 1.9.1 Aufzählungstypen ................................................................. 84 1.9.2 Strukturen........................................................................... 87 1.9.3 DerC++-Standardtypvector ..................................................... 88 1.9.4 Zeichenketten:DerC++-Standardtypstring ................................... 93 1.9.5 ContainerundSchleifen .......................................................... 95 1.9.6 Typermittlungmitauto ........................................................... 97 1.9.7 DeklarationeinerstrukturiertenBindungmitauto............................ 98 1.9.8 UnionsundBitfelder .............................................................. 99 1.10 EinfacheEin-undAusgabe ................................................................. 101 1.10.1 Standardein-und-ausgabe....................................................... 101 1-.1 0o.2rdEeirn-idun d- A2us5g4ab0e3m0it6Da9te i-e nt.r..a...n..s..i.d... .-.. .2...5..4..0...3..0...6..9..._..1..D.... .-.... 104 2 Programmstrukturierung..............................................................109 2.1 Funktionen..................................................................................... 110 2.1.1 AufbauundPrototypen........................................................... 110 2.1.2 GültigkeitsbereicheundSichtbarkeitinFunktionen.......................... 112 2.1.3 Lokalestatic-Variable:FunktionmitGedächtnis.............................. 113 2.2 SchnittstellenzumDatentransfer........................................................... 114 2.2.1 ÜbergabeperWert................................................................. 115 2.2.2 ÜbergabeperReferenz ............................................................ 119 2.2.3 GefahrenbeiderRückgabevonReferenzen.................................... 120 2.2.4 VorgegebeneParameterwerteundunterschiedlicheParameterzahl......... 121 2.2.5 ÜberladenvonFunktionen ....................................................... 122 2.2.6 Funktionmain().................................................................... 123 2.2.7 BeispielTaschenrechnersimulation.............................................. 124 2.2.8 SpezifikationvonFunktionen.................................................... 129 2.2.9 AlternativeFunktions-Syntax.................................................... 129 2.3 ModulareProgrammgestaltung............................................................. 129 2.3.1 SteuerungderÜbersetzungnurmit#include.................................. 130 Lizenziert für [email protected]. © 2017 Carl Hanser Fachbuchverlag. Alle Rechte vorbehalten. Keine unerlaubte Weitergabe oder Vervielfältigung. Inhalt 7 2.3.2 EinbindenvorübersetzterProgrammteile....................................... 131 2.3.3 Übersetzungseinheit,Deklaration,Definition .................................. 132 2.3.4 DateiübergreifendeGültigkeitundSichtbarkeit................................ 134 2.3.5 PräprozessordirektivenundMakros............................................. 136 2.4 Namensräume ................................................................................. 144 2.5 inline-Funktionenund-Variable ........................................................... 146 2.5.1 inline-Variablen.................................................................... 147 2.6 constexpr-Funktionen........................................................................ 147 2.7 Rückgabetypauto............................................................................. 150 2.8 Funktions-Templates ......................................................................... 151 2.8.1 SpezialisierungvonTemplates................................................... 153 2.8.2 EinbindenvonTemplates......................................................... 154 2.9 C++-Header.................................................................................... 156 2.9.1 EinbindenvonC-Funktionen .................................................... 158 3 Objektorientierung1 ....................................................................159 3.1 AbstrakterDatentyp.......................................................................... 160 3.2 KlassenundObjekte.......................................................................... 161 3.2.1 const-ObjekteundMethoden..................................................... 164 - orderid - 25403069 - transid - 25403069_1D - 3.2.2 inline-Elementfunktionen......................................................... 165 3.3 InitialisierungundKonstruktoren.......................................................... 166 3.3.1 Standardkonstruktor............................................................... 167 3.3.2 DirekteInitialisierungderAttribute............................................. 168 3.3.3 AllgemeineKonstruktoren........................................................ 168 3.3.4 Kopierkonstruktor.................................................................. 171 3.3.5 Typumwandlungskonstruktor.................................................... 174 3.3.6 Konstruktorundmehrvorgebenoderverbieten............................... 176 3.3.7 EinheitlicheInitialisierungundSequenzkonstruktor.......................... 176 3.3.8 DelegierenderKonstruktor........................................................ 179 3.3.9 constexpr-Konstruktorund-Methoden......................................... 180 3.4 Beispiel:RationaleZahlen................................................................... 183 3.4.1 Aufgabenstellung.................................................................. 183 3.4.2 Entwurf.............................................................................. 184 3.4.3 Implementation..................................................................... 187 3.5 Destruktoren................................................................................... 192 3.6 WiekommtmanzuKlassenundObjekten?EinBeispiel................................ 194 3.7 GegenseitigeAbhängigkeitvonKlassen................................................... 199 Lizenziert für [email protected]. © 2017 Carl Hanser Fachbuchverlag. Alle Rechte vorbehalten. Keine unerlaubte Weitergabe oder Vervielfältigung. 8 Inhalt 4 Intermezzo:Zeiger......................................................................201 4.1 ZeigerundAdressen.......................................................................... 202 4.2 C-Arrays........................................................................................ 205 4.2.1 C-Array,std::size()undsizeof.................................................... 207 4.2.2 InitialisierungvonC-Arrays...................................................... 208 4.2.3 Zeigerarithmetik.................................................................... 208 4.2.4 IndexoperatorbeiC-Arrays....................................................... 209 4.2.5 C-Arraymitbegin()undend()durchlaufen .................................... 209 4.3 C-Zeichenketten............................................................................... 210 4.3.1 SchleifenundC-Strings........................................................... 213 4.4 DynamischeDatenobjekte................................................................... 217 4.4.1 FreigebendynamischerObjekte.................................................. 220 4.5 ZeigerundFunktionen....................................................................... 222 4.5.1 ParameterübergabemitZeigern.................................................. 222 4.5.2 ArrayalsFunktionsparameter.................................................... 224 4.5.3 constundZeiger-Parameter...................................................... 225 4.5.4 Parameterdesmain-Programms................................................. 225 4.5.5 GefahrenbeiderRückgabevonZeigern........................................ 226 4.6 th-i so-Zredigeerr..i.d... .-.. .2..5...4..0...3..0..6...9.. ..-. .t..r..a...n..s..i.d... .-.. .2...5..4..0...3..0...6..9..._..1..D.... .-.... 227 4.7 MehrdimensionaleC-Arrays................................................................. 229 4.7.1 StatischemehrdimensionaleC-Arrays.......................................... 229 4.7.2 MehrdimensionalesArrayalsFunktionsparameter............................ 230 4.7.3 DynamischerzeugtemehrdimensionaleArrays................................ 233 4.7.4 KlassefürdynamischeszweidimensionalesArray ............................ 235 4.8 BinäreEin-/Ausgabe ......................................................................... 241 4.9 ZeigeraufFunktionen........................................................................ 244 4.10 TypumwandlungenfürZeiger............................................................... 248 4.11 ZeigeraufElementfunktionenund-daten ................................................ 249 4.11.1 ZeigeraufElementfunktionen.................................................... 249 4.11.2 ZeigeraufElementdaten.......................................................... 250 4.12 KomplexeDeklarationenlesen.............................................................. 250 4.12.1 Lesbarkeitmittypedefundusingverbessern .................................. 251 4.13 AlternativezurohenZeigern,newunddelete............................................ 253 5 Objektorientierung2 ...................................................................255 5.1 EineString-Klasse ............................................................................ 255 5.1.1 friend-Funktionen ................................................................. 261 Lizenziert für [email protected]. © 2017 Carl Hanser Fachbuchverlag. Alle Rechte vorbehalten. Keine unerlaubte Weitergabe oder Vervielfältigung. Inhalt 9 5.2 String-Ansicht................................................................................. 262 5.3 KlassenspezifischeDatenundFunktionen ................................................ 265 5.3.1 KlassenspezifischeKonstante..................................................... 269 5.4 Klassen-Templates............................................................................ 271 5.4.1 EinStack-Template................................................................ 271 5.4.2 StackmitstatischfestgelegterGröße............................................ 274 5.5 Typbestimmungmitdecltypeunddeclval................................................. 275 6 Vererbung .................................................................................279 6.1 VererbungundInitialisierung............................................................... 285 6.2 Zugriffsschutz................................................................................. 286 6.3 TypbeziehungzwischenOber-undUnterklasse.......................................... 288 6.4 Code-Wiederverwendung.................................................................... 289 6.4.1 Konstruktorerben.................................................................. 290 6.5 ÜberschreibenvonFunktioneninabgeleitetenKlassen................................. 292 6.5.1 VirtuelleFunktionen............................................................... 294 6.5.2 AbstrakteKlassen.................................................................. 299 6.5.3 VirtuellerDestruktor............................................................... 304 6.5.4 PrivatevirtuelleFunktionen...................................................... 307 - orderid - 25403069 - transid - 25403069_1D - 6.6 ProblemederModellierungmitVererbung................................................ 309 6.7 Mehrfachvererbung........................................................................... 312 6.7.1 Namenskonflikte................................................................... 314 6.7.2 VirtuelleBasisklassen ............................................................. 315 6.8 Standard-Typumwandlungsoperatoren.................................................... 319 6.9 TypinformationenzurLaufzeit.............................................................. 322 6.10 Using-Deklarationfürprotected-Funktionen............................................. 323 6.11 Private-undProtected-Vererbung.......................................................... 324 7 Fehlerbehandlung........................................................................329 7.1 Ausnahmebehandlung ....................................................................... 331 7.1.1 Exception-SpezifikationinDeklarationen...................................... 334 7.1.2 Exception-HierarchieinC++..................................................... 335 7.1.3 BesondereFehlerbehandlungsfunktionen....................................... 337 7.1.4 ErkennenlogischerFehler ........................................................ 338 7.1.5 ArithmetischeFehler/Divisiondurch0........................................ 340 7.2 Speicherbeschaffungmitnew............................................................... 341 7.3 Exception-Sicherheit ......................................................................... 342