K03 C++Einführung 1. 2. 3. 4. 5. 6. Allgemeines Entwicklungsprozess GültigkeitsbereicheundNamespaces Prozedur-/Funktionsaufrufe,Inlining, Default-Argumente ElementareTypenundStrukturen VergleichJava/C++ nachFolienvonHeikoSchuldt thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 2 C++Literatur n n n B.Stroustrup:DieC++Programmiersprache.4.Auflage Addison-Wesley,2010.ISBN:3827328233 B.Stroustrup:EinführungindieProgrammierungmitC++ Pearson,2010.ISBN: 978-3-8689-4005-3 M.Weiss:C++for JavaProgrammers PearsonPrentice Hall,2004.ISBN:013919424X Freiverfügbar: n B.Eckel:Thinking inC++,SecondEdition. VolumeI/II.Prentice Hall.2000/2003 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 3 Abschreckend– Neugierigmachend? “C++ is a horrible language. It's made more horrible by the fact that a lot of substandard programmers use it, to the point where it's much much easier to generate total and utter crap with it. Quite frankly, even if the choice of C were to do *nothing* but keep the C++ programmers out, that in itself would be a huge reason to use C.”* *LinusTorvaldsüber C++im Vergleich zu C,im Kontext vonGit: http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 4 WarumC++? n Effizientesystemnahe(maschinennahe)Programmierung n n n WirddarüberhinausinunterschiedlichstenAnwendungsgebietenbenutzt, z.B.: n n n n n Graphik,2D&3DVisualisierung NumerischeBerechnungen Server-Anwendungen Spieleprogrammierung HoherVerbreitungsgrad n n Betriebssysteme EingebetteteSysteme Esexistierensehrviele(freie)Bibliotheken C++kannauchmitanderenProgrammiersprachengekoppeltwerdenwie z.B.VisualBasic,Python,MATLAB,Java,Haskell … thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 5 WannC++ehernicht? n UmalsAnfänger„malschnell“diex-teSoftwarezurVerwaltung derprivatenMusiksammlungzuentwickeln à EinederkomplexestenProgrammiersprachen. n KleineProjekte n Skripte n SchnellePrototypenentwicklung n ErhöhteSicherheitsanforderungen– StichwortSandboxing n BedingtdurchdieMöglichkeitdirektaufdenSpeicherzugreifen zukönnen,ohnedasdiesüberwachtwird*,istesleichtmöglich denSpeicherzukorrumpierenoderkompromittierbarenCode zuschreiben,dereserlaubtSchadfunktioneinzuschleusen. *WasaberandererseitsheutigeBetriebssystemezumindestimUserspace einschränkendurch disjunkteSpeicherbereicheproProzess. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 6 C++zusammengefasst C n C++istnicht C,obwohlbeidevielesgemeinhaben n n n n n n n n n Kapselung,Polymorphie,Mehrfachvererbung(!) UnterscheidungzwischenObjektidentitätundObjektgleichheit BietetMöglichkeitenderfunktionalenProgrammierung n n SeparateQuellcode-Dateien,Namensbereiche,Klassen,Funktionen/Methoden Imperativ,systemnah Objektorientiert n n Inkompatibilitätenz.B.durchstrengereTypprüfunginC++ Strengtypisiert DynamischesalsauchstatischesBinden Modular– StrukturierungdesQuellcodesdurch: n n C++ Methoden/FunktionenhöhererOrdnungdurchFunktionszeiger ÜberschreibenvonMethodenundÜberladenvonOperatoren Ausnahmen(Exceptions)zurFehlerbehandlung TemplateszurgenerischenProgrammierung MetaprogrammierungdurchMakros(z.B.bedingtesKompilieren) thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 7 StammbaumderOO-Sprachen Quelle:http://upload.wikimedia.org/wikipedia/commons/d/db/Historie.png thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 8 SchlüsselwörterinC++undC SchlüsselwörterinCund C++ auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Schlüsselwörter(nurC++) Legende: Schwarz Braun asm bool catch class const_cast delete dynamic_cast explicit false friend inline mutable namespace new operator private protected public reinterpret_cast static_cast template this throw true try typeid typename using virtual wchar_t Syntax,SemantikähnlichinJava inderVorlesung(nicht)behandelt thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 9 DasklassischeersteProgramm hello_world.cpp // it does what it does #include <iostream> int main() { std::cout << "hello world!\n"; return 0; } > g++ hello_world.cpp -o hello_world > ./hello_world hello world! iostream:benötigtman,umdas cout (console output)Objektfür dieAusgabeaufderKonsole benutzenzukönnen. std::cout isteinStandardStream-OutputzurAusgabe g++ istderGNUC++Compiler, dereineC++Dateikompiliert undeinExecutable erzeugt. DasProgrammhello_world wirdausgeführt ZumeistwirdeinMakefile benutzt,umdenÜbersetzungsvorgangzuautomatisieren. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 10 Diespeziellemain-Funktion n FunktionzumStartendesProgramms– derEinstiegspunkt n SagtdemBetriebssystem,woderEinsprungindasProgrammstattfindet – nureinemain-FunktionproProgrammmöglich. test.cpp Funktionsargumentekönnenauch weggelassenwerden(Überladen), wennnichtgenutzt. int main(int argc, char** argv) { int x = 0; return x; } thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 11 StandardEin- undAusgabe n cout wirdzurAusgabeaufdieKonsolebenutzt: #include <iostream> using namespace std; int main() { int i = 5; cout << "the value of i is " << i << endl; } n endof line cin wirdzurEingabebenutzt: #include <iostream> using namespace std; int main() { int i; cout << "Enter a value for i "; cin >> i; } cin wartetaufEingabe thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 12 1 // small example Kommentare 2 /* A first program in C++ */ Mit/* und*/bzw.durch//. 3 #include <iostream> 4 5 int main() 6 { 7 std::cout << "Welcome "; 8 std::cout << "to C++!\n"; 9 return 0; //program ended successfully 10 } // end method main Präprozessor-Direktiven Zeilenmit# sindPräprozessorDirektiven,alsoBefehlefürden C++Präprozessor. #include <iostream> teiltdem Präprozessormit,dassderInhalt derDatei<iostream> mitindie C++Dateieingebundenwerden soll. Welcometo C++! return isteineMöglichkeit,eineFunktionzubeenden. return 0 teiltdemVater-Prozessmit,dassdasProgrammerfolgreichbeendetwordenist. § Exkurs:Programmkannauchdurchexit(int) jederzeitbeendetwerden § Bekommtmandurch#include <stdlib.h> § Signatur(Prototyp)istvoid exit(int); § ParameteristRückgabewertfürVater-Prozess(0 =normalexit) § Achtung:ruftkeineDestruktoren auf;dazuspätermehr thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 13 FortsetzungBeispiel n std::cout Standard-AusgabeStream-Object n “Verbunden”mitderKonsole std:: istderNamesbereich "namespace"voncout std:: kanndurchusing std weggelassenwerden n n << Stream-AusgabeOperator WertaufderrechtenSeitedesOperatorwirddemOutput-Streamübergeben (welchermitderKonsoleverbundenist) std::cout << "Welcome to C++!\n"; n n n n >> n n n Stream-EingabeOperator ZeichendesInput-StreamwerdenderrechtenSeitedesOperatorszugewiesen \ n n „Escape character“ BesondereZeichenzurAusgabe thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 K03 C++Einführung 1. 2. 3. 4. 5. 6. Allgemeines Entwicklungsprozess GültigkeitsbereicheundNamespaces Prozedur-/Funktionsaufrufe,Inlining, Default-Argumente ElementareTypenundStrukturen VergleichJava/C++ thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 15 EntwicklungmitmehrerenDateien n InC++istesüblich,denQuelltextinmehrerenDateienzuhalten n GruppierunglogischzusammengehörenderFunktionen/Klassen/Strukturen n JedeDateibildetdadurcheinModul n DateinameundInhaltderDateisindfürdenCompilerzusammenhangslos(im Gegensatzzuz.B.Java);esistaberüblichdassderNamedenInhaltin sinnvollerWeiserepräsentiert. main.cpp utils.cpp int add(int a, int b); int add(int a, int b) { return a + b; } int main(void) { int result, a=2, b=3; std::cout << add(a,b); return 0; } int sub(int a, int b) { return a - b; } thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 16 OrganisationdesQuellcodes(i) #include <iostream> #include "Body.h" int main() { Body a; std::cout<<a.volume()<<std::endl; return 0; } Deklaration in WasistBody ? WasistBody::volume() ? test.cpp:Hauptprogramm,dasdieKlasseBody benutzt. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 17 OrganisationdesQuellcodes(ii) #include <iostream> #include "Body.h" int main() { Body a; std::cout<<a.volume()<<std::endl; return 0; } test.cpp:Hauptprogramm,dasdieKlasseBody benutzt. class Body { public: int volume() const; ... }; Body.h:HeaderDateiinderdie Klassen/Funktionendeklariert werden. #include "Body.h" int Body::volume() const { return int k = 1; } ... Body.cpp:Implementierung (=Definition)derKlasse/Funktionen. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 18 DeklarationversusDefinition DeklarationenundDefinitionensindzweiunterschiedlicheKonzepte! n AlleBezeichner(Symbole)müssendemCompilerbekanntgemachtwerden, d.h. siemüssenvordererstenVerwendungdeklariert werden. Deklaration n BekanntgabeanCompilerüberExistenzz.B.einerFunktion,einerKlasseusw. n BeiFunktionliefertsiedieSignatur:Rückgabetyp,ListederArgumente. n DeklarationeinerFunktionwirdauchalsFunktionsprototypbezeichnet. Definition n Variable:HierwirdvomCompilerCodeerzeugt,derfürsieSpeicherreserviert. n Klasse/Funktion:derenImplementierung. Beachte: JedeDefinitioneinerVariablenistaucheineDeklaration. DeklarationundVerwendungohneDefinitionführtzuLinker-Fehler. Mehrfachdeklarationsindmöglich;Mehrfachdefinitionjedochnicht. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 19 Funktionsdeklaration AufbauderDeklaration– Funktionsprototyp T0 F ( T1 [P1], T2 [P2], … ) ; T0 = TypdesFunktions-Rückgabewertes F = Name(Bezeichner)derFunktion Pi = FormaleParameter(VariableninnerhalbderFunktion) Ti = TypenderformalenParameter Beispiele: int foo(int x); int foo1 ( int, float ); void bar(); float evalSquare (float a0, float a1, float a2, float a3); thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 20 Funktionsdefinition SyntaxderDefinition T0 F ( T1 P1 , T2 P2 , … ) { . . . } n Innerhalb{ n FormaleParameterwerdenwieandereVariableninnerhalbdesBodysverwendet n return x beendetFunktionundgibtFunktionswertvomTypT0 zurück n } stehendieAnweisungenund/oderAusdrücke(function body) FallsT0 = void,verwendetmanreturn ohneArgument (nichtnötig,fallsreturn unmittelbarvor } ) Beispiel: bool sign(int x) { if ( x >= 0) return true; else return false; } thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 21 Beispiel #include <iostream> #include "Body.h" //declaration and definition int global = 0; int main() { Body a; //definition int i=1, j; //defini (i), declar (j) l = func1(i,k); l = func2(i,k); std::cout<<a.volume()<<std::endl; return 0; } test.cpp:Hauptprogramm,das dieKlasseBodybenutzt Body.h int func1(int, int); //declaration int func2(int k, int j); //declaration class Body { public: int volume(); }; Body.cpp #include "Body.h" //definition int Body::volume() { int MAX=10; //declar + defini return MAX; } //definition int func1(int k, int j) { return (k-j); } //definition int func2(int k, int j) { return (j+k); } thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 23 KompilierenundLinken- Stufen PreprocessorC++CompilerLinker Body.h Body.cpp Body.h' Executable (ausführbares Programm) Body.o Body.cpp' test.o test.cpp Library.h Library.h Library.h test.cpp' Library Library Library Souce-Codenotwendig wennstatischbeim Kompiliereneingebunden. Object-Codenotwendig wennstatischbeim Linkeneingebunden. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 24 Präprozessor n WertetMakros bzw.Direktiven aus: n n n n EinMakro/Direktive*isteineAnweisunganeinenSoftwareprozessor; z.B.Textersetzungmittels#include-AnweisungdurchPräprozessor. n MakroskönnenArgumentehaben;hiernichtbehandelt. HauptanwendungsgebietvonMakrosistdasbedingteKompilieren: n Plattformunabhängigkeit:plattformspezifischerCodewirdnurdann eingefügt,wenntatsächlichfürdiebetreffendePlattformkompiliert wird(ansonstennicht). „Versteht“selbstkeinC++(bzw.C). DererzeugteC++QuelltextwirdandenCompilerübergeben. Merke: Makros/DirektivensindAnwendungsfälleder Meta-Programmierung – „ProgrammimProgramm“ *EsexistierenauchDirektiven,welcheAnweisungenandenCompileroderLinkersind. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 25 Präprozessor-Anweisung– Beispiel n FürdieArbeitmitmehrerenDateienwirdmeisteszujederHeaderDateidiefolgendeAnweisunghinzugefügt: #ifndef FILENAME_H #define FILENAME_H <header file body here> #endif /* FILENAME_H */ n Damitwirdgewährleistet, dasseineHeader-Dateimax. einmalbeimKompilieren eingebundenwird. #ifndef BODY_H #define BODY_H int func1(int, int);//declaration int func2(int k,int j);//declaration const int MAX=10; //decla + defini. class Body { public: int volume(); }; #endif /* BODY_H */ thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 27 Mehrfach-EinbindungvonHeadern #ifndef _BASIS_H_ #def _BASIS_H_ // content of basis.h int global=100; int volume() {return global++; } #endif Header-Datei: basis.h Header-Datei:graphen.h: Header-Datei:statist.h: #include <iostream> #include "basis.h" #include <iostream> #include "basis.h" #include "statist.h" #include "graphen.h" int main() { . . . return 0; } Quelldatei: anwendung.cpp thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 28 Compiler n n n n n ErwartetC++(bzw.C)-Quelltextohne Präprozessoranweisungen ÜberprüftSyntax Generiert undoptimiert Maschine-Code ErzeugtObjekt-Datei(en)fürdenLinker DieQuelltext-DateienundZeilennummernsindimmernoch bekannt thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 29 Objekt-Dateien n Objekt-DateienenthaltendenkompiliertenQuelltextund einenIndexderbenutztenSymbole(Bezeichner). n nm (Linux)oderdumpbin (Windows)erzeugtdieseIndexliste. n SymbolesindnochkeinenAdressenzugeordnet. n EndungeinerObjekt-Datei:.o (Linux)bzw..obj (Windows) thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 30 Linker(Binder) n Linker n n LöstalleAbhängigkeitenderObjekt-Dateienauf. ErzeugtdasausführbareProgramm n n n n Dazumüssenu.a.SymbolenAdressenzugeordnetwerden MachtkeineweitereCode-Optimierung KenntkeineTypenoderVariablenmehr AuflösungdesNamensistabhängigvomCompiler— es istalsonichtgarantiert,dasseinLinkerObjektdateienvon unterschiedlichenCompilernlinken(binden)kann. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 31 StatischesversusdynamischesLinken n Statisches Linken:AlleObjektdateienwerdenindas ausführbareProgrammgelinkt. n n DerLinkersuchtinallenObjekt-Dateiennachentsprechenden SymbolenundführteineZuweisungzwischendefiniertenSymbolen durch. Dynamisches Linken:EsgibtSymboledieerstzurLaufzeit aufgelöstunddynamischgelinktwerdenausBibliotheken. n n n .dll (Windows)und.so (Linux)Bibliotheken,dieausObjekt-Dateien bestehenundzurLaufzeitvomBetriebssystemeingebundenwerden Vorteile:ReduziertGrössevonausführbarenDateien;Fehlerin BibliothekerfordernnurerneutesKompilierenderBibliothek. Nachteil:„DLLHell“– WennneuereVersioneinerBibliothek inkompatibelistmitProgrammdasvonältererVersionabhängt. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 32 Bibliotheken(Libraries) n Idee:bereitssorgfältigimplementierteSoftwarewiederverwenden n Library: n n n System-Library: n n n MengevonvorkompiliertenSourcen (Funktionen,Klassen,Typen,…), zusammengefasstineinerDatei IstkeineigenständiglauffähigesProgramm(enthältkeinmain) Library,dieinbestimmten,vordefiniertenVerzeichnisseninstalliertist KommttypischerweisemitdemBetriebssystem Linux:/usr/lib EinguterProgrammiererkenntvieleunddie„richtigen“Libraries... thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 33 Bibliotheken(Libraries) n WieverwendetmanSystem-Libraries? n n n InderC++Datei:Header-Dateiinkludieren Beispiel:#include <math.h> LinkeneinerübersetzenBibliothek(Objektdatei) n n KonventionunterLinux: -lm linktlibm.so BeispielMath-Librarylinken: g++ -o myprog file1.o file2.o –lm thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 34 Makefile n n DerProzessdesKompilierenswirddurcheinMakefile automatisiert. EinMakefile führteineListederAbhängigkeiten dereinzelnenQuelltextDateienundliefertDirektivenundBefehlezumautomatischen KompilierendesProjektes. Body.o: Body.cpp, Body.h g++ -c -o Body.o Body.cpp test_body.o: test_body.cpp, Body.h, iostream g++ -c -o test_body.o test_body.cpp test: test.o, Body.o g++ -o test test.o Body.o n Abhängigkeiten Compile Befehl Abhängigkeiten Compile Befehl Abhängigkeiten Link Befehl DasErstellenunddasVerwaltenvonMakefiles kannsehraufwändig sein.EsgibtWerkzeugezumautomatischenErzeugenvonMakefile: n Tmake,QMake,CMake,SCons thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 35 TMake TMake istfreiverfügbarunter: http://tmake.sourceforge.net/ “tocreateandmaintainmakefiles forsoftwareprojects.It canbeapainfultasktomanagemakefiles manually, especiallyifyoudevelopformorethanoneplatformoruse morethanonecompiler.tmake automatesandstreamlines thisprocessandletsyouspendyourvaluabletimeonwriting code,notmakefiles.” thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 36 TMake - Beispiel test_body.pro HEADERS SOURCES TARGET = = = Body.h Body.cpp hello.cpp test_body >: setenv TMAKEPATH /local/tmake/lib/linux-g++ >: setenv PATH $PATH:/local/tmake/bin >: tmake test_body.pro -o Makefile >: make g++ -c -pipe -Wall -W -O2 -o Body.o Body.cpp g++ -c -pipe -Wall -W -O2 -o hello.o hello.cpp rm -f test_body g++ -o test_body Body.o hello.o >: make clean rm -f Body.o hello.o test_body rm -f core *~ n TMake: n n GeneriertautomatischeinMakefile. DieAnhängigkeitenzwischendenDateienwerdenautomatischerkannt. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 37 DokumentationdesC++Codes n DasVerwaltenundModifizierenvongrossenC++Paketen kannsehrkomplexsein. n n GuteDokumentationistdeshalbsehrwichtig. Doxygen isteinWerkzeugzurDokumentationvonC++ QuelltextenvergleichbarzuJavadoc. n Doxygen istfreiverfügbarunter http://www.doxygen.org thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 38 Doxygen Beispiel:DokumentationeinerFunktion /** * * * * * * * */ Dokumentation of a function @param lower lower bound of the range @param upper upper bound of the range @return A vector with the same size as this vector and binary elements @warning some detail .. @todo ... @bug ... FVector findInRange(float lower, float upper) const; Doxygen analysiertdieC++Dateienunderzeugthtml-Dateienmitder entsprechendenDokumentation. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 K03 C++Einführung 1. 2. 3. 4. 5. 6. Allgemeines Entwicklungsprozess GültigkeitsbereicheundNamespaces Prozedur-/Funktionsaufrufe,Inlining, Default-Argumente ElementareTypenundStrukturen VergleichJava/C++ thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 40 GültigkeitsbereicheinC++ n C++(undvieleandereProgrammiersprachen)benutzenlexikalischen Scope.EinScopewirdu.A.durcheinenBlockgebildet. n EinBlockisteinPaar,bestehendaus`{´ und`}´. n Blöckekönnenbeliebigtiefverschachteltsein. n n n Syntaxregelndefinieren,anwelchenStellenimProgrammBlöckegebildet werdenkönnen. Bezeichner,dieinnerhalbeinesBlocksdeklariertsind,heissenlokal. Bezeichner,dieausserhalballerBlöckeundFunktionendefiniertsind, heissenglobal. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 41 GlobaleSichtbarkeit n Globale BezeichnersindineinemBlocksichtbar(z.B.ineiner Funktion),wenn: n n n n dieDeklarationvorderFunktionoderdemBlockliegt, derBezeichnerandersheisstalsdieimBlock, beieinerFunktionalleParameterderFunktion andersheissenalsderBezeichner, allelokalenBezeichner(Variablen,Typen,etc..) andersbenanntsind. stack free n GlobaleVariablenliegenim globalenSegment. heap global text thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 42 LokaleSichtbarkeit n Bezeichner,dieineinemBlock(geschachteltenBlock) deklariertwerden,sindsichtbar: n n n nurinnerhalbdiesesBlocks,abderStellederDeklarationbiszumEnde desBlocks vonBlöcken,welcheindiesenBlockgeschachteltsind,fallssienicht selbsteinenBezeichnermitgleichemNamedeklarieren. DieSichtbarkeiteinerFunktionentsprichtder einesBezeichnersausserhalballerBlöcke (FunktionenkönneninC++nichtgeschachteltwerden) n LokaleVariablenliegenaufdemStack. stack free heap global text thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 43 GlobaleVariablen n n n GlobaleVariablenkönnenvonjedemOrtauserreichtwerden, auchwennsiedurchlokaleBezeichner„verdeckt“sind. DerzugehörigeOperator:: heißtBereichsoperator (engl.scope resolution operator) GlobaleVariablensolltenmöglichstvermiedenwerden! n n n Seiteneffekte sindmöglich,wenndieVariableninverschiedenen Funktionenverwendetwerden. GlobaleVariablensindinderRegelschlechtzuwarten. IhreInitialisierung– Reihenfolge – istnichteindeutig. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 44 Sichtbarkeit:Beispiel int x = 10; // Globale Variable void f () { // // // // int y = x; int x = y - 10; ::x = ::x – 9; { int y = x; int x = 5; Funktionsblock Benutze globales x Lege lokales x an Benutze globales x // verschachtelter Block // Welchen Wert hat y? // Wie oft wird diese Schleife durchlaufen? for (int j = 0; j < ::x; ++j) { /* ... */ } } x = x * 100; // Welches x wird hier verändert? } thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 45 ProblembeiderVerwendungglobalerVariablen… § WiesowirdsichderCompiler(beimÜbersetzen)mit gcc –Wall util.cpp test.cpp -o test darüberbeschweren? /* util.cpp */ #include <iostream> using namespace std; /* test.cpp */ #include <iostream> using namespace std; int g_numCalls = 0; void someFunc(void); int g_numCalls = 10; void someFunc(void) { cout << "someFunc:util " << g_numCalls++ << endl;; } int main(void) { cout << "someFunc:main " << g_numCalls << endl; someFunc(); someFunc(); } § BeimLinkentrittzweimaldiegleicheglobaleVariableauf! thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 46 SpeicherklassevonObjekten n n n DieDeklarationeinesObjekteslegtnebenTypundName auchseineSpeicherklassefest. DiesebestimmtdieLebensdauer. DieSpeicherklasseeinesObjektesistfestgelegtdurch: 1. 2. DiePositionderDeklarationinnerhalbderQuelldatei DieoptionaleSpeicherklassen-Spezifikation: n extern/static siehespäter n auto (Default)beimErreicheneinerDefinitionwirddas ObjektaufdemStackneuerzeugtundbeimVerlassen wiederzerstört(imGegensatzzustatic) n register ZurBeschleunigungderProgrammausführung, VariablewirdimRegistergehalten thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 47 DerModifier static n n (i) EinewesentlicheEigenschaftstatischerObjekteistihrestatische (=permanente)Lebensdauer. StatischeObjektewerdenimDatensegmenteinesProgrammsgehalten undnichtaufdemStack static hathierbeidreiverschiedeneBedeutungen: 1. VoreinerglobalenVariableoderFunktion static int g_someValue = 0; static void g_someFunction(void); n n n WeistdenLinkeran,diesenBezeichnernichtzuexportieren. BeschränktdieSichtbarkeitdesBezeichnersaufdieDatei. DerLinkerwirdihnnichtverwenden,umAbhängigkeitenandererDateien aufzulösen. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 48 DerModifier static (ii) 2. VoreinerlokalenVariable(ineinerFunktion) void someFunc(void) { static int array[4000]; } PlatziertdieVariablenichtaufdemStack n HatdenEffekt,dassdieVariablezwischenwiederholtenAufrufen ihrenWertbeibehält à FunktionmitGedächtnis (ohneaufglobalsichtbareVariablenzurückgreifenzumüssen) n Verwendungz.B.umzuvermeiden,dassgrosse Objekteimmer wiederaufdemStackangelegtwerden. n thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 49 DerModifier static (iii) 3. VoreinerKlassenvariable(oderMethode) später class Whatever { private: static Whatever* instance; public: static Whatever* getInstance (void); } n n n n DefiniertglobaleVariable/FunktionfüreineKlasse AlleInstanzeneinerKlasseteilensichihrestatischeVariablen Zugriffvonaussen (fallspublic):Class::Member StatischeMemberfunktionen könnennuraufstatische Membervariablen zugreifen thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 50 ProblembeiderVerwendungvonglobalenVariablen… LösungfürdasProblemderMehrfachverwendungglobalerVariablen(Folie45): /* util.cpp */ #include <iostream> using namespace std; int g_numCalls = 0; void someFunc(void) { cout << "someFunc:util " << g_numCalls++ << endl;; } gcc -Wall util.cpp test.cpp -o test Ausgabe: someFunc:main 10 someFunc:test 10 someFunc:test 11 /* test.cpp */ #include <iostream> using namespace std; static int g_numCalls = 10; static void someFunc(void) { cout<<"someFunc:test " << g_numCalls++ << endl; } int main(void) { cout << "someFunc:main " << g_numCalls << endl; someFunc(); someFunc(); } thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 51 ProblembeiderVerwendungvonglobalenVariablen… n static kannhierhelfen,aber: n DieVariableng_numCalls ausutil.cpp und g_numCalls austest.cpp steheninkeiner Beziehungzueinander(sindsozusagen'privat' per Datei) thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 52 ProblembeiderVerwendungvonglobalenVariablen… NochmalszumProblemderMehrfachverwendungglobalerVariablen(Folie45): /* util.cpp */ #include <iostream> using namespace std; int g_numCalls = 0; void someFunc(void) { cout << "someFunc:util " << g_numCalls++ << endl;; } gcc -Wall -ansi util.cpp test.cpp -o test Ausgabe: /* test.cpp */ #include <iostream> using namespace std; static int g_numCalls = 10; // declaration of someFunc void someFunc(void); int main(void) { cout << "someFunc:main " << g_numCalls << endl; someFunc(); someFunc(); } someFunc:main 10 someFunc:util 0 someFunc:util 1 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 53 ProblembeiderVerwendungvonglobalenVariablen… NochmalszumProblemderMehrfachverwendungglobalerVariablen(Folie45): /* util.cpp */ #include <iostream> using namespace std; /* test.cpp */ #include <iostream> using namespace std; int g_numCalls = 0; extern int g_numCalls; void someFunc(void); void someFunc(void) { cout << "someFunc:util " << g_numCalls++ << endl;; } int main(void) { cout << "someFunc:main " << g_numCalls << endl; someFunc(); someFunc(); } gcc -Wall -ansi util.cpp test.cpp -o test Ausgabe: someFunc:main 0 someFunc:util 0 someFunc:util 1 extern: Variableistirgendwo globaldefiniert,kann hieraberbenutztwerden thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 54 GlobaleVariablen:WeiteresBeispiel n WaskönntehierProblemeverursachen? /* debug.h */ int debug_level; … /* test.cpp */ #include "debug.h" … /* debug.cpp */ /* otherfile.cpp */ #include "debug.h" … #include "debug.h" … Übersetzungmit:gcc -Wall *.cpp -o test § Fehler:derLinkerwirddreimaldiegleicheglobaleVariabledebug_level sehen. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 55 WeiteresBeispiel: Lösungmitstatic? static beseitigtzwardenCompilerfehler,verursachtabereinneuesProblem! n /* debug.h */ static int debug_level; … /* test.cpp */ #include "debug.h" … /* debug.cpp */ /* otherfile.cpp */ #include "debug.h" … #include "debug.h" … Übersetzungmit:gcc -Wall *.cpp -o test § JedeDateibekommtihreeigeneVersionderVariablendebug_level! thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 56 ExterneBindung n Forderung: n n n n n dieVariableint debug_level solleinmal(imHeader)deklariertwerden dieVariablesollvonverschiedenenDateienausbenutztwerdenkönnen essollnichtmehrfachPlatzfürdieVariablealloziert werden DeklarationderVariablenalsextern Deklaration: extern int debug_level; n DasbedeutetfürdenCompiler: “irgendwoexistierteineVariabledebug_level vomTypint, aberderSpeicherdafürliegtnichthier;derLinkerkümmertsich umdiekorrekteEinbindung!“ n dieVariablemussdannnatürlicheinmalineinerder.cpp-Dateiendefiniert (angelegtundinitialisiert)werden thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 57 WeiteresBeispiel: Lösungmitextern n KorrekteVariante:dieVariabledebug_level wirdeinmalineinemHeader alsextern deklariert,imentsprechendenC++-Filedefiniert(imSpeicher angelegt). /* debug.h */ extern int debug_level; … /* test.cpp */ #include "debug.h" … /* debug.cpp */ /* otherfile.cpp */ #include "debug.h" Int debug_level = 3; … #include "debug.h" … thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 58 Namensbereiche n n n engl.namespace BeimEinbindenvonHeader-Dateienwerdendiedarin deklariertenglobalenBezeichnerindenaktuellen Programmkontexteingefügt. DaskannNamenskollisionenführen,wenndieBezeichner bereitsvergebensind. DiesistinsbesonderedanneinProblem,wennder ProgrammiereraufdieNamensgebungkeinenEinflusshat. n z.B.beiVerwendungzweierkollidierenderexterner(third-party) Bibliotheken thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 59 Namensbereiche n Lösung:namespace-Mechanismus n Syntax: (ii) namespace <namespace-Name> { // Member-Deklaration bzw. Definition } n NamespaceMemberskönnenVariablen,Typen,Funktionund andereNamensbereichesein. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 60 ZugriffaufNamensbereich n n n Membersinnerhalbeinesnamespace werdenwiegewohnt angesprochen. VonausserhalbwirddurchdenqualifiziertenNamendes namespace Memberszugegriffen. QualifizierterName(engl.fully qualified name) <namespace-Name>::<Member> n Beispiel: // std ist der Namensbereich der Standard-Bibliothek std::cout << "some text " << std::endl; thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 61 Dieusing-Anweisung n n n Eskannsehrlästigwerden,häufigbenutztenamespace MembersbeijederVerwendungkomplettzuqualifizieren. InnerhalbeinesGültigkeitsbereicheskanndieusingAnweisungdenZugrifflockern. Beispiel: using <namespace-Name>::<Member>; oder using <namespace-Name>; // alle Member des Namensbereich thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 62 Namensbereiche:Beispiel #include <iostream> namespace MyStruct { struct Y { static int x; }; int Y.x = 13; } namespace std { void newFunction (void) {} // in namespace von iostream einfügen. } int x = 10; int main () { using std::cout; using std::endl; NeuerNamensbereichMyStruct // Zugriff namespace-Struct MyStruct::Y var1; // Zugriff benutzen std::newFunction(); ErweiterungdesNamensbereichesstd // Öffne neuen Gültigkeitsber. { double x = 3.1415; cout << x; cout << ::x; // -> Pi // -> 10 } cout << MyStruct::Y.x << endl; } thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 K03 C++Einführung 1. 2. 3. 4. 5. 6. Allgemeines Entwicklungsprozess GültigkeitsbereicheundNamespaces Prozedur-/Funktionsaufrufe,Inlining, Default-Argumente ElementareTypenundStrukturen VergleichJava/C++ thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 64 WaspassiertbeiFunktionsaufrufen? int min(int a, int b) { if (a < b) return a; return b; } 1. 2. ParameteraufdemStack ablegen,inkl.Platzfür Rückgabewert,fallsvorhanden. Rücksprungadresseaufdem Stack ablegen. top int main() { int a = 42; int b = 137; // addr1 std::cout << min(a, b) << endl; return 0; } t-2 addr1 retur n a t-3 b t-1 3. 4. 5. 6. 7. SprungzurFunktionmin. Funktionausführen. RücksprunghinterdenAufruf. ParametervomStack nehmen. NächsteAnweisung. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 65 Inline-FunktioneninC++ inline int min(int a, int b) { if(a < b) return a; return b; // (a < b ? a : b) } int main() { int a = 42; int b = 137; HäufigeAufrufevon„kleinen“Funktionen beeinträchtigtdasLaufzeitverhalten: • SicherungderRücksprungadresse • Objektekopieren/erzeugen • Hin-/Rücksprung DeshalbkannmanFunktionenals inline definieren. std::cout << min(a,b) << endl; return 0; } Damin() alsinline definiertist,wird eineKopiederFunktionvomCompiler andieseStelleeingesetzt. std::cout << (a < b ? a : b) <<endl; thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 66 Verwendungvon Inline-Funktionen/- Methoden Inline-Funktionenbzw.-Methodenwerdenverwendet,wenn… n …diesekurz sindund n …diese(sehr)häufigaufgerufenwerden. Vorteil: DasProgrammkanneffizienter(schneller)werden. Nachteil: DasausführbareProgrammwirdgrösser(durch Codevervielfältigung). thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 67 GlobaleFunktioneninC++ n InC++könnenFunktionenglobal (ausserhalbvonKlassen)definiert werden.SolcheFunktionengehörennicht zueinerbestimmtenKlasse– siestelleninderRegelgenerellanwendbareAlgorithmenzurVerfügung. float square(float x); // function declaration ... float square(float x) { // function definition return x*x; } ... int main(int argc, char** argv) { float f = 5.0; std::cout << "The square of " << f << " is " << square(f); } thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 68 Default-ArgumenteinC++ n InC++könnenFunktionenDefault-Argumente besitzen float pow(float base, int exp=2); // function declaration ... float pow(float base, int exp) { // function definition if (exp == 0) return 1; for (int i=1; i < exp; ++i) base *= base; return base; } ... int main(int argc, char** argv) { pow(5); pow(5, 3); } // return 25 // return 125 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 K03 C++Einführung 1. 2. 3. 4. 5. 6. Allgemeines Entwicklungsprozess GültigkeitsbereicheundNamespaces Prozedur-/Funktionsaufrufe,Inlining, Default-Argumente ElementareTypenundStrukturen VergleichJava/C++ thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 70 DasTypsystem inC++ Elementare Datentypen Strukturen enum struct union Ganzzahlig char short Adressen Referenzen class array Zeiger Gleitkommazahlen bool int long float double long double thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 71 ElementareDatentypeninC++ Typ Nurbedingt portabel! typ.Speicherplatz- Wertemancher TypenabhängigvonWortbreite Wertebereich 1Byte -128bis+127 unsigned char 1Byte 0bis+255(ASCII) wchar_t 2byte 0bis+65'535(Unicode) 4Byte(inderRegel) -2'147'483'648bis+2'147'483'647 unsigned int 4Byte(inderRegel) +0bis+4294967295 short 2Byte -32'768bis+32'767 unsigned short 2Byte 0bis+65'535 long 8byte unsigned long 8byte –9'223'372'036'854'775'808bis +9'223'372'036'854'775'807 0bis+18'446'744'073'709'551'615 char int MitHilfedesOperatorssizeof kannmandenSpeicherbedarfvonVariablenbzw. allenArtenvonDatentypenbestimmen,alsonichtnurvonelementaren. Beispiele: sizeof (char); /* liefert 1 */ short myShort; sizeof (myShort) /* liefert 2 */ thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 72 C++11(undC11):<stdint.h><cstdint> PortableTypen: Vorzeichenbehaftet Vorzeichenlos Beschreibung intmax_t int8_t int16_t int32_t int64_t int_least8_t int_least16_t int_least32_t int_least64_t int_fast8_t int_fast16_t int_fast32_t int_fast64_t MaximalvonderZielplattformunterstützteBreite. uintmax_t uint8_t uint16_t uint32_t uint64_t uint_least8_t uint_least16_t uint_least32_t uint_least64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t 1)Beispiel:64Bit-Plattform: Genau8,16,32,64Bitbreit. JenachZielplattformnichtdefiniert,wennTypmit dieserBreitenichtexistiert. Mindestens8,16,32,64Bitbreit. KompaktesterTyp,dermind.n Bitbreitist; praktischmeistidentischmitint*_t bzw. uint*_t Mindestens8,16,32,64Bitbreit. WennbreitererTypbesser vonZielplattform unterstütztwird,dannwirddieserbenutzt.1) uinf_fast16 // angefordert à uint64_t // tatsächlich thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 50 KlassischeC-Strings n n C-StringssindäquivalentzuArraysof char Endenimmermit'\0' – mansagtsiesind 0-terminiert. char a[5] = "abcd"; a[0] == 'a' a[4] == '\0' n 'a' 'b' 'c' 'd' '\0' a sizeof("abcd") == 5; BeiderVerwendungklassischerC-StringssindeinigeDetailszu berücksichtigen: n n n 0-Terminierung Speicherallokation separateFunktionenfürSuche,Kopie,Teilstrings,etc ...in<string.h> thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 50 C++-Strings n DieC++StandardbibliothekbeinhaltetKlassestd::string #include <string> using namespace std; // Achtung: kein .h // Programmierer sind schreibfaul string text1 = "A nice day"; // Die klassische Deklaration string text2("A nice day"); // Äquivalent via Konstruktor string copy = text1; // Erzeugen einer Kopie cout << "Text: " << copy; // Ausgabe via C++ iostream // Konvertierung in C-sytle string ist möglich, aber // const verhindert, dass auf diesem Weg Daten verändert // werden können const char* text_p = copy.c_str(); text_p[0] = 'X'; // Fehler ! thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 50 Strings:Zeichensatz&Kodierung engl.charset &character encoding n n EinZeichensatz isteinenichtleere,endlicheMengeanZeichen. DieKodierung isteineAbbildungderZeicheneinesZeichensatzesauf üblicherweiseGanzahlen(zurRepräsentationdieserimSpeicher). ♧1 ^ Zeichensatz n n 𝛺 Z 0 1 0 1 1 0 1 0 ૱ ö 1 1 1 1 0 1 1 0 ∞ ? ✤ ß д a @ ... Kodierung InternationaleStandardswieASCII (1963),EBCDIC (1964),ISO8859 (1986),Unicode (1991)definiereneinerseitseinenZeichensatzund andererseitsein- odermehrereverschiedeneKodierungen. BeideBegriffewerdenhäufigvermischtodersynonymverwandt, sindaberstriktgenommennichtdasselbe. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 76 Strukturen– struct n StrukturenfassenlogischzusammengehörendeDatenzusammen,z.B.: struct student { int id; char name[80]; }; n Structuremembers FürdenEntwickler n n n Structuretag id undname gehörennunzusammen struct student erzeugteingemeinsamesDatenfeld FürdenCompiler n n id undname liegen„nebeneinander“ imSpeicher struct student isteinkomplexerDatentyp,deranFunktionen übergebenwerdenkann thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 77 Syntax&Verwendungvonstruct Syntax einerC-Struktur Definition(undDeklaration) struct [name] { <type> field1; <type> field2; … } [instance list]; struct Foo foo; struct point { int a; double b; } objct1, objct2; struct point objct3 = {1, 3.12} Beispieldeklaration: struct Foo { int field1; char field2; }; Datenzugriff: foo.field1; “ZugriffaufFeldfield1 derInstanzfoo derstruct Foo” thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 78 Forward-Declaration vonstruct n Problem:wiedeklariertmandiefolgendenbeidenstructs? struct T int y int x int x S *s T *t Lösung:Forward-Deklaration Vorgehensweisefunktioniertnurfür. TypenderenGrösseschonbekanntist (z.B.ZeigerundMethoden). AnalogeVorgehensweiseauchbei Klassen. struct S int y struct S; struct T { … S *s; … }; struct S { … T *t; … }; thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 79 Speicherausrichtung(engl.alignment) n CompilerrichtetMembereinerStrukturimSpeicheran vordefiniertenGrenzenaus*: n z.B.amWortanfang:wennsizeof(t) mod w != 0 (t istTyp,w Wortbreite inBytes)dannwerdenLückeneingefügt(engl.padding). struct foo { char a; int b; char c; } x; n n n 32bit =4bytes 1000 a L c b 1004 1008 ü c L ü k e x 42.1 c k e Nachteil:EsgehtSpeicherplatzverloren. Vorteil:schnellerSpeicherzugriffdaoptimaldurchHardwareunterstützt. MancheCPUsunterstützennichtausgerichteteAnordnung,aber: n n LangsamerwennmehralseinSpeicherzugriffund/oderCachemiss. JenachHardwarekeinatomaresLesenbeimehrerenSpeicherzugriffen. *Detailssiehez.B.:http://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 80 Aufzählungen– enum n EineAufzählungisteinselbstdefinierterganzzahligerTypmit Schlüsselwortenum enum PrimaryColors { RED = 2, GREEN, BLUE }; n n n PrimaryColors color = GREEN; switch(color) { case RED: ... case GREEN: } Default:ErsterWert(RED)wirdmit0 initialisiert JederweitereKonstantehateinenumeinserhöhtenWertzum Vorgänger MankannaberauchdenerstenWertbeliebigwählen(RED = 2) thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 81 Syntaxvonenum Deklaration enum name { OptionName [= int], OptionName [= int], … } [instance list]; Definition enum Color { RED = -3, GREEN = 4, BLUE = 12 } color, *color_ptr; enum Color c; void drawCircle (enum Color c); Alle Werte können aber auch explizit vorgegeben werden Zeigervariable: Variable, die im Speicher auf eine Speicherstelle verweist, die einen Wert vom Typ Color beinhaltet. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 82 Unions – union n n StrukturbeideralleMemberandergleichenAdressebeginnen. Anwendungsfälle: n n SpeicherbereichdenmanmitWertenverschiedenerDatentypenbelegen will;z.B.KnoteninBaumderWertevomTypint oder double enthalten kann;d.h.Wertebereichist:int È double Eherselten:UminterpretationvonDaten union foo { int i; // 4 bytes double d; // 8 bytes } x; x.i int x.d int = y = z 3; = x.i; // y = 3 3.5; = x.i; // z = ? niederwertige32bits von3.5 interpretiertals32-bitInteger n Grösse einesUnionimSpeicherentsprichtGrösse seinesgrössten Member;imBeispiel:sizeof(x) = 8 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 83 Zusammenfsg.syntaktischerVarianten 1. Deklarationbenannte Struktur/Union/Enum: struct union enum name { /* ... */ }; 2. Deklarationanonyme Struktur/Union/Enum undDefinitionVariable(n)diesesTyps: struct union enum { /* ... */ } var_1, ..., var_n; 3. DeklarationbenannteStruktur/Union/Enum undDefinitionVariable(n)diesesTyps: struct union enum name { /* ... */ } var_1, ..., var_n; 4. Variablendefinition(en)einerzuvordeklariertenStruktur/Union/Enum: struct union enum name var_1, ..., var_n; thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 84 Schlüsselworttypedef n (i) Typedef bietetdieMöglichkeit,TypeneinenneuenNamenzugeben unsigned char mybyte; typedef unsigned char BYTE; BYTE mybyte; n n n BYTE istnuneinAlias fürunsigned char BeideDefinitionenvonmybyte sindnunäquivalentfürden Compiler Vorteiledertypdef Definition: n n Aussagekräftiger(Lesbarkeit) MaschinenabhängigeTypenkönnenisoliertwerden.BeiderPortierung mussnurderAlias„umgehangen“werden. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 85 Schlüsselworttypedef (ii) AnwendungaufStrukturen: struct Student { int id; char name[80]; }; typedef struct { int id; char name[80]; } STUDENT; struct Student st; STUDENT st; thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 86 Schlüsselworttypedef (iii) Vorteil n n MankannschnellaneinerStelleimCodedenTypeeiner bestimmtenVariablenändern. WirdhäufiginVerbindungmitstruct verwendet struct point { int a; double b; }; typedef struct point { int a; double b; } POINT; struct point objct2; POINT objct2; int normalNumber; int smallNumber; typedef int MYINT int normalNumber; MYINT smallNumber; int normalNumber; short smallNumber; typedef short MYINT int normalNumber; MYINT smallNumber; thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 87 Schlüsselworttypedef n (iv) DieLesbarkeiteinesProgrammswirddurchtypedef verbessert, vorallembeikomplexenDatentypen,z.B.Funktionszeigern: char* (*search)(float, int); search isteinZeigeraufeineFunktion,diezweiEingabeParametervomTypfloat undint besitztunddieeinenZeiger aufchar liefert (spätermehrüberZeigerinC++) typedef char* (*PTR_TO_FUNC) (float, int); Besser(kürzer): PTR_TO_FUNC search; thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 K03 C++Einführung 1. 2. 3. 4. 5. 6. Allgemeines Entwicklungsprozess GültigkeitsbereicheundNamespaces Prozedur-/Funktionsaufrufe,Inlining, Default-Argumente ElementareTypenundStrukturen VergleichJava/C++ thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 89 ElementareDatentypeninJava/C++ ElementareDatentypen inJava ElementareDatentypen inC++ n boolean n bool n byte n (unsigned) char n char n wchar_t n short n (unsigned) short n int n (unsigned) int n long n (unsigned) long n float n float n double n double n long double thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 90 VergleichJava/C++– Zuweisungen InJava istdasVerhaltenvon elementarenDatentypenund Objektenunterschiedlich InC++ istdasVerhaltenvon elementarenDatentypenund Objektenidentisch Java C++ inta=0; //Creationofaninteger intb=a; //bholdsacopy ofa b=42; //onlybischanged Bodyx; //noobjectcreation Bodyy =x; //y holds areference to x y.setVol(42); //yandxarechanged = = = ≠ ≠ ≠ int a=0; //Creation of aninteger int b=a; //bholds acopy of a b=42; //onlybischanged Bodyx; //theobjectxiscreated Bodyy =x; //y holds acopy of x y.setVol(42); //onlyyischanged thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 91 VergleichJava/C++― Referenzen InC++ gibtesdieMöglichkeit,explizitReferenzenzubenutzen― damitverhaltensichdannObjektewieObjekteinJava Java C++ Bodyy =x; //y holds a //reference to x = Body&y =x; //y holds a //reference to x y.setVol(42); //y and xare //changed = y.setVol(42); //y and xare //changed thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 92 Vergl.Java/C++― Funktionsaufrufe Funktions-DeklarationinJava Funktions-DeklarationinC++ Java C++ voidf1(int a) { a=42; } //aisacopy voidf2(Bodyx) { x.setVol(42); } //xisareference //Call f1(b); //bisnotmodified f2(y); //yismodified = voidf1(int a)//aisacopy { a=42; } ≠ voidf2(Bodyx)//xisacopy { x.setVol(42); } = ≠ //Call f1(b); //bisnotmodified f2(y); //yisnotmodified thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 93 Vergl.Java/C++― CallbyReference Funktions-DeklarationinJava Funktions-DeklarationinC++ Java C++ voidf2(Bodyx)//xisareference { x.setVol(42); } //Call f2(y); //yismodified = = voidf2(Body&x)//xisareference { x.setVol(42); } //Call f2(y); thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf //yismodified 24.März2017 94 VergleichJava/C++― Referenz Achtung: InC++kannmaneineReferenzaufeinObjekt nachderErzeugungnichtmehrändern Java C++ Bodya; Bodya; Bodyb; Bodyb; Bodyc=a;//creferstoa c=b; //now,c //referstob = ≠ Body&c=a;//creferstoa c=b; //biscopiedtoc //(whichisa) Body&d; //ERROR! dpoints //nowhere InC++isteineReferenzeinandererName(“Aliasname”)füreinbereitsexistierendes Objekt. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017 95 VergleichJava/C++– Ausführung C++ n Java Compiler:Quelltextwirdkompiliert (= übersetztinMaschinencode): + OptimaleLeistungmöglich. - WenndasProgrammaufunterschiedlichenBetriebssystemen (Linux,Windows,Mac,...)oder Architekturen(Sparc,ARM,X86) laufensoll,dannmussmanauch unterschiedlicheVarianten verwalten. § Interpreter/Just-in-timeCompiler:Java Byte-CodeistGrundlagederAusführung durchdieJavaVirtualMachine: + DerByte-Codekann(ohneweiteres) aufallenArchitekturenausgeführt werden,fürdieeineJVMverfügbarist. + ModerneJVMshabenJust-in-time Compiler:wirdByte-Codeoftgenug ausgeführt,dannwirderzurLaufzeit kompiliertunddanachalsMaschinencode ausgeführtà optimale Leistung nacheinergewissenLaufzeit. - OverheaddurchSpeicherverwaltung undgeprüfteSpeicherzugriffe. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/03-c++-einfuehrung.pdf 24.März2017