Inhalt 1 2 Einstieg in die Welt von C++ .................................... 15 1.1 1.2 1.3 1.4 1.5 1.6 1.7 Die (Kurz-)Geschichte von C++ .............................. Der ANSI-C++-Standard ......................................... Was benötige ich für C++? ..................................... Welches Betriebssystem ...? ................................... Was kann ich von dem Buch erwarten? .................. Listings zum Buch .................................................. Aufgaben im Buch .................................................. 1.7.1 Level 1 ...................................................... 1.7.2 Level 2 ...................................................... 1.7.3 Level 3 ...................................................... 15 17 18 20 20 20 20 21 21 21 Verwendung der Basisdatentypen in C++ ................ 22 2.1 2.2 22 24 24 25 27 27 29 29 29 31 32 2.3 2.4 Das erste Programm in C++ .................................... Die Standard-Eingabe- und -Ausgabestreams ......... 2.2.1 Die Streams von C++ ................................. 2.2.2 Ausgabe mit »cout« ................................... 2.2.3 Ausgabe mit »cerr« oder »clog« ................. 2.2.4 Eingabe mit »cin« ...................................... Einige Symbole von C++ ........................................ 2.3.1 Bezeichner ................................................ 2.3.2 Literale ...................................................... 2.3.3 Kommentare ............................................. Grundlagen zu den Basisdatentypen ....................... 2.4.1 Deklaration und Definition von Variablen ................................................... 2.4.2 Initialisieren einer Variablen ....................... 2.4.3 Vereinheitlichte Initialisierung mit C++11 ................................................. 2.4.4 Ganzzahltypen ........................................... 2.4.5 Vorzeichenlos und vorzeichenbehaftet ...... 2.4.6 Fließkommazahlentypen ............................ 2.4.7 Limits für die Basisdatentypen ................... 32 34 35 36 47 48 50 5 Inhalt 2.4.8 2.5 2.6 2.7 2.8 2.9 2.10 3 Kontrollstrukturen, Funktionen und Präprozessor-Direktiven ........................................... 3.1 6 Die Byte-Größe mit dem »sizeof«Operator ................................................... 2.4.9 Sicherheit beim Kompilieren mit »static_assert« (C++11) .............................. »auto«-Typ (C++11) ............................................... Rechnen mit Zahlen ............................................... 2.6.1 Arithmetische Operatoren ......................... 2.6.2 Ungenaue Fließkommazahlen .................... 2.6.3 Erweiterte Darstellung arithmetischer Operatoren ............................................... 2.6.4 Inkrement- und Dekrementoperator .......... Zufallszahlen (C++11) ............................................. Typumwandlung .................................................... 2.8.1 Implizite Umwandlung durch den Compiler ................................................... 2.8.2 Automatische Typumwandlung beschränken (C++11) ................................ 2.8.3 Explizite Typumwandlung .......................... 2.8.4 C++-Typumwandlungs-Operatoren ............ 2.8.5 Gefährliche Typumwandlung mit den alten C-Casts ............................................. Konstanten ............................................................ Aufgaben ............................................................... 2.10.1 Level 1 ...................................................... 2.10.2 Level 2 ...................................................... 2.10.3 Level 3 ...................................................... Kontrollstrukturen .................................................. 3.1.1 Anweisungen und Anweisungsblöcke ........ 3.1.2 Verzweigungen .......................................... 3.1.3 Der Bedingungsoperator ?: ........................ 3.1.4 Logische Operatoren ................................. 52 52 53 54 55 57 59 59 61 62 63 66 67 67 70 71 72 72 72 73 74 74 74 75 83 84 Inhalt 3.2 3.3 3.4 4 3.1.5 Die Fallunterscheidung – »switch« ............. 3.1.6 Schleifen ................................................... Funktionen ............................................................ 3.2.1 Funktionen definieren ............................... 3.2.2 Funktionen aufrufen .................................. 3.2.3 Funktionen deklarieren .............................. 3.2.4 Funktionsparameter (Call-by-Value) ........... 3.2.5 Standardparameter .................................... 3.2.6 Rückgabewert von Funktionen .................. 3.2.7 Funktionen überladen ............................... 3.2.8 Gültigkeitsbereich von lokalen und globalen Variablen ..................................... 3.2.9 Inline-Funktionen ...................................... 3.2.10 Die »main«-Funktion ................................. 3.2.11 Programmende .......................................... Präprozessor-Direktiven ......................................... 3.3.1 Die »#include«-Direktive ........................... 3.3.2 Die »#define«-Direktive ............................. 3.3.3 Bedingte Kompilierung .............................. 3.3.4 Weitere Präprozessor-Direktiven ............... Aufgaben ............................................................... 3.4.1 Level 1 ...................................................... 3.4.2 Level 2 ...................................................... 3.4.3 Level 3 ...................................................... 87 90 100 101 102 103 104 105 107 109 111 113 115 116 117 118 119 121 123 124 124 124 126 Höhere und fortgeschrittene Datentypen ................ 127 4.1 4.2 4.3 Zeiger .................................................................... 4.1.1 Zeiger deklarieren ...................................... 4.1.2 Adresse im Zeiger speichern ...................... 4.1.3 Zeiger dereferenzieren ............................... 4.1.4 Speichergröße von Zeigern ........................ 4.1.5 Zeigerarithmetik ........................................ Referenzen ............................................................. Arrays .................................................................... 4.3.1 Der C++-Container »vector« ...................... 4.3.2 C-Arrays .................................................... 127 128 129 131 134 134 135 137 138 142 7 Inhalt 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 5 146 146 148 150 153 153 155 157 158 160 163 164 165 166 168 169 170 171 173 173 177 178 181 182 183 183 185 Modularisierung ....................................................... 186 5.1 8 Zeichenketten verwenden ...................................... 4.4.1 Der C++-Container »string« ....................... 4.4.2 Unterstützung von Unicode (C++11) ......... 4.4.3 C-Zeichenketten ........................................ Höhere Datentypen bei Funktionen verwenden ..... 4.5.1 Zeiger als Funktionsparameter ................... 4.5.2 Zeiger als Rückgabewert ............................ 4.5.3 Referenzen als Funktionsparameter ........... 4.5.4 Referenzen als Rückgabewert .................... 4.5.5 C-Arrays oder C-Strings als Funktionsparameter ................................... Dynamische Speicherobjekte .................................. 4.6.1 Dynamisch Objekte mit »new« anlegen ..... 4.6.2 Fehler bei der Speicheranforderung abfangen ................................................... 4.6.3 Speicher mit »delete« wieder freigeben ..... Strukturen .............................................................. 4.7.1 Strukturen deklarieren ............................... 4.7.2 Zugriff auf die Strukturelemente ................ 4.7.3 Zugriff auf die Elemente über Strukturzeiger ............................................ 4.7.4 Strukturen vergleichen ............................... 4.7.5 Dynamische Datenstrukturen mit Strukturen ................................................. Union ..................................................................... Aufzählungstyp »enum« ......................................... Eigene Namen mit »typedef« ................................. Aufgaben ............................................................... 4.11.1 Level 1 ...................................................... 4.11.2 Level 2 ...................................................... 4.11.3 Level 3 ...................................................... Namensräume ........................................................ 186 5.1.1 Neuen Namensbereich deklarieren ............ 186 5.1.2 Namensbereich verschachteln ................... 189 Inhalt 5.1.3 5.2 5.3 5.4 5.5 5.6 6 Namensbereich ist ein eigener Gültigkeitsbereich ...................................... 5.1.4 Namensbereich mit »using« importieren .... 5.1.5 Einzelne Bezeichner mit »using« importieren ............................................... 5.1.6 Aliasse für Namensbereiche ....................... 5.1.7 Namensraum »std« .................................... Speicherklassenattribute ......................................... 5.2.1 Schlüsselwort »extern« .............................. 5.2.2 Schlüsselwort »static« ................................ Typqualifikatoren ................................................... 5.3.1 Schlüsselwort »const« ................................ 5.3.2 Schlüsselwort »volatile« ............................. Weitere Attribute ................................................... Modulare Programmierung .................................... 5.5.1 Aufteilung ................................................. 5.5.2 Die öffentliche Schnittstelle (Headerdatei) ........................................... 5.5.3 Private Datei(en) ....................................... 5.5.4 Die Client-Datei ........................................ 5.5.5 Nur Objektcode oder Bibliothek vorhanden ................................................. Aufgaben ............................................................... 5.6.1 Level 1 ...................................................... 5.6.2 Level 2 ...................................................... 189 192 192 193 193 195 195 196 199 199 200 201 201 203 204 206 206 207 207 208 208 Klassen ..................................................................... 210 6.1 6.2 Abstraktionsmechanismus ...................................... Klassen .................................................................. 6.2.1 Klassendefinition ....................................... 6.2.2 Elementfunktionen definieren ................... 6.2.3 Zugriffskontrolle mit »public« und »private« ................................................... 6.2.4 Zugriff auf die Daten innerhalb einer Klasse ........................................................ 210 211 211 213 215 217 9 Inhalt 6.3 6.4 6.5 6.6 7 218 223 224 225 227 229 231 232 234 236 236 237 240 240 243 245 246 247 247 248 Objekte und Klassenelemente ................................. 249 7.1 7.2 7.3 10 6.2.5 Objekte erzeugen und benutzen ................ Konstruktoren ........................................................ 6.3.1 Konstruktoren deklarieren ......................... 6.3.2 Konstruktoren definieren ........................... 6.3.3 Implizite Konvertierungen verhindern – »explicit« ................................................... 6.3.4 Konstruktoren delegieren (C++11) ............. 6.3.5 Standardkonstruktor (DefaultKonstruktor) .............................................. 6.3.6 Kopierkonstruktor ..................................... 6.3.7 Move-Konstruktor (C++11) ....................... Destruktoren .......................................................... 6.4.1 Destruktor deklarieren ............................... 6.4.2 Destruktor definieren ................................ Elementfunktionen ................................................. 6.5.1 Inline-Elementfunktionen .......................... 6.5.2 Konstante Elementfunktionen (read-only) ................................................ 6.5.3 »this«-Zeiger .............................................. Aufgaben ............................................................... 6.6.1 Level 1 ...................................................... 6.6.2 Level 2 ...................................................... 6.6.3 Level 3 ...................................................... Konstante Objekte ................................................. Objekte als (Element-)Funktionsargumente ............ 7.2.1 Hilfsfunktionen .......................................... 7.2.2 Wertübergabe als Kopie (Call-by-Value) .... 7.2.3 Wertübergabe als Zeiger ............................ 7.2.4 Wertübergabe als Referenz ........................ 7.2.5 Wertübergabe bei Elementfunktionen ....... 7.2.6 »this«-Zeiger .............................................. Objekte als Rückgabewerte .................................... 249 250 250 251 253 255 256 257 260 Inhalt 7.4 7.5 7.6 7.7 7.8 7.9 7.10 8 Arrays von Objekten .............................................. Dynamische Objekte .............................................. Mehr zu den Klassenelementen .............................. 7.6.1 Dynamische Klassenelemente .................... 7.6.2 Statische Klassenelemente ......................... 7.6.3 Konstante Klassenelemente ....................... Andere Klassenobjekte als Datenelement einer Klasse ............................................................ Elementinitialisierer ................................................ Gute Freunde (»friend«) ......................................... Aufgaben ............................................................... 7.10.1 Level 1 ...................................................... 7.10.2 Level 2 ...................................................... 7.10.3 Level 3 ...................................................... 262 263 265 265 273 276 277 283 285 287 288 288 289 Operatoren überladen .............................................. 290 8.1 8.2 8.3 8.4 8.5 8.6 8.7 Schlüsselwort »operator« ....................................... Zweistellige (arithmetische) Operatoren überladen .............................................................. 8.2.1 Operatorüberladung als Elementfunktion einer Klasse ............................................... 8.2.2 Operatorüberladung als globale Hilfsfunktion .............................................. 8.2.3 Zweistellige Operatoren zusammengefasst ...................................... Einstellige Operatoren überladen ........................... Zuweisungsoperator überladen .............................. Ein-/Ausgabeoperator überladen ............................ 8.5.1 Eingabeoperator >> überladen ................... 8.5.2 Ausgabeoperator << überladen .................. Weitere Operatorüberladungen ............................. Konvertierungsoperatoren ...................................... 8.7.1 Konvertierungskonstruktor ........................ 8.7.2 Globale Konvertierungsfunktion ................ 291 293 294 297 299 299 303 305 306 307 308 309 310 311 11 Inhalt 8.8 9 Aufgaben ............................................................... 8.8.1 Level 1 ...................................................... 8.8.2 Level 2 ...................................................... 8.8.3 Level 3 ...................................................... 314 314 314 315 Vererbung (Abgeleitete Klassen) ............................. 316 9.1 9.2 9.3 9.4 9.5 Die Vorbereitung ................................................... Die Ableitung einer Klasse ...................................... 9.2.1 »public«-Zugriffsrechte einer abgeleiteten Klasse ........................................................ 9.2.2 Erben und erweitern .................................. 9.2.3 Zugriff auf die Daten .................................. 9.2.4 Redefinition von Elementfunktionen .......... 9.2.5 Konstruktoren ........................................... 9.2.6 Destruktor ................................................. 9.2.7 Programmbeispiel ...................................... 9.2.8 Zugriffsrecht »protected« ........................... 9.2.9 Zugriffsrechte bei der Vererbung von Klassen ...................................................... 9.2.10 Implizite Typumwandlung abgeleiteter Klassen ...................................................... 9.2.11 Konstruktoren vererben (C++11) ............... Mehrfachvererbung ................................................ Virtuelle Vererbung ................................................ Aufgaben ............................................................... 9.5.1 Level 1 ...................................................... 9.5.2 Level 2 ...................................................... 9.5.3 Level 3 ...................................................... 317 318 320 320 321 323 324 326 326 327 328 330 331 332 336 341 341 342 343 10 Templates ................................................................. 344 10.1 12 Funktions-Templates .............................................. 10.1.1 Funktions-Template definieren .................. 10.1.2 Typübereinstimmung ................................. 10.1.3 Funktions-Templates über mehrere Module ..................................................... 10.1.4 Funktions-Template spezialisieren .............. 344 345 347 348 348 Inhalt 10.2 10.3 10.4 10.1.5 Templates mit verschiedenen Parametern ................................................ 349 10.1.6 Explizite Template-Argumente ................... 351 Klassen-Templates .................................................. 352 10.2.1 Klassen-Template definieren ...................... 353 10.2.2 Elementfunktionen von KlassenTemplates definieren ................................. 354 10.2.3 Klassen-Template instantiieren .................. 357 Templates der Standardbibliothek .......................... 360 10.3.1 Container der Standardbibliothek .............. 361 10.3.2 Iteratoren .................................................. 365 10.3.3 Algorithmen .............................................. 365 Aufgaben ............................................................... 367 10.4.1 Level 1 ...................................................... 367 10.4.2 Level 2 ...................................................... 367 10.4.3 Level 3 ...................................................... 368 11 Exception-Handling (Fehlerbehandlung) ................. 370 11.1 11.2 11.3 11.4 11.5 11.6 11.7 Exception auslösen ................................................. Exception auffangen und behandeln ....................... 11.2.1 »terminate«-Handler einrichten ................. 11.2.2 Alternatives »catch (...)« ............................ 11.2.3 Stack-Abwicklung ...................................... Ausnahme-Klassen (Fehlerklassen) ......................... Standard-Exceptions .............................................. 11.4.1 Virtuelle Methode »what()« ....................... 11.4.2 Anwenden der Standard-Exceptions .......... System-Exceptions ................................................. 11.5.1 »bad_alloc« ............................................... 11.5.2 »bad_cast« ................................................ 11.5.3 »bad_typeid« ............................................. 11.5.4 »bad_exception« ....................................... »noexcept« (C++11) ............................................... Aufgaben ............................................................... 11.7.1 Level 1 ...................................................... 371 371 375 376 376 377 379 380 380 384 384 384 384 385 385 387 387 13 Inhalt 12 Weitere Neuigkeiten in C++11 ................................. 388 12.1 12.2 12.3 Grundsätzliche Neuerungen in der Kernsprache ..... 12.1.1 Range-based »for«-Schleife ........................ 12.1.2 Lambda-Funktionen .................................. 12.1.3 RValue (neue Move-Semantik) .................. 12.1.4 Generische Programmierung – Variadic Templates .................................... 12.1.5 »decltype« und die neue Rückgabesyntax ......................................... 12.1.6 »constexpr« ............................................... Standardbibliothek – neue Bibliotheken ................. 12.2.1 Reguläre Ausdrücke ................................... 12.2.2 Zeitbibliothek ............................................ 12.2.3 Smart Pointer ............................................ Multithreading ....................................................... 12.3.1 Einfache Threads erzeugen ........................ 12.3.2 Chaos vermeiden ....................................... 388 388 389 390 391 393 396 397 397 399 403 406 407 409 Lösungen der Übungsaufgaben ..................................... 412 Lösungen zu Kapitel 2 ............................................................. Lösungen zu Kapitel 3 ............................................................. Lösungen zu Kapitel 4 ............................................................. Lösungen zu Kapitel 5 ............................................................. Lösungen zu Kapitel 6 ............................................................. Lösungen zu Kapitel 7 ............................................................. Lösungen zu Kapitel 8 ............................................................. Lösungen zu Kapitel 9 ............................................................. Lösungen zu Kapitel 10 ........................................................... Lösungen zu Kapitel 11 ........................................................... 412 414 417 421 423 427 431 434 437 439 Index ...................................................................................... 441 14 3 Kontrollstrukturen, Funktionen und Präprozessor-Direktiven Nach dem Sie jetzt mit den Basisdatentypen vertraut sind, können Sie tiefer in die C++-Programmierung eintauchen. Besonders wichtig für die Steuerung eines Programms sind die Kontrollstrukturen mit den Verzweigungen und Schleifen. Auch die Funktionen sind unerlässlich für ernsthafte sinnvolle Programme, um Aufgaben in (mehrere) Teilaufgaben zu teilen. Zu guter Letzt behandle ich in diesem Kapitel die Präprozessor-Direktiven und ihre Verwendungen. Die Präprozessor-Direktiven sind die Zeilen im Programm, die mit dem Hash-Zeichen beginnen (beispielsweise #include). 3.1 Kontrollstrukturen Bisher sind die Programme immer nur sequentiell abgelaufen – also immer Zeile für Zeile. In C++ haben Sie folgende drei Möglichkeiten, diesen sequentiellen Programmfluss zu verändern: 왘 Verzweigungen (oder auch Selektionen) 왘 Schleifen (oder auch Iterationen) 왘 Sprunganweisungen 3.1.1 Anweisungen und Anweisungsblöcke Wenn Sie in C++ einen Ausdruck wie beispielsweise cout << "Hallo" oder int i=1 mit einem Semikolon abschließen, spricht man von einer Anweisung. Mehrere solcher Anweisungen lassen sich in einem Anweisungsblock zwischen geschweiften Klammern ({}) zusammenfassen, beispielsweise: { } // Anweisungsblock – Anfang Anweisung1; Anweisung2; ... AnweisungN; // Anweisungsblock – Ende Solche Anweisungsblöcke können Sie zwar auch ineinander verschachteln, aber es empfiehlt sich, nur nach Bedarf davon Gebrauch zu machen, weil 74 3.1 Kontrollstrukturen sonst die Strukturierung, und somit auch Lesbarkeit, des Programms erheblich leidet. 3.1.2 Verzweigungen Mit Verzweigungen beeinflussen Sie den Ablauf des Programms, indem Sie eine Bedingung definieren und damit entscheiden, an welcher Stelle das Programm fortgesetzt werden soll. In C++ gibt es mit if und switch zwei solcher Verzweigungen. »if«-Verzweigung Die Syntax einer einseitigen if-Verzweigung in C++ sieht wie folgt aus: if( ausdruck ) { anweisung1; } anweisung2; Zuerst wird die Bedingung ausdruck ausgewertet. Je nachdem, ob ausdruck wahr (true; ungleich 0) ist, wird die Anweisung anweisung1 im Anweisungsblock ausgeführt. Anschließend wird die Programmausführung mit der Anweisung anweisung2 fortgesetzt. Ist die Bedingung ausdruck allerdings unwahr (false; gleich 0), werden die Anweisungen im Anweisungsblock nicht ausgeführt, und das Programm fährt sofort mit der Anweisung anweisung2 fort. Logischer Ausdruck Die runden Klammern hinter if müssen verwendet werden, weil es sich um einen logischen Ausdruck handelt. Logisch heißt hier ganzzahlig. Der Ausdruck der Bedingung kann einen beliebigen numerischen Wert annehmen, der nach bool konvertierbar sein muss. true (bzw. ungleich 0) wird immer zurückgegeben, wenn der logische Ausdruck wahr ist. false (bzw. gleich 0) wird zurückgegeben, wenn der logische Ausdruck falsch (also unwahr) ist. Abbildung 3.1 stellt diese einseitige if-Anweisung in einem Programmablaufplan schematisch dar. 75 3 Kontrollstrukturen, Funktionen und Präprozessor-Direktiven ausdruck wahr Ja Nein anweisung1 anweisung2 Abbildung 3.1 Der Ablaufplan einer einseitigen »if«-Anweisung Für die Praxis können Sie sich hierzu folgendes Programmbeispiel ansehen: 00 01 02 // listings/003/listing001.cpp #include <iostream> using namespace std; 03 04 05 06 07 08 09 10 11 12 13 int main() { int ival=0; cout << "Bitte eine Ganzzahl eingeben: "; cin >> ival; if( ival ) { // Code, wenn ival wahr ist cout << "Die Zahl ist nicht 0\n"; } cout << "Nach der if-Verzweigung\n"; return 0; } Das Programm bei der Ausführung: Bitte eine Ganzzahl eingeben: 100 Die Zahl ist nicht 0 Nach der if-Verzweigung Bitte eine Ganzzahl eingeben: –10 Die Zahl ist nicht 0 Nach der if-Verzweigung 76 3.1 Kontrollstrukturen Bitte eine Ganzzahl eingeben: 0 Nach der if-Verzweigung In Zeile (05) werden Sie aufgefordert, eine Ganzzahl einzugeben. Diese Eingabe wird über cin in Zeile (06) eingelesen und in der Variablen ival (Zeile (04)) gespeichert. In Zeile (07) wird die Bedingung (oder auch der Ausdruck) daraufhin überprüft, ob der eingegebene Wert von ival wahr (= true) ist. »Wahr« bedeutet hier: Es wurde ein Wert ungleich 0 eingegeben. Hat der Anwender einen Wert größer oder kleiner als 0 eingegeben, wird die Ausgabe über cout mit Zeile (09) ausgeführt. Genauer: Es werden alle Anweisungen im Anweisungsblock zwischen den Zeilen (07) bis (10) ausgeführt. Hat der Anwender hingegen den Wert 0 eingegeben, werden die Anweisungen in dem Anweisungsblock (Zeilen (07) bis (10)) nicht ausgeführt (da unwahr; also: false), und es wird gleich mit der Ausgabe über cout mit Zeile (11) fortgefahren, die natürlich auch ausgeführt wird, wenn die Anweisungen im if-Anweisungsblock zwischen den Zeilen (07) bis (10) ausgeführt wurden. Vergleichsoperatoren Ein Vergleich, der wie im Listing zuvor (listing001.cpp) in Zeile (07) verwendet wird, dürfte Sie vielleicht ein wenig irritieren, und Sie hätten hier genauso gut Folgendes schreiben können: 07 08 09 10 if( ival != 0 ) { // Code, wenn ival wahr ist cout << "Die Zahl ist nicht 0\n"; } Dieser Vergleich in Zeile (07) mit dem !=-Operator (Nicht-gleich-Operator; ein Vergleichsoperator), ob der Ausdruck zwischen den Klammern von if nicht gleich 0 ist, entspricht demselben Ausdruck wie in Listing listing001.cpp. Bevor Sie weitere Verzweigungsmöglichkeiten kennenlernen, möchte ich kurz auf die vorhandenen Vergleichsoperatoren eingehen. Alle in Tabelle 3.1 aufgelisteten Vergleichsoperatoren vergleichen zwei Operanden und liefern einen Wert vom Typ bool zurück. Ist der Vergleich wahr, geben die Operatoren den Wert true zurück, und wenn der Vergleich unwahr ist, wird false zurückgegeben. Folgende Operatoren stehen Ihnen zur Verfügung: 77 3 Kontrollstrukturen, Funktionen und Präprozessor-Direktiven Operator Bedeutung Beispiel Rückgabewert < kleiner a<b true, wenn a kleiner als b, ansonsten false <= kleiner oder gleich a <= b true, wenn a kleiner als oder gleich b, ansonsten false > größer a>b true, wenn a größer als b, ansonsten false >= größer oder gleich a >= b true, wenn a größer als oder gleich b, ansonsten false == gleich a == b true, wenn a gleich ist wie b, ansonsten false != ungleich a != b true, wenn a ungleich b ist, ansonsten false Tabelle 3.1 Übersicht zu den Vergleichsoperatoren Alternative »else«-Verzweigung In der Praxis folgt gewöhnlich nach einer oder mehreren if-Anweisung(en) eine optionale und alternative Verzweigung, die auf jeden Fall ausgeführt wird, wenn keine Bedingung erfüllt wird, also wahr zurückgibt. Realisiert wird dies mit einer alternativen else-Verzweigung, die folgende Syntax besitzt: if( ausdruck ) { anweisung1; } else { anweisung2; } anweisung3; Hierbei wird ebenfalls zuerst die Bedingung ausdruck ausgewertet. Je nachdem, ob ausdruck wahr (true; ungleich 0) ist, wird die Anweisung anweisung1 im Anweisungsblock ausgeführt. Anschließend wird die Programmausführung mit der Anweisung anweisung3 fortgesetzt. Ist die Bedingung ausdruck allerdings unwahr (false; gleich 0), wird die Anweisung anweisung2 im alternativen else-Anweisungsblock ausgeführt, und anschließend fährt das Programm mit der Anweisung anweisung3 fort. 78 Index ! (logisches NICHT) 84 !=-Operator (Vergleich) 78 #define 119 #elif 121 #else 121 #endif 121 #error 123 #if 121 #if defined 121 #ifdef 121 #ifndef 121 #include 118 #line 123 #pragma 123 #undef 120 %-Operator (Modulo) 55 & (Adressoperator) 129 && (logisches UND) 84 &&-Referenz 390 * (Indirektionsoperator) 131 *-Operator (multiplizieren) 55 *this 257 ++-Operator 59 ---Operator 59 +-Operator 55 --Operator (minus) 55 ... 391 /-Operator (dividieren) 55 << überladen 307 <=-Operator (Vergleich) 78 <cfloat> 52 <climits> 52 <limits> 50 <memory> 403 <-Operator (Vergleich) 78 <regex> 397 <thread> 407 ==-Operator (Vergleich) 78 >=-Operator (Vergleich) 78 >> überladen 306 >-Operator (Vergleich) 78 ?:-Operator (Bedingung) 83 {} (Initialisierung) 36 || (logisches ODER) 84 64 Bit 45 A Abgeleitete Klasse 316 implizite Typumwandlung 330 Konstruktor 324 Mehrfachvererbung 332 protected 327 Redefinition 323 virtual (Schlüsselwort) 340 Zugriffsrechte vererben 328 Abgeleitete Klasse 씮 Vererbung abort() 116 Abstrakter Datentyp 210 Ada 15 Adressoperator 129 Algol68 15 ANSI-C++ 17 Anweisung 74 Anweisungsblock 74 Arithmetik Zeiger 134 Arithmetischer Operator 55 Array C-Array 142 vector 138 array 138 Array 씮 Feld Array 씮 Vektor 441 Index atexit() 117 Aufzählungstyp, enum 178 Ausgabe, cout 25 Ausnahmebehandlung 씮 ExceptionHandling Ausnahme-Klasse 377 auto 53 auto_ptr 403 B bad_alloc 165 Basisdatentyp 26, 28, 32 initialisieren 34 Basisdatentyp 씮 Datentyp BCPL 15 Bedingte Kompilierung 121 Bedingungsoperator 83 Bezeichner 29 bool 37 Bool-Typumwandlung 66 break 87 break-Anweisung 98 Breite Zeichen 41 C C mit Klassen 16 C++ 16 Entstehung 15 Geschichte 15 C++11 388 auto 53 char16_t 43 char32_t 43 constexpr 396 decltype 393 delete 250 enum 179 final 201 442 C++11 (Forts.) for 141, 144, 388 Klassenelemente initialisieren 228 Konstruktor delegieren 229 Konstruktoren vererben 331 long long 45 Multithreading 406 noexcept 385 override 201 Raw String 399 register 198 regulärer Ausdruck 397 shared_ptr 403 Smart Pointer 403 static_assert 52 Typenumwandlung beschränken 66 unique_ptr 167, 223, 405 using 182 Variadic Template 391 vereinheitlichte Initialisierung 35 weak_ptr 404 Zeitbibliothek 399 Zufallszahlen 61 Call-by-Reference 153 Call-by-Value 104 C-Array 142, 262 Initialisierungsliste 144 case-Marke 87 catch 372 alternatives 376 C-Cast 70 cerr 27 char 37 char16_t 43 char32_t 43 cin 27 class 211 clog 27 Compiler 18 const 71, 249 Index const (Schlüsselwort) 120, 199 const_cast 68 constexpr 396 Container 361 continue-Anweisung 100 cout 25 C-String 150 C-Zeichenkette 씮 C-String D Datenkapsel 210 Datenstruktur, dynamische 170 Datentyp 32 abstrakter 210 decltype 393 Default-Konstruktor 231 default-Marke 87 define 119 Definition 32 Deklaration 32 Dekrementoperator 59 delete 166, 250 deprecated, register 198 Dereferenzierung 131 Destruktor 236 abgeleitete Klasse 326 double 48 do-while-Anweisung 92 dynamic_cast 70 Dynamische Datenstruktur 170, 173 Dynamisches Objekt 263 Dynamisches Speicherobjekt 163 E Eingabe, cin 27 Elementfunktion 213, 240 friend 286 Inline- 240 Elementfunktion (Forts.) konstante 243 Wertübergabe 256 Elementfunktion 씮 Methode Elementinitialisierer 283 abgeleitete Klasse 325 elif 121 else 121 else if-Verzweigung 80 else-Verzweigung 78 endif 121 Endlosschleife 92 Entwicklungsumgebung 18 enum 178 error 123 Escape-Zeichen 39 Exception auslösen 371 behandeln 371 Fehlerklasse 377 Stack-Abwicklung 376 Standard- 379 System- 384 Exception-Handling 370 exit() 116 explicit 227, 228 explicit (Funktionsattribut) 201 Explizite Typumwandlung 67 extern (Schlüsselwort) 195 F Feld 137 Fließkomma-Arithmetik 57 Fließkommazahl 30, 48 float 48 for C++11 141, 388 for 씮 foreach for-Anweisung 95 443 Index foreach 142 friend 285 Funktion aufrufen 102 Call-by-Reference 153 definieren 101 friend 286 inline 113 Lambda 389 main 115 Parameter 104 Referenz 157 Rückgabewert 107 Scope-Operator 113 Standardparameter 105 überladen 109 Vorwärtsdeklaration 103 Zeiger als Parameter 153 Zeiger als Rückgabe 155 Funktions-Template 344 ifndef 121 if-Verzweigung 75 Implizite Typumwandlung 63 abgeleitete Klasse 330 Indirektionsoperator 131 Initialisierung C++11 35 Inkrementoperator 59 inline 113, 241 inline (Funktionsattribut) 201 Instanz 218 int 37, 45 Integer 45 Integral-Gleitkomma-Typumwandlung 65 Integral-Promotion 63 Integral-Typumwandlung 64 Iterator 365 G Klasse 210 abgeleitete 씮 Abgeleitete Klasse Call-by-Reference 253 Call-by-Value 251 Elementfunktion 213 friend 287 Hilfsfunktion 250 indirekter Zugriff 221 Mehrfachvererbung 332 Punktoperator 219 Referenz 255 Vererbung 316 virtual (Schlüsselwort) 340 virtuelle Vererbung 336 Zugriff 217 Zugriffskontrolle 215 Klassendefinition 211 Klassenelement dynamisches 265 Ganzzahl 30 Ganzzahltypen 36 getline() 148 Gleitkomma-Promotion 64 Gleitkomma-Typumwandlung 65 Gültigkeitsbereich 111 Namensraum 189 H Hilfsfunktion 250 I if 121 if defined 121 ifdef 121 444 K Index Klassenelement (Forts.) konstantes 276 statisches 273 Klassen-Template 352 Kommentar 31 Kompilierung, bedingte 121 Konstante 71 Konstruktor 223 abgeleitete Klasse 324 delegieren 229 Konvertierungs- 310 Kopier- 232 Standard- 231 vererben 331 Kontrollstrukturen 74 Konvertierungsfunktion 311 Konvertierungskonstruktor 227, 310 Konvertierungsoperator 309 Kopierkonstruktor 232, 271 Zuweisungsoperator überladen 303 L Lambda-Funktion 389 limits 50 line 123 Linker 18 Literal 29 Logische Operatoren 84 long 37, 45 long double 49 long long 37, 45 M main-Funktion 23 Mehrfachvererbung 332 Memory Leak 164 Methode 213 Elementfunktion 240 Modularisierung 186 Move-Semantik 390 Multithreading 406 N Namensraum 186 deklarieren 186 Gültigkeitsbereich 189 importieren 192 std 25 namespace std 193 Namespace 씮 Namensraum new 164 noexcecpt 385 nullptr 133 Null-Zeiger 132 numeric_limits 50 O Objekt 218 dynamisches 263 konstantes 249 Rückgabewert 260 Operator arithmetischer 55 logischer 84 überladen 290 überladen als Elementfunktion 294 überladen als globale Funktion 297 operator (Schlüsselwort) 291 P Parameter-Pack 391 Pointer 씮 Zeiger pragma 123 Präprozessor-Direktive 117 445 Index private 215, 327 Programmende 116 protected 327 ptrdiff_t 135 public 215, 327 Vererbung 320 R Range-based for 388 Range-for 141 RAW-String-Literal 399 Rechnen 54 Redefinition 323 Referenz 135 Funktionsparameter 157 Klasse 255 Rückgabe aus Funktion 158 Struktur 172 register 198 Regulärer Ausdruck 397 reinterpret_cast 69 return 108 RValue 390 S Schablone 씮 Template Schleife 90 Semikolon 24 shared_ptr 403 short 37, 45 signed 47 Simula 15 size_t 141 sizeof 52 Zeiger 134 Smart Pointer 403 Speicherklassenattribut 195 Speicherloch 164 446 Speicherobjekt, dynamisches 163 Sprunganweisung, kontrollierte 98 Stack-Abwicklung, Exception 376 Standard-Exceptions 379 Standardkonstruktor 231 static 196, 273 static_assert 52 static_cast 68 std 25, 193 std:: 194 Steuerzeichen 39 STL Algorithmus 365 Elementfunktion 364 Iterator 365 Stream 24 Ausgabe- 25 Eingabe- 27 String 146 Raw 399 string (Klasse) 146 String-Ende-Zeichen 150 Stroustrup, Bjarne 15 struct 168 Struktur 168 deklarieren 169 dynamische 173 Referenz 172 typedef 182 Zugriff 170 Strukturzeiger 171 switch-Fallunterscheidung 87 Symbol 29 System-Exception 384 T Template 344 Funktions- 344 Klassen- 352 Index Template (Forts.) Variadic 391 terminate() 116, 375 this-Zeiger 245 thread 407 throw 371 try 372 tuple 393 typedef 181 Struktur 182 Typenqualifikator 199 Typinferenz 54 Typumwandlung 62 explizite 67 implizite 63 Vergleichsoperator 77 Verzweigung 75 virtual (Funktionsattribut) 201 virtual (Schlüsselwort) 340 void 46 volatile 200 Vorzeichenbehaftet 47 Vorzeichenlos 47 W wchar_t 41 weak_ptr 404 what() 380 while-Anweisung 90 U Z Überladen Operator 290 Zuweisungsoperator 303 Unicode 42 unique_ptr 167, 223, 405 unsigned 47 using 192 using-Synome 182 UTF-8 44 Zeichen 31 breites 41 Zeichenkette 31 Zeichenkette 씮 String Zeiger 127 *this 257 Arithmetik 134 deklarieren 128 Dereferenzierung 131 Funktionsparameter 153 Klassenelement 265 Null- 132 Rückgabe aus Funktion 155 sizeof 134 Speichergröße 134 Struktur 171 this 245 Zeilenende 40 Zeitbibliothek 399 Zufallszahlen 61 Zuweisungsoperator, überladen 303 V Variable 33 Gültigkeitsbereich 111 Variadic Template 391 vector 138 vector (Klasse) 262 Vektor 137 Vererbung 316 public 320 Redefinition 323 virtuelle 336 447