Leseprobe
Transcription
Leseprobe
Aber Sie haben es ja so gewollt. Ihre Wahl ist nun einmal auf diese pingelige Sprache gefallen. Und wir kön- nen mal wieder die Kohlen aus dem Feuer holen. Warum? Na, wie wir Sie kennen, lernen. Sie möchten mehr. Sie möchten an der Sache: den ultimativen Unsere Antwort Südbalkon wollen Sie ja nicht nur C++ Freude am Lernen haben und Spaß eben. darauf lautet: Nein, da machen wir nicht mit. zu viel. Ein astreines C++-Fachbuch könnten Sie verlangen einfach wir bieten. Aber den Spaß an der Sache, den müssen Sie schon selbst mitbringen. Irgendwann ist Schluss. O.K., O.K. Sie sehen ja, wir haben es doch gemacht. Das andere Fachbuch. M'-; 7fl~EtJT Mit seriösem ANSI-C++ plus Spaß: Wir zeigen Ihnen die Wege mit der besten Aussicht. Wir bringen J (:.fH2FtJ - Beispiele, die Sie nicht vergessen. 1'H6Q(C uvt: l.';i~IGtfl--t Wir gießen dicke Farbeimer über Code. Wir machen uns zum Affen. Und das tun wir nur, B'tSTflc:H SC.-tt7<o'Dl~6'['[2.7)1~ 'T2.+I€(f\JW~ ft.,--:J u'T2. '< Sc.#UHw~ft., weil Sie unterhalten werden wollen. Endlich zufrieden? I -=t=ü'l< l+lrJ GB:t'T J~-r21 €(f\J 'T'RA \)(4 (~ ~'Rfü(..L(.,IJG f1OWte.t-.f WtOt(, . Ir Bitte sehr. Na, dann viel Spaß, lieber Der Verlag Leser! l-V'/~Ir ~ Ic~, ~;/re. A'ottte.rt-.A' 5c~r;/tf;~de.r, ~be.rt-.e.~Wte. I~~ .c: A'oc~ tf;~"Att/jOt6e. (~o6e.1 ~ ,A'ots ~/f Affe-t-. ~CJt-.t-.fI ~r Ettc~ j(e.lc~ l-V'1e.t4r Ot6sc~ Wtl~I(e.t-.) ~ lJo,"re. Ottt{5e.rt4Wt I((Otsse., l-V'e.t-.t-.I ~~ A'Ott-.t-.WtOt( Ott-.for~e.t-.I(;~t-. fe. ...~ Schridlng.r. BUr. Die nötige Theorie, viele Hinweise und Tipps Schridlng.rs W.rkstatt Unmengenvon Code, der ergänzt, und repariert werden will verbessert Mit viel Kaffee, Übungen und den verdienten Pausen Schridlnger. Wohnzl•• er 1 11_1 ., ,'1 I "' , ~'\' . ". • • \ . '-,... Um jetzt aus deinem Quellcode Brauche Ich eine IDE zum Programmieren? zu machen, brauchst Quelltext (eine ausführbare um daraus ein Programm zu machen. Natürlich kannst du hierbei auch ein Alles-drin-Komplettpaket umgebung verwenden. Okay, bevor du überhaupt du natürlich ein Werkzeug, Maschinencode anfangen kannst, deine Programme um einen lesbaren zu übersetzen. code übersetzt portierbar. ist dein Quellcode Wenn du den lesbaren brauchst in einen nicht mehr lesbaren Für solche Zwecke benötigst Solange du den C++-Standard verwendest, Betriebssysteme Quellcode zu schreiben, Quellcode du in C++ einen Compiler. auf die gängigsten Damit sollte dir klar sein, dass der übersetzte weder auf deinem Windows-Rechner läuft und nicht mehr portabel Entwicklungsumgebungen mit einer Entwicklungs- haben den Vorteil, dass eben alles gleich an Bord ist. Hier findest du den Editor, Compiler, Linker und noch viele weitere Dinge wie Debugger, Projektverwaltung, Profiler und noch einiges mehr vor. Der einzige Nachteil von solchen Alles-drin-Komplettsachen ein wenig mehr Einarbeitungszeit ist halt, dass hierfür nötig wird. aber in einen Maschinen- hast, dann kannst du diesen nur noch auf dem entsprechenden system ausführen. Datei) und dann eben einen Compiler (mit Linker) zum Übersetzen eintippst, des Quelltextes, ein echtes Programm du im Grunde nur einen ASCII-Texteditor, in den du deinen Maschinencode Betriebs- [Ablage] Wie dem auch sei, ich bin hier nicht dafür da, für bestimmte ent- oder auf dem Linux-System oder auf dem Mac werben, sondern schaffen. ist wie der Quellcode. zu ich will dir lediglich einen kleinen Überblick zu diesem Markt ver- Letztendlich ein ausführbares Compilerhersteller sind alle nur ein Mittel zum Zweck mit demselben Ziel, nämlich Programm zu erzeugen. [Hintergrundinfo] Genau genommen wird der Quellcode oder *.0) übersetzt. Diese Objektdatei(en) Linker zu einer ausführbaren Compiler auch gleichzeitig solltest trotzdem von einem Compiler in eine Objektdatei wiederum Datei gebunden. wird/werden (*.obj dann von einem Aber häufig ist bei der Rede von einem der Linker als komplette Einheit mit gemeint. wissen, dass es sich hierbei um zwei verschiedene Multikulturelle Sachen Aber du Dinge handelt. Es gibt komplette Entwicklungsumgebungen, sind und unter Windows, und umfangreiche umgebungen Linux (und Unix-like) sowie Mac OS laufen. Zwei ganz große Projekte sind die IDEs Eclipse und NetBeans. Beide Entwicklungs- wurden eine hervorragende die für alle gängigen Systeme erhältlich in und für Java geschrieben. Unterstützung anderer Aber trotzdem Programmiersprachen bieten diese auch an, wie u. a. natürlich auch für C++. Hallo.Schroedlnqer - Netäeans .' IDE 8.0.2 0." Se.arch 0' Projects .•.!tj y File. •••• ClöloeJo Hallo5c.hroe.dinge.r ••. ~ ••. ~ ~ •. ~ >;! ';?J Header Fües ResourceFlIes #include Soure!'. Files using ~ main.cc lmportant Files 0 {X+I} 4 5 [1 int 6 0 D aliiJ return 0; . _ . für C++ ,EIl • ef.cs t r eaecnamespace std; •• in() { cout « "Ich Die Entwicklungsumgebung NetBeans bin Schröd mqer-" « endl; 7 B main(J-NavlgarorO @ ma[nO EI D> Vereinfachte Darstellung, wie man aus einer Quelldatei eine ausführbare Datei macht 26 Kapitel EINS HalioSchroedinger (Build, Run) 0 b m Schr öd i.nqer- Cf> Ich 'LI RUN FINISHED; ex i t va tue 0; real time: 20ms; user: 0ms; system: 0ms alJ INS Entwicklungsumgebungen für C++ 27 rf'lll "" ,..., C/C++ - Hallo/src/Hallo.cpp ~ J['l. 1.21[ij JlS':l'jjj.~. ~. =EI ItJProjectE:o:plorer~, 8~1 . .•.gHallo ~~8Inarie~ "'@llncludes "''''src - Eclipse -/Use.rs/jurgenwoIUpocuments/workspace J~' (9. J~' O·q.· J~L8 @~. JI:1. IiIIl!l Ji?l·\il.~ • ~tNjlo.'PP~~ Auch Eclipse bietet eine tolle C++-Unterstützung an. ®Ml~Tlnl =E] ~~~~~"_~~~2s_.~~~v_1 Itla@~ =E] Microsoft Visual C++ im Einsatz D(I meingrojekt DATEI : 110110. cpp 11 Version 11 Copyright 11 /1 üe s.r r t p t r cn : : Your : Hello visvalStudic ANSICHT I fB ... (Administrlltor) PROJEKT 1iI.III ,?... [I' ~~IIII~-N~"m~,~~------------------------------__" •.• I I Aulhor . Microsoft BEARBEITEN ...,. ERSTELLEN Lokeler Windows-Debuqqer .•. l- copyright: World In 11 lcstream =- std • noe i ce C++, An~.l-st)'h mainO .1nt _ cout « "Hein r-etur-n 0; #i.nclude <10strellll\)o usin_g tlomespace std; Name ist schrödänger-" « endkj int moinO { cout« retuen "HRU~ Bi ll~kt!"« endl; 11 p r t nt s llll1ello Worldlll Projektmappen-Explc ~ ',".'.m, 1.elI -crerrmnatedo Hallo Welt! T,,"I ~ Consote 1:J':,D=:',-"op:.::"",,;<~, I-:::-_-:-:----:-_::c-:;:,:X;:-Ifc"'-'-: IEl"".,;;,~,,;:j,:, 1,dF'-::,:"I=:, '~:,:-,:,II~~~_'-"d'--·_~----1L1 Hallo {C{C++ A.ppli(ationI/Ulier:i{jurgenwolf/Documenls/werkipace/Hilllo/Debus/Halle ... Team Explorer Klassenansicht Eiqenscheften (26.01.1l 10:47; nebug Win32 ----- - .•. main :~: VCCodeFun(tion ~oI. I Fullfvame meln File I wntable I Smart Insert 116: 1 Ebenfalls für fast alle Systeme vorhanden IDE enthalten natürlich ist), womit sich neben tollen Anwendungen auch einfache C++-Programme Oberfläche ist das Qt SDK (worin die IDE Qt Creator stellt Code::Blocks Linux und Mac OS erhältlich mit grafischer Auch sehr beliebt ist der Kommandozeilen-Compiler Oberfläche Portierung erstellen lassen. Auch eine sehr interessante zur Verfügung, die mittlerweile des GCC-Compilers aufWindows andere Entwicklungsumgebungen auch aufWindows, sehr beliebt. ist. der allerdings verwendet. MinGW-Compiler, ist. Darauf aufbauend der eine werden Früher war auch Borlands jetzt nur noch C++Builder viele C++Builder heißt. weil er nicht mehr Borland gehört. [Ablage] Alle hier erwähnten Sachen sind umsonst multikulturellen Die X-Sachen erhältlich und kosten dich keinen Cent!!! Auf Linux oder anderen un(ix)artigen Systemen kommt im Grunde fast immer das GCC-Paket als Compiler zum Einsatz. Darauf greifen natürlich wicklungsumgebungen gibt aber mittlerweile Mlkro.elche Sachen Dominierend auf den Windows-Rechnern eigenen Produkte sein. Microsoft marke Visual C++ Studio mehrere IDEs zu. Beliebte Entund Anjuta. auch viele kleinere interessante Es IDEs. [H intergrundinfo] GCC, gcc und g++! Alles dasselbe? dürften wohl die haus- bietet hierbei unter der Hauskommerzielle die meisten sind hier z. B. KDevelop Versionen Nein, nicht ganz. GCC ist die GNU Compiler Collection (also eine Sammlung von gcc (kleingeschrieben) ist der C-Compiler der rr.~"'--iiii;;,;;;~ ..•.Compilern). Sammlung, und g++ ist (ja, richtig) der C++-Compiler von GCC! an. Aber es gibt mit Visual C++ Express auch eine kostenlose Version aus dem Hause dieser Entwicklungsumgebung, den normalen völlig ausreichen 28 Kapitel EINS welche dir für Einstieg oder Umstieg in die C++-Welt vorerst dürfte. Entwicklungsumgebungen für C++ 29 o- - metn ce (-fhallowelt/srcl- W' .•. _ ~Projekt 8J ••. Rückgangig main.ce X 1 /= _e-, _-OM.,--o-c-de-: @ /» • main. cc • Copyright 2 3 4 S ' 6 7 8 9 10 11 12 13 14 '/ '"' \ ) Schroedinger 2912 <schroedjnqer@scf7roedjnqer-Parallels-1 Ja, es gibt wirklich eine gewaltige Menge an (kostenlosen) umgebungen, int { (out« return du hierbei verwendest, und zum anderen vom persönlichen main () "Hallo Bi Welt!" <c jandt: vorbereitet } Geschmack bzw. Entwicklungs- Compiler oder welche hängt natürlich zum einen vom System ab. Da du ja gleich für alle drei Systeme bist, hast du noch mehr Auswahl zur Verfügung. J _ [Notiz] _ 1-- ~ Compilern und du hast die Qual der Wahl dabei. Welchen Entwicklungsumgebung 16 _ " (C) :----O-4;-tc-a.,--b_-w1C"C'd70th-: -04c-_""""'_ #include <iost ream> using namespace std; is ~~;;"".."...;;""C""",:"",;",""""'i' --=c-; ""7in---:dC-en""7t-O_t-OabC-s-_m-odC-e-: ""7t-; -c_""7b-as-c-ic-_---:of'"'"f-sec-t Lall unI endlich lallegen ... Anjuta ist eine sehr angenehme Entwicklungsumgebung (hier unter Ubuntu linux). hattowett - AnJuta Speichern Du musst nicht zwangsläufig _ - •... I "" I- t, " •... -, ~ , tl.... Schrödinger -, "t " wie lauter neue Rechner anschaf- I fen, um deinen Code oder deine Beispiele Ter mlnal .• !_ Angebl•• ene Äpfel Auch beim Apfel setzt man nach wie vor auf GCc. Aber hier sind erste Anzeichen zu erkennen. Apple hat schon einige Euros für Clang lockergemacht. C++, Objective-C und -C++. So darf man davon ausgehen, [o 0 für C, Entwicklungsumgebung eventuell t,,/~,Zf j(~/~ZSJ~t, ~Ot,t,~t, / häufig auch eine Virtualisierung 0 I > Q M... running cpp-betspre! B!5 I.... .,. I ~ (ä) ~p:rg='i~~i;lsm: IO.HJ > ~ cpp-betscret ) ~ > mafn.cpp D '" l::lcpp-beispiel habe ich gute Erfahrungen ! ß!:,~~~ D _I. {I Linux wiederum als Gast zu haben. Schrödtnqer" c WinPersönlich mit Parallels Auf Windows verwende VMWare, um ein anderes oder ich gerne Betriebssystem Ein Kollege von mir total auf das kostenlose (OpenSource), mainO erhältlich int main() { cout c "Mein Name ist r e turn 0; •• UProduCIS über eine Virtualisierungssoftware (unter Ubuntu Linux) schwört wiederum : cpp-betspre! cpp-belsptel aus. So kannst du bspw. auf dem Mac-Rechner Desktop gemacht. en-e. #include <Lcs t rearcusing namespace std; M Hierzu reicht /~Z ~ main.cpp Finished Betriebssystemen dows oder Linux "installieren". M~i_ ~e_U auf dem Mac OS dürfte Produkt Xcode sein. auf anderen oder Compilern zu testen. !)or.t,t, Zg,:tf~ j~sf'or.r{ I •.. ~ • T Clang ist ein Compiler-Frontend dass Clang über kurz oder lang den GCC auf dem Mac ersetzen wird. Die wohl am meisten eingesetzte ganz klar das hauseigene eines Umbruchs H Q,:tf~sfc!i1 c!or.S .Virtualßox SE" was auch für Windows ist. end'l.; Überletzen mit einer Entwlcklunglumgebung @] _ UU -Qo ,;l;, ! Hier möchte ich dir nun eine kleine Anleitung No setecnon fllII'in Nltllll! ist Pro9ram ended ) Auto: I @ CD (e ) AliOutput: Schrödinger with ex.rt code: du aus einem einfachen 0 1i!iI1[][] Besonders beliebt auf dem Mac ist Xcode. wird davon ausgegangen, bereits heruntergeladen ist natürlich 30 Kapitel EINS Quelltext mit einer Entwicklungsumgebung schreiben, ein ausführbares wie Programm erstellen kannst. Im Beispiel dass du die Entwicklungsumgebung und installiert sehr vereinfacht, hast. Die Anleitung und hier gilt, dass du dich schon Entwicklungsumgebungen für C++ 31 selbst ein wenig mit deiner Entwicklungsumgebung befassen musst. In der Abbildung wurde zwar Microsoft Visual Studio Community dafür verwendet, aber der Vorgang ist bei den meisten anderen Entwicklungsumgebungen auch sehr ähnlich aufgebaut. Nur dass hier und da der Befehl etwas anders lautet und sich woanders befindet. 1. Am einfachsten dürfte es zunächst immer sein, wenn du ein neues Projekt startest. Hier eben über Datei * Neu * Projekt. TEAM Neu Projekt ... Strq- UmschaltUmschatt-Alt-N '[:: Teamprojekt 'D Datei", Projekt Schließen Projektmappe FENSTER We:bsite:". HinzufCigen El ANALYSIEREN -:e hinzufCigen Quellcodeverwaltung TEST ,. fß Öffnen Zur EXTRAS 3. Abhängig von der Entwicklungsumgebung findest dujetzt häufig schon einen vordefinierten leeren Quellcode mit seinem Grundgerüst vor. Bei anderen Entwicklungsumgebungen musst du erst noch ein neues Element/eine neue Datei hinzufügen. Neue Elemente wirst du so oder so irgendwann hinzufügen müssen, wenn du deinen Quellcode in mehrere Quell- oder Headerdateien aufteilst. Achte darauf, dass du den Quellcode auch zum Projekt hinzufügst und nicht nur einfach eine neue Datei anlegst! Neue Elemente/ Dateien zum Projekt hinzufügen. Erster Schritt dürfte immer sein, ein neues Projekt zu starten. HILFE N Jörqen Wolf 111 • • ~x p. ... Strg+N aus. vorhandenem Code ... schließen Strq+S Ausqewähtte .JII Elemente speichern unter ... Alles speichern Vorlage Strg+ Umschatt- exportieren Klassen-Assistent ... Suche auf begrenzen Strq-Umschatt-X Quellcodeverwattung Neue Projektmappen- Seite einrichten Ausschneiden Strg+X Kopieren Strq+C Einfügen Strg+V Löschen Entf ... Strq-P Drucken .. , Kontoeinstellunqen Zuletzt El 5 .. , geöffnete ... Projekte und Projektmappen ht Umbenennen Alt+F4 Beenden Explorer-Ansir Fiqenschaften 2. ~. Als Nächstes erscheint meistens ein Dialog, der dir dabei hilft, zu entscheiden, was für eine Art von Projekt du erstellen willst, wie du dein Projekt nennen und wo du es abspeichern willst. Hier ist es oft gut, ein leeres Projekt oder eine C++-Konsolenanwendung zu erstellen. 4. Auch hier hilft dir häufig ein weiterer Dialog bei der Wahl, was für eine Art von Datei du zum Projekt hinzufügen willst. Hier ist es eine Quelldatei mit der Endung cpp. Aber bei späteren Projekten wirst du auch des Öfteren mal eine Headerdatei mit der Endung h hinzufügen. *. Element Neues " Aktueü .01 c:1.N-"'"-T-,,F,:::,m:.::~=o'C:_'::"'-------'.J·1 Sortieren nacfu iii Installiert Win32-Konsolenanwendung "I S"t':.::'d"":::'d p YisualBasic f' visual (# ATL CLR Allg~m~in MFC TBt ;r L ~hen Inst p~ hinzufügen *. - meinProjekt .•• Installiert [If .•• Visual C++ visval C++ Typ: visual C++ Ein leeres Projekt zum Erstellen einer lokalen Anwendung ..• Vorlagen ..• visval C++ ---'.J.1 Alt-Finqabe UI ~ ~ ~ MFC-Anwendung visval C++ Win32-Proj~kt ViSUi'l1C++ Daten Leeres Projekt visua! CH Web 53 Makefile-Prcjekt Yisual C++ C++-Dat~1 ((Pp) Visusl C++ Typ: visual C++ Erstellt eine Datei mit C+ + -Quellcode. lEY Code HLSL Heaoerdatei (.h) Vis.ual C++ Ressource Hilfsprogramm Hqenschattenblätter Test " Online Grafiken Klicken Sie hier um online nach Vorlagen zu suchen. I> Online rneinprojekt Ort: Gewöhnlich hilft dir jetzt ein Wizard weiter, die Art deines Projektes auszuwählen. 32 Kapitel EINS lö~ung: ProJ~ktmi'lpp~nni'lm~: \ \psf\hom~\docum~nts\visui'll 1 I Durchsuch~n studio 2013\Proj~cts c:m"',"',,'-'p,"'-0Jo:'ktI"--- ... ) KliCKen Sie hier um online ·1 N~u~ ProJ~ktmi'lpp~ ~rst~ll~n _j ~ Prcjektmeppenveneichnis D Zur Quellcodeverwaltung ~(Abbre(henl erstellehinzufugen Meistens gibt es auch einen Wizard, der dir hilft, eine passende Datei hinzuzufügen. Name: main.cpp 0", \\psf\home\documents.\vis.ual studio nach Vorlagen zu suchen. 201.3\Projeds.\meinProjekt\me.... I Durchsuchen .. ) I Entwicklungsumgebungen Hinzufügen I! Abbrechen für I C++ 33 5. Hast du deine Datei(en) hinzugefügt, tippen. Nach dem Abspeichern lieren) und anschließend Erstellen kannst du anfangen, deinen Quelltext kannst du dann den Quellcode ausführen. übersetzen g++ undclang++ einzu(kompi- Die Verwendung Beim VC++ kannst du den Quelltext über * Projektmappe erstellen und Erstellen * Kompilieren * Starten ohne Debugging ausführen. übersetzen clang++ erscheint und hat natürlich dann mit Debuggen meinProjekt-MicrosoftViSU<lIStudio(Administrator) DATEI BEARBEITEN ANSICHT PROJEKT 1 \Cl • - 1iI.... T7 ERSTELLEN ~ DEBUGGEN TEAM EXTRAS TEST 0 L.;..;;;=;;;;':;;;;';";~_""";"" ANALYSIEREN FENSTER ·1 Lokeler windows-Debuqqer HILFE Jurgen Wolf 1111 p Projektmappen Cl Explorer x ~ +~ •• .•. 11 ~ I}- X wie g++ oder dir vielleicht zunächst etwas altbacken, aber den Vorteil, dass du dich nicht mit einem Monster von Programm D(I von Kommandozeilen-Compilern mit unzähligen Funktionen herumschlagen musst. Im Grunde musst du lediglich deinen Quelltext mit einem beliebigen ASCII-Editor schreiben, dann mit einem Kommando abspeichern übersetzen. und diesen Gerade für "kleinere Projekte" oder Listings im Buch reicht dies völlig aus. Zudem kommt hinzu, dass bei den meisten Linux- und Unix-Systemen cout <c "uurr-a, syste:m("PAUSE") me:in ~ .tEl er-stes Pr-ogr-area!" <c endl ; T ; Ixteme Abhänqiqkeiten Headerdateien .•• ~QueJldate:ie:n ~ ++ main.cpp diii Ressourcendateien der GCC (und somit g++) von Haus aus bereits installiert gegebenenfalls ganz schnell nachinstalliert werden ist oder kann. Meine ersten Gehversuche ... • Aus.g<lbeanzeigenvon: Erstellen • I I§ ~ X ~~ - - - - - - Erstellen aes'tar-tet : Proj ek't : meinProj ekt , Konfiguration: Debug Win32 - - - - - ..••. meinProjekt . vcxpr-o'[ -) \ \psf\home\documents\visual studio 2013\Proj ect sveemprcf ekt' •••••••••••••••••••• Erstellen: 1 erfolgreich, 0 Feh'l er-ha+t , 0 ak t-ue'l L, e übersprungen ••••••••••••••••• Jetzt nur den Quelltext eintippen, übersetzen und dann das Programm starten. I [Notiz] Natürlich gehe ich auch davon aus, dass du weißt, was eine Kommandozeile ist Schroedinger $ g++ -0 maen maln.Cpp Schroedinger $ ./main Juchu, es läuft ... ! Schroedinger $ g++ -Wall -pedantic Schroedinger $ ./main Juchu, es läuft ... ! Schroedinger $ -0 maen main.cpp und wie du dich mit unterschiedlichen [Fehler] Kommandos Wenn du beim Einstieg hier verzweifelst und wirklich nicht klarkommst, kannst grammierer du ja eine E-Mail an Schrödinger führung haben, wie du deinen hangelst. senden, der da ziemlich gut durchblickt: bedienen dort durch die Verzeichnisse Schließlich willst du ja Prolernen und hier keine EinRechner kannst. sch roed inger@d ieter- baer.de Wenn du deinen Quelltext und gespeichert noch in das Verzeichnis -: ~'tC'." .... dem du den Quelltext 34 Kapitel EINS du nur zu wechseln, gespeichert den Compiler anzuwerfen Code übersetzen geschrieben hast, brauchst in hast, und deinen zu lassen. Entwicklungsumgebungen für C++ 35 Hier habe ich beim ersten Übersetzungsvorgang Quelldatei main.cpp die ausführbare namen für main verwenden. die mir mehr Informationen Datei Beim zweiten Übersetzungsvorgang über diverse Warnungen -Wall gibt z. B. sinnvolle Warnungen ANSI-C++-Standard gefordert daraus machen, brauchst den Schalter -0 verwendet, werden. so dass der Compiler aus der ... am Endl läuft I. main macht. Du kannst natürlich auch einen anderen Programmhabe ich ein paar Schalter mehr verwendet, zurückgeben, vom Compiler aus und -pedantic Willst du deinen Quellcode du nur den Schalter die sonst nicht angezeigt würden. gibt Warnungen "nur" kompilieren, So, an der Auswahl von Compilern aus, die vom also eine Objektdatei bzw. Entwicklungsumgebungen mangelt es ja nun wirklich nicht. Daher will ich dir hier noch ein paar Compiler bzw. Entwicklungs- -c zu verwenden. umgebungen auflisten, damit du einen Überblick hast. Du kannst diese gerne testen und selber sehen, was dir persönlich am meisten zusagt. Com Her GCC ja http://gcc.gnu.org/ Win, Linux, Mac, nein Unix-like Clang Microsoft ja nein/ja Visual Studio http://clang./Ivm.org/ Unix-like, Mac httpi//www.visuslstudio.com/ Windows ja Windows ja Windows ja nein de-de/downloeds/downloedvisuel-studio-vs.espx =i= Microsoft Visual Studio ja Community httpi//www.visuslstudio.com/ de-de/downloeds/downloedvisuel-studio-vs.espx Microsoft Visual Studio ja Express httpi//www.visuslstudio.com/ de-de/downloeds/downloedvisuel-studio-vs.espx NetBeans ja hitp.r/netbeens.org/ plattformunabhängig ja Eclipse ja hitp.r/www.eclipse.org/ plattformunabhängig ja Qt Creator IOE ja http://www.qt.io/download/ Win, Linux, Mac ja Code::Blocks ja http://www. Win, Linux, Mac ja Win, Mac ja C++Builder XE2 nein codeblocks. org/ http://www.embarcadero.com/ products/cbuilder I(Oevelop ja http://kdevelop.org/ Linux/Unix-like, Mac, ja Win Anjuta ja Xcode nein http://www.anjuta.org/ Linux, BSO ja http://developer.apple.com/ Mac OS X ja iechnologies/tools/ ~ ~ Es gibt natürlich eine gewaltige Anzahl weiterer Schalter, kannst. Aber auch hierzu empfehle Vergiss nicht, dass du hier ein C++-Buch vor dir hast, kein Buch über die Verwendung EINS Orwell Oev-C++ ja http://www.mingw.org/ Windows nein httpi//sourceforge.nei/ Windows ja projects/orwelldevcpp/ ich dir, dich bei Bedarf selber ein wenig einzulesen. Kapitel ja [No';'1 die du hierbei verwenden 36 MinGW von speziellen ~ Intel-Ce+ nein httpi//softwsre .intel. com/ Linux, Win, Mac nein en-us/sriicles/intel-compilers/ Übersicht der Compiler bzw. Entwicklungsumgebungen für C++ Compilern! Entwicklungsumgebungen für C++ 37 Zu den hier erwähnten Compilern muss ich natürlich noch anmerken, wicklungsumgebungen die auf dem Betriebssystem und selten eigene Compiler mitliefern. vorhandenen dass viele Ent- Compiler verwenden Im Grunde sind ja die Entwicklungsumgebungen nichts anderes als eine grafische Steuerung für deinen Compiler und andere Werkzeuge. So verwenden bspw. unter Windows bekannte Entwicklungsumgebungen wie NetBeans, Eclipse, Qt Creator, Code::Blocks, Dev-Cs-s oder das MinGW Developer Studio alle MinGW. Wobei MinGW wieder auch nur eine Portierung Bei einigen dieser Entwicklungsumgebungen Compiler ändern. von Microsoft Ähnlich ist es natürlich kannst du aber auch den verwendeten wenn du bspw. MS Visual C++ Express installiert auch bei Linux-Systemen KDevelop oder Anjuta, welche letztendlich das Frontend GCC ist. So kannst du bspw. bei Code::Blocks auch auf den MSVC++-Compiler zurückgreifen, Xcode wiederum der GNU-Werkzeuge und Entwicklungsumgebungen auch wiederum hast. wie nur auf GCC zurückgreifen. greift auf das Backend des LLVM-Compilers zurück. Wobei Clang davon ist. Somit sind die einzigen echten Compiler, die oben aufgelistet sind, der GCC (MinGW), Clang, der MSVC von VC++ und Intel C++ Compiler. [Notiz] Unter Linux-Systemen umgebungen lassen sich einzelne häufig ganz komfortabel der entsprechenden Distribution Entwicklungs- mit der Paketverwaltung nachinstallieren. Bist du auch ein Fan von Ubuntu, dann kannst du ja mal ein "sudo apt-get dozeile absetzen installiert wird. o o "• o 38 Kapitel EINS install anjuta s+r" in der Komman- und zusehen wie alles heruntergeladen und Was Ist eigentlich ein Computerprogramm? Banz kurz und knapp fUr alle Sehrtidlngers Die Sache mit dem maln-Dlngs [Begriffsdefi Ein Computerprogramm liegt gewöhnlich als ausführbare Programmdatei, als sogenannter Maschinencode , auf einem Datenträger vor. Startest du ein solches Programm, wird es zunächst in den Arbeitsspeicher des Rechners geladen. Anschließend übernimmt der Prozessor deines Rechenknechtes die Kontrolle und verarbeitet der Reihe nach die für ihn lesbare Abfolge von Befehlen - das Programm bei der Ausführung eben. lei,_ i,_ctbe._ItbI2.J-,12J~ ct//is;;;''zrb «res CO""'f//i lu- frOj~ct""'''''' ;/1 cfe_"", .,' E:tfor ""'12J"e..: E,,~/e~(//i"js//i""'jeb//i"1 je_;ff-,d. . l)ct t-,/u,A'&, ,,//ir /(o""'lsei,_e._ ZI2.l~i,_12.J-, ct"ju_l2Jjfl Vusle._i,_e._ I~i,_ "/~i,_fI Nein, das geht auch nicht mehr mit einem normalen Editor. Bei einem Maschinencode handelt es sich um für den normalbegabten Menschen nicht mehr lesbaren Binärcode, der sich nur noch mit ganz speziellen Maschinensprachmonitoren lesen lässt. lei,_ c4ei,_Ie._, I~ usldfe._ ••• nitionl Irgendwo hat ja alles einen Anfang, also auch ein C++Programm. Die Mutter alle C++-Anfänge ist hierbei main(). Dabei handelt es sich um die Hauptfunktion (main (engl.) = Haupt-), ohne die der Linker niemals ein ausführbares Programm erstellen könnte. Da die main () -Funktion also die erste Anlaufsteile deines C++-Programms ist, befinden sich darin auch die ersten Befehle des Programms, welche bei der Arbeit ausgeführt werden sollen. Hier die nackte main( )-Funktion, aus der sich tatsächlich auch ein sinnfreies ausführbares Programm erstellen ließe: Dasist der erste Einstiegspunkt einesjeden C++-Programms,egal wie viele andere Funktionendavorstehen oder danach noch folgenmögen. 12J~12.J-, sofci,_12.J-, /1ctse0~l2.J-,eocfe_1 wI~ soff I~i,_ AI2.J-,,,""'12J~e._Projrct""''''''e._ "ctei,_lr"'jt~i,_ t-,//~U Z s;«: Keine Sorge, der Maschinencode wird natürlich speziellen Programm erstellt, welches mit einer Sprache gefüttert werden muss. Diese Sprache und als eine gewöhnliche Textdatei gespeichert, wieder ändern kannst. wieder von einem ganz bestimmten ist für dich lesbar die du jederzeit Richtig! Du schreibst praktisch deine für dich lesbaren C++-Befehle in einen Editor, und dann sorgt ein Compiler (und Linker) dafür, dass daraus ein Maschinencode bzw. das ausführbare Computerprogramm erzeugt wird. Wenn du dein Programm jetzt ändern willst, brauchst du nur den Quelleode mit deinen C++-Befehlen zu ändern und erneut zu übersetzen. 40 Kapitel ZWEI DieeinzelnenBefehle der main-Funktion werden zwischeneine sichöffnendeund eine sichschließendegeschweifte Klammergestellt. Diewerden als Anweisungsblock bezeichnet. int main() { return 0; } Da die Funktionmain () einen Wert zurückgibt(willdas int vormain ( ) so haben)wird mit dem Befehlreturn der Wert 0 an den Aufruferdes Programmszurückgegeben. Erste Schritte in C++ 41 Unslr Irstls maln-Dlngs soillaulln ... [Zettel] Genaugenommen musst du bei der Funktion main() nicht unbedingt zit) den Wert 0 zurückgeben. nicht, macht main() (expli- Tust du das das (implizit) für dich. Allerdings ist dies nur bei der main( )-Funktion gültig und somit eine Jetzt ist es an der Zeit, dass du deinen Ausnahmeregelung. ersten eigenen Code eintippst und zur Aus- führung bringst. Es geht noch gar nicht darum, was welcher Befehl macht, sondern nur, dass ein Fenster aufpoppt Z_t..//~ci,-12..t-t ~~ und irgend- was vor sich hinbrabbelt. ~o"",/~ci,-12..t-t l((ct""''''''e.r,., ~o"",,,,,,12..t-tctfso ~~ .c: ß'r Befei/e._ 11 Das ist ein Befehl für den Präprozessor. Der Präprozessor ist ein weiteres Programm, welches noch vor dem Hier dein erstes Programm: ""'ct/~ ~t)l~s I .w'dc~e._ B~Z~e._ ~be.rZctttf'0 tt,.,c! -rre: t{:ct,.,,.,leZ ~e._se._vO,.,I2J,.,ct,.,c!e.r !rl2..t-t,.,12..t-t Z Compiler ausgeführt wird. Damit sagst du dem Compiler, dass dieser Befehle verwenden kann, welche in der Headerdatei bzw. auch in der Bibliothek iostream enthalten sind. Schön, dass du mitdenkst! dem Semikolon-Zeichen Die einzelnen Befehle werden am Ende abgeschlossen. druck, der mit diesem Zeichen endet, wird als Anweisung Befehl behandelt. #include <iostream> mit using namespace std; bzw. Der Compiler weiß dann, hier ist das Ende des Befehls und arbeitet dann den nächsten 11 Jeder Aus- 19 19 Damit stellst du für dein Programm den Namensraum std zur Verfügung. Das ist praktisch, Befehl ab. weil du ohne diese Zeile Befehle ilDas sind deine ersten int main() aus diesem Namensraum erst mit oder std: : endl std: : cout echten Befehle für das Programm. Über cout und den Operator« wird der Text, qualifizieren müsstest. { der zwischen den Immer langsam, die Welt wurde auch nicht an einem Tag erschaffen (theologisch betrachtet sechs??? -, aber wissenschaftlich in sieben - oder waren es ... ). Gänsefüßchen steht, auf dem Bildschirm ausgegeben. Hättest du iostream am Anfang des Listings il cout « "Elefanten können nicht fliegen, \n"; cout « "aber Schrödinger kann programmieren\n"; il nicht angegeben, würde sich das Programm nicht übersetzen lassen, weil der Compiler [Achtung] Denk daran, dass man in C++ ganz streng zwischen schreiben. } Groß- und Kleinbuchstaben unterscheidet. hergehen return 0; den Befehl dann nicht kennt. So kannst du nicht einfach und Main () statt Der englische main ( ) Fachbegriff hierzu lautet Case sensitivity. ••• •••••• 42 Kapitel ZWEI Erste Schritte in C++ 43 Terminal - bMh - [Achtung] Wenn falsche Umlaute in der MS Windows-Boxangezeigt werden, hat das historische Gründe. In der klassischen DOS-Eingabeaufforderung wurde zur Kodierung des Textes die Codepage 850 (Dos-Latin.1) verwendet. In der grafischen Oberfläche von Windows wird die Eingabeaufforderung hingegen mit Codepage 1252 (Win-Latin-1) kodiert. 50x 15 Dieter Baer $ ./main Elefanten können nicht fliegen, aber Schrödinger kann programmieren Dieter Baer $ • 0 Das ist mein erstes Programm bei der Ausführung auf meinem Mac. Natürlich gibt es auch in C++ einige Mittel, um Umlaute deiner Kultur darzustellen, aber ich denke, der Zeitpunkt jetzt ist ungünstig, und dann würden hier nur noch mehr Fragezeichen abgedruckt werden. Du könntest dir bspw. selbst mit hexadezimalen Werten (bspw. eine UTF-8-Literale) behelfen, allerdings musst du hierfür dann wissen, welche Codepage eingestellt ist. Auch findest du z.B. eine Klasse std: : locale in der Headerdatei <locale> für solche Zwecke vor. Du musst also "nur" ein neues Objekt von diesem Typ erstellen und das Objekt zu deinen Kulturkreisen (..German") anpassen. Folgendes Rezept könnte das Problem z. B. beheben: #include <locale> // #include <iostream> using namespace std; int main() benötigter Header { locale loc; // Objekt erstellen // mit deiner Kultur initialisieren locale::global(locale("German"»; // Jetzt sollte es ein ö sein cout « Heureka, mein Programm auf meinem Ubuntu-linux L{t-,~ !)()(S tv'/~~Y' Fuder [Notiz] Hier kannst du dich eines alten Tricks bedienen. Verwende einfach den MS-DOS-Befehl PAUSE dafür, welcher die Ausführung des Programms bis zum nächsten Tastendruck anhält. Den Befehl kannst du in C++ mit der (leider) alten C-Funktion system() absetzen. Hierzu musst du zusätzlich noch die Headerdatei <cstdlib> mit angeben, in der der Befehl enthalten ist. vIt~sRs M~~otv's fOff! "0" ~l1Y'Z_ / ()(0f 0"v! verscl"\.J.,//~v!dJ.,//~er / Und zu guter letzt das ausführende Programm unter MS Windows #include <iostream> #include <cstdlib> int main() { cout « "Elefanten cout « "aber Schrödinger sy s t.emf "PAUSE") ; { 44 Kapitel ZWEI können Einige Entwicklungsumgebungen kümmern sich selbst darum, bei anderen musst du dich darum kümmern. Im Grunde ist es ja kein Fehler, wenn das Programm wieder verschwindet. Letztendlich wird das Programm ja von Anfang bis Ende ausgeführt. Leider findet die Ausgabe hier ja auf die MS-DOS-Eingabeaufforderung statt, die extra für die Ausgabe geöffnet wird und sich daher am Ende auch automatisch wieder schließt, ohne dass einer gesehen hat, was drin stand. Hier dein Rezept nochmals mit dienicht fliegen,\n"; sem Notbehelf für kann programmieren\n"; schnellpoppende Windows-Fenster auf dem Zettel. Erste Schritte in C++ 45 Kreuz und quer oder alle. In Relh und Blled? Endlich ent.pannen und träumenl wie;.,,, c4s t../l2Jte.r0~ so 12J~~CZ ,~f, ~;~"flt 612J".6(/<._&-trcfE"fe.rfct/:"",e;.,f jt:t'r ;/'~ Ein paar Worte möchte ich noch zur Formatierung verlieren, Im Grunde ist es egal, wie du das formatierst, mit einem Semikolon SO~ctrlt TOf - So~ vo" ScZttZ~ct4o"s ~"'" cze.fE,,~/~He.r einem Anweisungsblock l2J~ltS «re: -I{ o"<._e.r,,s... abgeschlossen zusammengefasst #include <iostream> erlaubt: JJI' wie du willst. solange ein Befehl wird und mehrere zu einer Funktion (oder auch einem Ausdruck) gehörende «o« "wlowl bltt../e.rbe;.,. l)ctS t../a,rlt cfocZ 12J,,1tI{ctrr1e.r1t/ «c-« E,,~/c~(e.r jt:t'r des Quellcodes Pause einlegen kannst. Zunächst einmal kannst du deinen Code eintippen, I~Z ""'/~Z cfocZ "a,'c~sflt 4ttftJIt ehe du eine wohlverdiente Befehle in zwischen den geschweiften Klammern sind. Also folgendes Chaos ist ohne weiteres using namespace stdjint main() {cout « "und [Einfache Aufgabe] "Kreuz und quer\noder alles in Reih" Glied ...?!\n"jreturn Oj ) Bevor du jetzt deine Bewerbung schreibst, kannst du mir sicherlich die Trotzdem lohnt es, sich die Mühe zu machen, den Code etwas ordentlicher Fehler im folgenden Einrücken hat noch niemandem Listing zeigen? innerhalb eines Anweisungsblocks du nur einen Befehl pro Zeile schreibst. #include <iostream> der Syntax ist, der so aufgrund es dir deine Mit-Programmierer zu formatieren. geschadet. Ein gleichmäßiges Auch ist es hilfreicher, wenn Das hilft dir im Falle eines Fehlers; und wenn es nur ein Typo in der Fehlermeldung des Compilers schneller gefunden wird. Außerdem danken, wenn Sie deinen Code auch mal lesen oder überarbeiten werden müssen. using namespace stdj int Main() { cout « "WoW\n" } Kein Kommentar? Du hast zwei Varianten, in deinem Quellcode einen Kommentar zu vermerken: [Belohnung] SO, jetzt kannst du dich zurücklehnen [Notiz] In diesem Beispiel wurde der erste Buch- DIr stabe von Main () großgeschrieben. In C++ wird allerdings strengstens schen Groß- und Kleinschreibung schieden. Außerdem zwiunter- wurde beim Kom- mando über cout das Semikolon am Ende des Befehls vergessen. lassen des Rückgabewertes mit return Das Weg0 am Ende ist in der main () -Funktion kein Fehler und erfolgt (nur hier) automatisch, sofern nichts dransteht. 46 Kapitel ZWEI Soll sich dein Kommentar reicht die Zeichenfolge Dich stört vermutlich ein wenig die lasche Haltung in Bezug auf return bei main ( ). An dieser Stelle solltest du noch wissen, dass es trotzdem immer int main () heißen muss. Der Standard will, dass du hier immer ein int vor main () schreibst und nichts anderes sonst. Lass dir von keinem was anderes erzählen. Das schreibt der Standard eben so, und es gibt da keine Diskussion! befindet, nur über eine Zeile erstrecken, 11. Alles, was sich jetzt dahinter und von deiner künftigen Karriere träumen. wird vom Compiler ignoriert. // Ich bin ein Kommentar DIr Mehrzeilige Kommentare * I. leitest du mit 1* ein dest diese mit Alles, was sich also zwischen befindet, wird vom Compiler ignoriert: und been- 1 * und * 1 t= Ich bin ein Kommentar ~< / Erste Schritte in C++ 47 Abhängig davon, aus welcher Richtung die Daten kommen, Wie kamme Ich hier zum Bildschirm •••1 die Quelle eines Streams herrühren. Bildschirm In der anderen Um jetzt sinnvollere Programme zu erstellen, wohin oder woher die Daten kommen, fehlt dir eine kleine Wegbeschreibung, kann oder einer Datei Richtung kann der Zielort dann der oder auch wieder eine Datei sein. Du erzeugst quasi ein solches Stream-Dings, verbunden von der Tastatur welches fest mit deinem Programm ist, so dass der Datenverkehr des Programms dann nur noch über diesen Stream erfolgt. genauer, wie du etwas von der Tastatur einlesen kannst oder wie du die Daten dann auf den Bildschirm bekommst. Die grundlegenden Zunächst einmal ist die Sprache C++ ohne die iostream- lauten somit: Bibliothek stumm und taub. Erst diese Bibliothek ermöglicht Wege, etwas von der Tastatur einzulesen ... dir oder etwas auf dem Bildschirm auszugeben. Das ist auch der Grund, warum du bei fast jedem Headerdatei <iostream> mit angeben Programm die musst. Der Haupt- grund, die Ein- und Ausgabe von der Sprache zu trennen und als Bibliothek für anzubieten, den Compilerhersteller, anzubieten. Streams für die einfache Ein- und Ausgabe von Tastatur und Bildschirm von der iostream-Bibliothek [Hintergrundinfol macht es wesentlich einfacher die Sprache auch auf anderen Daher kannst du deinen Quellcode Mac-, Linux- oder aber auch Windows-Rechner :"' WohinlWoher . cout Standardausgabe Bildschirm cerr Standardfehlerausgabe Bildschirm clog Standardfehlerausgabe ein Standardeingabe (gepuffert) Bildschirm Tastatur Systemen auf deinem übersetzen und auf die gleich Art und Weise verwenden. [Zettel] Das Konzept der iostream-Bibliothek ist natürlich weitaus komplexer, umfangreicher und als das jetzt hier beschrieben wird. Fürs Erste musst du dich hier erst einmal damit zufriedengeben, dass du diese Bibliothek für die einfache Ein- und Ausgabe verwendest. Die Wegbeschreibung für die einfache Ein- und Ausgabe in C++ [Be gri ffsdefi n itio nl In C++ wird bei diesem Datenverkehr von einem Stream (engl. für [Daten-]Strom) gesprochen. Diesen Stream kannst du dir wie einen Tunnel vorstellen, durch den die einzelnen Daten einfach durchgeschoben 48 Kapitel ZWEI Bytes mit werden. Erste Schritte in C++ 49 Auf dem Weg zum Bildschirm 11 Kannst Unterwegs du zur [H in Richtung Bildschirm geht es also mit den Stream-Dingern cout, cerr und clog. Zum Beispiel: üblichen Ausgabe intergrundinfol Der Stream cerr arbeitet ungepuffert, weshalb die Ausgabe sofort auf dem Bildschirm durchgeführt wird. Bezogen auf die Badewanne dem Einlassen von Was- entspricht dieses Verhalten ser in die Wanne, obwohl der Stöpsel nicht abgedichtet auf dem Bildschirm wurde. Das Wasser läuft also vom Hahn sofort in den Ausfluss. verwenden. cout « cerr« "Das auch ... \n"j clog ~ Ist die Standardausgabe "Auf zum Bildschirm\n" « "Und noch einer j 11 alb mlrfUnf ~ ... \n" j IJ nicht mehr verfügbar IJ cout wendet wird. Diesen Stream kannst du verwenden, wenn du oder tritt ein Fehler auf, solltest du diesen Stream verwenden. Im Gegensatz zu ein, In die andere Richtung geht es mit dem Datenstrom welcher in der Regel für das Einlesen von der Tastatur ver- Kontrollmeldungen wird keine auf dem Pufferung für diese Ausgabe zum Stream verwendet. int 11 Das ist int Bildschirm ausgeben willst. Im Gegensatz cerr wird die Ausgabe allerdings gepuffert. gLbmdr fuenf ; 11 (=Integer = ganze Zahl) cout mit dem Namen « "Gib ihm fünf: "j gibmirfuenf. » ein gibmirfuenfj ~ ~ Hier kannst du gibmirfuenf Badewanne schon voll? Sinnvoll erweise wird der Datenverkehr stream me Up, SCotty mithilfe von Puffern geregelt. Stell dir mal vor, es wird jedes einzelne Zeichen sofort über den Stream auf dem Bildschirm Datei geschrieben. ausgegeben Wenn jedes Programm oder in eine auf dem Rechner so Rechner, und der Prozessor wäre bis zum Anschlag beschäftigt. bzw. der Eingabe cout, cerr und clog ein richtig funktionieren, musst du den Zudem sind diese Arbeiten Ausgabeoperator « vorgehen würde, gäbe es wohl keine Interaktion schnellsten bremsen. Aktionen außerdem und würden mehr mit dem nicht unbedingt den Rechner unnötig Damit die Ströme für die Ausgaben die aus- Beide Operatoren Daher gibt es einen Puffer, der wie eine Badewanne gefüllt werden kann, bis nichts mehr reinpasst. und den Eingabeoperator sind so implementiert zu sein), dass du damit die grundlegenden Erst danach kann J man den Stöpsel ziehen, und das Wasser kann wieder ablaufen. ohne besondere Natürlich Vorkehrungen Stöpsel gibt es hier auch Ausnahmen, auch schon bei einer halbvollen und man kann den Badewanne ausgeben » (überladen, verwenden. um genau Basisdatentypen und einlesen kannst. sollte dir dabei klar sein, dass du den Ausgabeoperator nur für Ausgabe-Streams Natürlich über die Tastatur geben, was er haben will Eingabe-Stream verwenden und den Eingabeoperator nur für den kannst. ziehen. t 50 Kapitel ZWEI Erste Schritte in C++ 51 Manipulieren ader .elber .teuern? aegen.eltlge Wahrnehmung ••• Um bei der Ausgabe in die nächste Zeile zu springen, Jetzt ist es an der Zeit, die einseitige gramm zu beenden. zwischen Das folgende dem Bildschirm Beziehung zwischen dir und deinem Beispiel zeigt dir eine gut gepflegte 1. Entweder du manipulierst mit endl, flüchtest 2. Oder du flüchtest und terminierst mit" \ n". Pro- Beziehung 3. Alle drei Zeilenende-Dinger und der Tastatur: in einen Ausgabe-Stream 4. Als vierte Möglichkeit #inelude "Schonendes using namespace mit ' \ n'. kannst du über den Ausgabeoperator « stecken. kannst du noch den Ausgabeoperator das Zeichen für das Zeilenende <iostream> hast du mehrere Möglichkeiten: etwas schonen und am Ende des Textes hinzufügen Zeilenende (zum Beispiel: \n"). std; [Notiz] Bei den Zeichen kombinationen, int main() beginnen, handelt die auch Escape-Sequenzen genannt { iI jE Da der Operator int Die Aufforderung für eine Eingabe. gibmirfuenf; « überladen werden eout kann, lässt sich dahinter immer noch weiterer Text mit einem weiteren ein « » "Gib mir fünf: iI "; musst du iIDer Manipulator endl wird die Ganzzahl nach Version da, weil noch eine = #inelude eout (mit dem mächtigen stellt die langsamste « "Danke für die" « gibmirfuenf « endl; jE befindlichen return Daten sofort an die Ausgabe using namespace int main() 0; wohl sparsamste Lösung, weil nur { und hüpft für uns in die nächste Zeile. ein einzelnes Zeichen } eout jE Der Datenverkehr über das ein-Dings an der Stelle beendet, werden von der Tastatur wird an der das erste Zeichen nicht mehr kann. Wenn du bei der Eingabe von gib- den Wert ,,5Meter" eingegeben nur der Wert ,,5" gespeichert. dass du als Typen einen Integer verwendest. räume hingegen 52 Kapitel ZWEI std; geschickt. Namen Manipulator) gibmirfuenf •• • <iostream> ausgeführt wird. Und zwar werden ein kleines Helferlein mirfuenf entkommen) hier alle sich noch im Puffer nachschieben. Das endl am Ende ist bearbeitet entfliehen, Extra-Synchronisation geschoben. « (escape \ Steuerzeichen, werden. eine Ganzzahl eingeben. Über den Operator» gibmirfuenf jE gibmirfuenf; jE Hier die mit dem Zeichen es sich um nicht darstellbare werden völlig ignoriert. hast, so wird in eout« Hier wird neben dem Zeilenendezeichen noch ein zusätzliches (aber nicht sichtbares) Terminierungs- "Der Manipulator" "Das ZeichenliteraI" Stringliteral" eout « "Das eout « "Oder « « « verwendet wird. iI endl; '\n'; "\n"; jE jE zeichen verwendet, welches das Ende des Strings kennzeichnet (Hasta la vista, baby!). Das liegt daran, Führende « return gleich E im Stringliteral\n"; E Die wohl 0; für den Prozessor günstigste Leer- Lösung, womit du den Aus} gabeoperator « nicht nochmals extra belasten musst. Erste Schritte in C++ 53 Nach ein .enlg Braln-Streamlng /; cfe_"", 612J~r/d t../l/ircfe_ bl2J"cfe_"", S!re..c-."", c0_llt bl2J ein vut../I2.J-,cfe_!I/i"A t../l/ircfe_ s!ct!! cfe_s 0rUct!ors >> 4l/isjctbeoruct!or « VUVI2.J-,cfe_{ jt:t'r ;"", 612J~r/d s/~A ctfso ~~ K/~til/i""112.J-, ~~ 0rUct!orl2.J-, vU!ctl/isci,./ t../or,A&,. Eigentlich sollte jetzt Zeit für eine Runde WoW sein, aber vorher wollen wir den jetzt, dass der Datenverkehr « Au D:jor.be.ore.ror.for » Au Tag noch ein wenig überfliegen. Sfct!! cfe_s 0rUct!ors Du weißt in C++ über Streams realisiert wird. Zwar hat das Stream-Konzept noch viel mehr zu bieten, aber für die nächsten Buchseiten Richtig, bist du aber damit dieses Beispiel auch läuft, fehlt noch etwas ganz Wichtiges. hiermit erst mal gut gerüstet. Du weißt jetzt auch, dass diese Streams nicht Bestandteil der Sprache, sondern Extra- Bibliothek enthalten Des Weiteren « und» Okay, ich helfe dir. als sind. Wenn du jetzt die Operatoren hast du auch die Operatoren kennengelernt. gibt es trotzdem auf den richtigen Weg bringst, keine Verbindung zu den Streams cout oder c in, weil diese nun mal keiner kennt. Wie ein Vampir, die dir dabei helfen, die Daten korrekt in den Stream zu der nicht ins Haus kommt, wenn du ihn nicht extra herein- stecken. gebeten Bevor du dich also auf neue Quests in der Welt der Kriegskunst möchte stürzen kannst, ich noch sehen, ob du das Thema verstanden hast. Du solltest jetzt in der Lage sein, im folgenden hast, musst du auch die beiden Streams in den Gültig- keitsbereich [Einfache Aufgabe] bitten. Es fehlt praktisch der Namensbereich std in diesem Beispiel, den du bisher immer mit using namespace std; hereingebeten hast. Alternativ kannst du aber auch den Namensbereich std mit dem Bereichsoperator : : reinbitten: Listing ohne Lupe und Rechner, die Fehler mit dem bloßen Auge zu erkennen. std::cout « std: :endl; "Du darfst rein" #include <iostream> int main() { int level; cout » "Welchen Level hast du in WoW: "; cin « level; cout » "Wow, Level" » level » "! Nicht schlecht\n"; return 0; So, jetzt kannst du einen neuen Quest anfangen. } 54 Kapitel ZWEI Erste Schritte in C++ 55 - -- starke Typen Mein Name 18t Sehrtidlnger Um Daten speichern einer geöffneten mit geometrischen zu können, du eine Kiste. Statt Kiste findest du hier allerdings eher Öffnungen Formen, wie du das noch von Steckspielen aus deiner Kinderzeit dass die jeweiligen benötigst her kennen könntest. Damit jeder seinen Stein wiederbekommt, müssen eindeutige Namen verwendet werden. Das bedeutet Formen nur in bestimmte Öffnungen also, pas- sen. So ist das auch mit dem Speichern von Daten. Man kann nicht alles reinstecken, wo und vor allem was man will ... zu kön- Um jetzt auf die Daten zugreifen nen, benötigst du für jeden Typ einen Namen (genauer einen Bezeichner). Für einen solchen Namen kannst du beliebige Buchstaben, Ziffern und das Unterstrich- zeichen (z.B. _huhu) verwenden. erste Zeichen (somit falsch: Das darf allerdings keine Ziffer 8tung) sein, und natür- lich musst du auch hier auf die Großund Kleinschreibung achten. Somit sind NebellebenundnebellebeN zwei verschiedene Namen (egal, in welcher Richtung diese gelesen werden). ?)V Q Zl O~0 Q ......,~ <:...;:::/ [Zettel] Zwar kannst du die Kuh nicht in die Formenbox der fundamentalen Typen stecken, aber später lernst du noch, wie du mit Ähnlich, wie du bei WoW als Priester heilen kannst und als den fundamentalen Krieger eher nicht, legst du mit einem Typ in C++ auch gleich eigene benutzerdefinierte fest, was du damit alles anstellen Typen erstellen kannst. kannst. Schau dir einmal Du könntest folgende Zeile an: grundlegenden ehe = mann + frau; einen eigenen erstellen. Damit diese Zeile in C++ einen Sinn ergibt, müssen und frau vom passenden und Zuweisung (=) verwendet dabei herauskommt. mann Typ sein, damit die Addition werden kann und (eine) (+) ehe Fundamentale und faule Typen Typen quasi aus den Basistypen Typ Kuh ... wie aus grundlegenden Formen (Typen) eine Katze wurde. Natürlich Verfügung, stellt dir C++ hier grundlegenden Typen zur in denen du deine Daten speichern legend heißt hierbei: Typen für Zeichen. Ganzzahltypen, kannst. Grund- Gleitkommatypen und Wenn du diese Typen besser kennengelernt hast, kannst du später daraus speziellere Typen basteln. dir das einfach wie bei dem chinesischen vor, bei dem du aus primitiven Legespiel Tangram geometrischen zusammenlegen Kapitel DREI Flächen unzählige Figuren legen kannst. Ebenso kannst du es in C++ mit primitiven Typen recht weit bringen und daraus besondere 58 Stell Typen (bspw. auch eine Kuh). Die C++-Basistypen 59 P{~iOl-tI Wie überall gibt es auch hier wieder Typen, die gar nichts ~eJt-, Fre.t-,t-,tA tAer WeJ~!,_eJtf tA0 ~~sl Z_to/Otrd~ WOt!,_~~eJtf tAOtS5c!,_ot-,e_0t-,tA vIor.sG0/e_ (;e_be_t-, f Otber /~ v/lt Je_ld e_t-,tA{;~!,_ es sich hierbei um tun Genauer handelt bei Funktionen Typ könnte zwar auch als Zeiger verwendet wer- Deklaration Definition » Gleich noch .. '1V\/'~ bezeichnet. Bekanntmachen 11 Gefolgt von Typ, gibst du den Namen gehört für das Speicherobjekt zwischen Compiler hast, der damit nichts anfangen beschrieben verwendet Typ Name; welche sich Datentypen, werden, Beh älter-Klassen kannst kannst du dir so vorstellen: mit geschweiften die eben auch später für 11 klassischen (Contai ner-Klassen) werden kann. Anstatt einer Zuweisung mit = wirst du Klammern [Zettel] selben und Typ Typen deklarieren. müssen deklariert wer- Meistens Datentypen sind solche Deklarationen gleichzeitig von auch Definitio- den. Allerdings kommt es dabei häufig nen. Das heißt, es wird ein eindeutiges vor, dass du die Definition an einer Objekt im Speicher erzeugt, dem alle anderen nötigen Informationen (eben was der Typ alles kann) zugeordnet werden. Stelle im Quellcode vornimmst Darüber brauchst du dir aber jetzt noch keine Gedanken rumliegt. Dass ein solches Verhalten dich immer darum kümmern, dass eine Variable gültige Werte erhält. Hierbei gibt es mehrere Wege, von denen der grundlegende wohl die Zuweisung Compilern mit dem = ist. kannst du auch die vereinheitlichte den geschweiften Klammern zwischen gabeoperator Bei neueren C++ 11- Initialisierung { } verwenden. kannst du die Werte auch über den Stream mit Natürlich c in und den Ein- in die Variable schieben: 11 dieter wird int dieter{36}; // Vereinheitlichte // Initialisierung (C++11) int helmut{dieter}; // Das geht auch mit C++11 IJ helmut bekommt den- int dieter = 36; 11 short kleinerDieter, nena long grosserDieter; E cin » grosserDieter; E int helmut = dieter; IJ long schroedinger; ~ schroedinger = 1234; ~ ilkleinDieter ist nicht initialisiert, und nena bekommt den Wert 99 zugewiesen. = 99; il EgrosserDieter bekommt seinen Wert über den Eingabe-Stream (der Tastatur) ein mit dem Operator » zugeschoben. ~ selben Wert wie Variablen müssen dieter zu machen. meistens mit sich bringt, sollte klar sein. Daher solltest du zugewiesen. ist nicht auf einfache Typen Auch konstruierte da eben zufällig der Wert 36 ein einfaches Komma, lassen sich auch gleich mehrere Namen vom sich dieser erst einmal selbst und greift einfach nach einem Wert, der hier in naher Zukunft auch häufiger die antreffen: durch Wenn du eine lokale Variable mit Namen anlegst, bedient Probleme komplexere Typen wie Arrays, Strukturen, Klassen oder verschiedenen Semikolon ab. Damit weiß der Compiler, welanwenden sehen. Mit dem C++11- wurde eine solche vereinheit- neben einfachen an. Am Ende schließt du diese Deklaration mit einem Typ und Namen ilGetrennt als die Deklaration. C++ 11-Standard dabei ist. Dies wollte ich nur erwähnen, falls du einen alten kann. Version mit den geschweiften und Funktionen der offiziell erst mit dem Der Erfinder von C++, Bjarne Stroustrup Klammern eingeführt, Typ Name01, Name02, Name03; ~ Definition long long int ist ein extra laaanger Ganzzahltyp, [Zettel] lichte Initialisierung verwenden usw.). Eine einfache Deklaration beschränkt. [Hintergrundinfol (im Sinne der Gleichberechtigung) Initialisierung Ein gegenseitiges Das Thema Deklaration der Typen um die große will hierbei gerne eine vereinheitlichte du auf das Speicherobjekt I +, -, Long int (". nicht rein. Eine solche Verknüpfung (bspw. und bei von int. short und Long. können auch ohne den Familiennamen int verwendet werden. Schwester zum guten Ton, und ohne kommst du ohnehin che Aktionen Ein Blick in die Glaskugel Größe) Die beiden, Bevor du einen Namen in deinem C++-Programm wird als Deklaration es sich um den kleinen Bruder (Geschlecht ist leider nicht feststellbar) kannst, musst du dem Compiler Bescheid geben, mit welchem schließlich (=Integer) an. Da wären (in aufsteigender Wie du an dem Namen Standard Typ du daherkommst. Größen von Ganz- short int, int, Longint und LongLongint. short int schon herauslesen kannst, den, aber das gilt als böse und sollte in C++ mit Weihwasser - )~ zahltypen handelt r'~" >> {~""'=""",,=~ Offiziell bietet C++ derzeit verschiedene gebrauchen. ~ ft':. ~~ Banzer Kerl dank ••• void. Der Typ kann sich gar nichts merken, und man kann ihn höchstens Der sinnleere entziehen. gebannt werden. r~j""""''''/~ 0t-,tA t-,/~!,_I f~/(osop~/eru,/ ~ V wollen und sich jeder Information nicht sofort initialisiert zugewiesen. werden. 60 Kapitel DREI Die C++-Basistypen 61 Von Us und Zeichenfolgen von Banzzahlen Ls ••• [Ablage] Es gibt gewisse Regeln, die du bei den Zeichenfolgen einhalten musst, damit der Compiler die Erscheinung auch als Ganzzahl akzeptiert. Du wirst zwar anfangs meistens nur die dezimale Schreibweise (Basis 10) verwenden, aber daneben kannst du auch eine oktale (mit der Basis 8) und hexadezimale (mit der Basis 16) Schreibweise benutzen (das Zeichenliterallassen wir mal außen vor). Die binäre Schreibweise mit dem 2er-System können Sie seit C++14 verwenden. Ein Beispiel mit oktalen, hexadezimalen und binären Gegenstücken. 100 255 01 0144 0377 Ox1 Ox64 Oxff Ob1 Ob01100100 Ob11111111 l/t-rsft-Z e I ~~ o~fo,l~:;cLveJ6l-,/eJ~e.. 6~/~l-tf ",:/1 f!J 01-t~ ~~ Zex, or.tIe_<.!w,or.(e.. :;cLveJ bl-,/e/ se Hier noch eine Schnellnotiz, wie du deine Zeichenfolge von Ganzzahlen noch komplizierter machen kannst. Hängst du am Ende ein U an die Zahl, gilt diese Zahl explizit als unsigned (z. B. 1234U). Hängst du ans Ende ein L, wird die Zahl explizit als long int betrachtet (z. B. 1234L). Kombinierst du beide miteinander, kannst du auch ein unsigned long int daraus machen (z. B. 1234UL). Und wenn du die ganz laaangen Typen wie long long (int) oder unsigned long long (int) brauchst, hängst du einfach ein LL (für long long; z. B. 1234LL) oder ein ULL (für unsigned long long; z. B. 1234ULL) hinten dran. Hängst du nichts hinten an, dann handelt es sich um ein int. In der Praxis findest du die Verwendung der Us und Ls eher selten, weil der Compiler oft schon selbst erkennt um was für einen Ganzzahltyp es sich bei einem Literal handelt. Die Sache mit der Wahrheit ••• [Zettel] Bei der hexadezimalen Schreibweise werden die Buchstaben a, b, c, d, e, f verwendet, um 10, 11, 12, 13, 14, 15 darzustellen. w,/I (!))( ... Wenn du herausfinden willst, ob deine Freundin dir treu ist, kannst du den Booleschen Typ verwenden. Der Typ bool ist nur darauf spezialisiert, ob etwas wahr (=true) oder unwahr (=false) ist. Damit kannst du die verschiedensten Werte bzw. Ausdrücke auf Wahrheit hin testen. Ein einfaches Beispiel: POlltlve und/ader negative Haltung und ein Endtell m und Wenn eva dieter den gleichen Wert hätten, wäre der Wert von E die Variable neutralerTyp02 explizit als vorzeichenbehaftet. Auf das Schlüsselwort kannst du verzichten, weil ganzzahlige Typen ohne die Verwendung von unsigned immer vorzeichenbehaftet sind. unsigned int positiverTypj int neutralerTyp01j ~ signed int neutralterTyp02j hat true. treu hier den Wert false. ° konvertiert wird. Hierbei wird der Wert 1234 nach 1 (=true) m Die Variable dieses speichern . E ~ Die Variable dieses Typs speichert negative und konvertiert. für die beiden ... Schlüsselworts unsigned keine negativen Werte m gleich Sieht wohl nicht gut aus Typs kann wegen des Hier kennzeichnest du mithilfe des Schlüsselwortes signed treu Im vorliegenden Fall haben diese beiden Variable unterschiedliche Werte. Daher Alle drei Ganzzahltypen haben eine positive und negative Haltung, was ihren Werteteil betrifft. Wenn du einen Integer ohne weitere Angaben hinschreibst, kann dieser sowohl negative als auch positive Werte aufnehmen. Brauchst du allerdings einen ganzzahligen Wert, der nur vorzeichenlos sein soll, stellst du lediglich das Schlüsselwort uns igned voran, und schon hat der Typ seine negative Haltung fallen gelassen: ~ Hier ist ichLiebeDich auf jeden Fall true, weil eine ganze Zahl ungleich immer nach true positive Werte. m int dieter=1974, eva=1980j bool treu = dieter==evaj bool ichliebeDich = 1234j ~ int liebe = ichLiebeDichj E int wahreliebe = Oj bool iLoveYouBaby = wahreLiebej m E liebe bekommt hier den Wert 1 zugewiesen, weil ein Boolescher Wert eben nur die Werte true (1) oder false (0) enthalten kann. E E iLoveYouBaby hingegen ist false, weil ein Wert von 0, was wahreliebe eben ist, immer nach false konvertiert wird. 62 Kapitel DREI Die C++-Basistypen 63 IVI~~f ~ri1Wi t,ot'~(;~~1 /v1EIIVL-jIVC I ~i1 sv~sf I-,/e/( i1t,SU'{!_ I-,/VPI Wal nehmen wir fUr einen Typen? I-,/Ot~r I~fl b/~f ~i1_ I-,/Vp I sot,1U't," ~Otri1Wi I ~V< ~i1 I-,/VP 6/~( I .''''je..,. <,/1 Nachdem r .,(, e u/« t,_rL,_~tl I ".I.. {!_Wi1-,/1 ~ ~{!_s ~{!_ZOti1rf{!_t,~A{r;o sJ Wilr ~OC~I ~i1 du die Typen für Ganzzahlen Du solltest dir dabei jetzt noch keine Gedanken machen. Das klären wird später noch. I-,/VPU' /v1{!_t,sc~1 ~A5 so{( I~~ Will ~~ bool 64 Kap i tel DREI bezüglich der Größe der Typen [Einfache Aufgabe] Erstelle ein einfaches ~~"je_" ~ deinen Kontostand Programm, welches abfragt und auch, wie viel Gramm Wurst du vom Metzger Meier gerne hättest. ?y Werter Schrödinger, zu argwöhnen, das Seiende sei anzweifelbar, ist der erste Schritt, zwischen wahr und unwahr zu unterscheiden. kennst, wird es Zeit, dass du diese auch mal benutzt. Überlege dir, was du bei den beiden Variablen kontostand und grannn beachten solltest. Hier könntest du genauso gut Hierzu eine mögliche Um deine Anfrage als Wahres zu beantworten, Folgendes: Du wirst die Logik erst erkennen, wenn du weiter an deinem Sein arbeitest und später in Logikanweisungen oder Funktionen zwischen Wahrem und Unwahrem unterscheiden willst. den Typ Lösung short oder long verwenden (hängt natürlich von der persönlichen Finanzlage ab). #inelude <iostream> Wichtig ist auf jeden Fall, dass hier using namespaee ein Typ mit Vorzeichen verwendet std; wird, weil man das Konto ja auch überziehen soll, damit die Bank int main() auch was dran verdient. { jE Über den Eingabe-Stream ein schiebst du mithilfe iE Hier brauchen wir mit unsigned einen vorzei- int kontostand; unsigned int gramm; iE chenlosen Typ, der »-Operatoren die Werte von der Tastatur in die entsprechenden Variable. weil es eben keine ,,-100 g" eout « ein » "Dein Kontostand kontostand; eout « ein » jE jE "Kontostand " « «"\nWurstaufsehnitt « Wurst gibt. "Wieviel Wurst darf es ein: "; gramm; eout « " ; " gramm" « kontostand "« gramm endl; return 0; [Belohnung] Die C++-Basistypen 65