C++ - eine Einführung Wilfried Elmenreich Folien basieren auf dem Vortrag “From Java to C++” von Ulrik Schröder Inhalt des Vortrags • Voraussetzungen • Unterschiede C++ / Java • C++ Grundkonzepte: Operatoren, Schleifen, I/O • Klassenstruktur, Hauptprogramm • Entwicklungschritte eines C++ Programms • Softwaretipps für die Praxis Einführung in C++ 2 1 Meine Annahmen über Sie… • Sie kennen bereits die Grundelemente der Programmiersprache Java aus Einführung in das Programmieren: - Syntax - Konzept einer Compilersprache - Klassen und Objekte • Möglicherweise kennen Sie auch C • Sie wollen wissen wie man in C++ programmiert • Sie wollen wissen was den Unterschied zwischen Java und C++ ausmacht Einführung in C++ 3 Features in C++ welche Java nicht besitzt • • • • • • • • • • goto memory management: malloc, free structs and unions (Java verwendet hierfür nur classes) header files (*.h / *.cpp) global variables, functions (only methods) preprocessor, typedef and defines (static final) implicit type conversions operator overloading multiple inheritance (Java verwendet stattdessen interfaces) templates Einführung in C++ 4 2 Was C++ nicht bietet • • • • • • • • • • Standards built-in types, sequence of evaluation, ... Standard support für GUI programming – kein AWT, Swing, … Threads Networking Generators for documentation (javadoc) Reflection Garbage Collection Packages Machine (operating system) - independent object code – Advantage: Ad t optimized ti i d machine hi code d – Disadvantage: need compiler per platform and compilation for target Bibliotheken für oben genannte Funktionen existieren, sind aber nicht Teil der C++-Sprache oder der STL (Standard template Library), z.B. – QT – LEDA Einführung in C++ 5 Hauptunterschiede C++ - Java • A Aus Programmierersicht P i i ht – Memory management – Pointer • Aus Anwendersicht – Keine VM auf dem Zielsystem notwendig (eingebettete Systeme) – Mehr Kontrolle, z.B. beim Löschen von Objekten (bessere Laufzeitabschätzung für Echtzeitsysteme) – Bessere Performance (immer?) Einführung in C++ 6 3 Performance C++ vs. Java • Integerarithmetik: unentschieden • Floating Point: C++ ca. 30% schneller • FileIO: C++ ist bis zu 35 mal schneller • Objekthandling: Java ist etwa doppelt so schnell 4000 3500 3000 2500 Java C++ 2000 1500 1000 500 0 1 2 3 4 5 Einführung in C++ 7 Variablendeklaration und Initialisierung • • • Variablentypen: bool char bool, char, short short, (unsigned) int int, long long, float float, double Klassenvariablen mittels Schlüsselwort static Variablen müssen mit einem Buchstaben oder mit „_“ beginnen • • Initialisierung innerhalb der Definition möglich Deklaration ist zwingend vor der ersten Benutzung erforderlich int i float i = i int j • = x + = 3; = 10.0; 1; i; Deklaration von mehreren Variablen eines Typs ist direkt möglich (wie in C) Beispiel: int i = 3; float x=10.0, y=1.23; Einführung in C++ 8 4 Operatoren • Arithmetische Operatoren: + • Vergleich < • Logik ! - * / % pow(x,y) ( ) ++ -- <= > >= == != && || –0 entspricht false, ungleich 0 ist true • Bit Operatoren ~ & ^ | << >> –Shift-Operatoren lassen Vorzeichen unbeeinflusst Einführung in C++ 9 Zuweisungsoperatoren • Zuweisungsoperatoren wie in C x x x x x x x = y += y, x -= y *= y, x/= y %= y >>= n, x <<= n &= y, x |= y ^= y • ermöglicht kompakten Code Einführung in C++ 10 5 if else Ausdruck if (Bedingung) // Anweisung oder Block von Anweisungen else // Anweisung oder Block von Anweisungen • else-Teil optional • Bedingung kann ein beliebiger Ausdruck sein der einen numerischen Wert ergibt • Klammern sinnvoll um Fehlerquellen zu vermeiden • Vorsicht vor Seiteneffekten in Bedingung Einführung in C++ 11 Schleifen • while Schleife while (Bedingung) // Anweisung oder Block von Anweisungen • do-while Schleife do // Anweisung oder Block von Anweisungen while (Bedingung) auf jeden Fall 1 Durchlauf • for Schleife for (init-statement; test-expr; increment-expr) // Anweisung oder Block von Anweisungen • break springt aus der aktuellen (innersten) Schleife • continue springt in die nächste Iteration Einführung in C++ 12 6 Arrays • Sammlung von Elementen des gleichen Typs • Deklaration float x[100]; • Abrufen der Elemente x[0]; x[99]; // erstes Element // letzes Element • Initialisierung float x[3] = {1.1, 2.2, 3.3}; float Y[] = {1 {1.1, 1 1 1.2, 2 1 1.3}; 3}; • Mehrdimensionale Arrays float x[4][4]; int m[2][3] = { // Matrix {1, 2, 3} {4, 5, 6} }; Einführung in C++ 13 Einbindung von Programmbibliotheken • Einbinden von Programmbibliotheken über #include <headerfile> eines Wertes in in Grad Grad und Ausgabe Ausgabe der der Sinusfunktion Sinusfunktion • Beispiel: // Einlesen eines #include #include <iostream.h> <iostream.h> #include #include <math.h> <math.h> int int main() { float float angle; angle; cin >> angle; //// Winkel Winkel einlesen einlesen cout cout << sin(angle sin(angle * M_PI M_PI / 180.0 180.0 )) << << endl; //// M_PI M_PI ist ist in <math.h> definiert definiert return return 0; 0; }} • Innerhalb von cout << können Funktionen benutzt werden • Liste der verfügbaren Funktionen in math.h Einführung in C++ 14 7 Klassen und Objekte • Grundstruktur einer Klassendefinition class class Klassenname Klassenname {{ eineFunktion(..); eineFunktion(..); public: public: Klassenname(...); Klassenname(...); //// Konstruktor Konstruktor ~Klassenname(); ~Klassenname(); //// Destruktor Destruktor }; }; • Schlüsselwörter public, private, protected steuern Zugriff von außerhalb • Konstruktoren (bzw. Destruktoren) gibt es immer, aber man kodiert sie oft nicht explizit • Konstruktoren werden beim Erstellen eines Objektes dieser Klasse aufgerufen Klassenname k1(1,2); Einführung in C++ 15 Hauptprogramm •Nötig für alle Programme (wie in C) •Einfachstes Bespiel: int int main() main() //// Funktion Funktion fürs fürs OS (ohne (ohne Argument) Argument) { //// Anfang Anfang der der Funktion Funktion return return 0; 0; } //// Rückmeldung ans OS OS (OK) (OK) //// Ende Ende der der Funktion Funktion •Dateierweiterung: .C, .cc oder .cpp •Beispiel mit Ein/Ausgabe ## include include <iostream.h> int int main() main() { //// Variablendefinition Variablendefinition float float a, a, b, b, c; c; //// Eingabe Eingabe cin cin >> a >> bb >> >> cc ; //// Ausgabe Ausgabe cout cout << aa << << “, “, ”” << bb << “, “, ” << c << endl; return return 0; 0; }} Einführung in C++ 16 8 I/O in C++ • generic output stream wird mit << operator angesprochen • cout ist in <iostream> im Namespace std deklariert #include <iostream> using namespace std; ... std::cout << ... int main( ) { cout << "Hello!"; } // main( ) Deklarationen der Standardlibrary haben immer den namespace std! Einführung in C++ 17 I/O Klassenhierarchie • istream und ostream von ios abgeleitet • iostream mittels Mehrfachvererbung von istream und ostream abgeleitet ios istream ostream iostream cout cin cerr Einführung in C++ clog 18 9 I/O Formatierung - Zahlenbasis #include #include <iostream> <iostream> int int main( main(( )) {{ int int c; c; cout cout << << "Please "Please enter an integer value for variable variable c:\n c = "; cin cin >> >> c; c; cout cout << << "\toctal\tdecimal\thexadecimal\n" "\toctal\tdecimal\thexadecimal\n" << "\t0_" << "\t0_" << << oct oct << << cc << << << "\t" "\t" << dec dec << << cc << \t0x << << "\t0x" "\t0x" << hex hex << << cc << << endl; endl; return return 0; // "normal" end end of of execution execution }} // // main( main( )) Einführung in C++ 19 I/O Formatierung - Fließkommazahlen cout 42 cout ut << << 42.12345678 42 12345678 42.12345678 12345678 << << endl; endl; ndl; 42 1235 42.1235 cout.precision( cout.precision( 4 4 ); ); cout cout << << "precision: "precision: "" << << cout.precision( cout.precision( )) << << endl; endl; precision: 4 cout cout << << 42.12345678 42.12345678 << << endl; endl; 42.12 cout.setf(ios::fixed); cout cout.setf(ios::fixed); t setf(ios::fixed); tf(i fi d) cout cout << << "fixed: "fixed: "" << << 42.12345678 42.12345678 << << endl; Einführung in C++ 42.1234 20 10 I/O Formatierung – iomanip #include <iomanip> Definiert wird • Breite des Ausgabefeldes für das folgende Argument • Ausrichtung • Füllzeichen cout cout << << '|' '|' << << setw( setw( 10 10 )) <<"xxx" <<"xxx" <<'|' <<'|' << << endl; endl; | xxx| cout cout << << '|' '|' << << setw( setw( 10 10 )) << << setfill('*')<<"xxx" setfill('*')<<"xxx" <<'|' << endl; |*******xxx| cout << << '|' '|' << << setw( setw( 10 )) << << left left <<"xxx" <<"xxx" <<'|' <<'|' << << endl; |xxx*******| cout << << '|' '|' << << setw( setw( 10 )) << << internal internal <<"xxx" <<'|' <<'|' << << endl; endl; |****xxx***| cout << << '|' '|' << << setw( setw( 10 10 )) << << right right <<"xxx" <<"xxx" <<'|' <<'|' << << endl; endl; |*******xxx| Einführung in C++ 21 Formatierte Eingabe • Operatoren analog zu jenen bei der formatierten Ausgabe: /* formatted input / / input */ */ int int i;i; double double x; x; cout cout << << "Enter "Enter a hex hex value: value: "; "; cin >> hex >> i;i; ab cout << << "i "i == "" << ii << "" == 0x" 0x" << << hex hex << << i << << endl; endl; coutt << "; << "Enter "E "Enter t aa floating floating fl ti point point i t value: value: l ""; i = 171 = 0xab cin >> >> x; x; 123 123.456 cout << << "x "x == "" << xx << << endl; endl; 123456e-3 x=123.456000 Einführung in C++ 22 11 Java Entwicklungsschritte Editor $$javac javacClassName.java ClassName.java Java-Program Compiler $$java javaClassName ClassName Library classes Bytecode Bytecode Bytecode Bytecode Java Virtual Machine (JVM) ClassName.java e.g. Win e.g. Mac, Unix, Handy OS, ... ClassName.class via Internet Einführung in C++ 23 C++ Entwicklungsschritte Analyze, Analyze,check check consistency, consistency, generate generatecode code Editor $$ gcc gcc –c –c –Wall *.cpp *.cpp in DevC++ main.exe C++ source Compiler Link Linkfurther further classes classes $ gcc gcc –o –o main.exe main.exe *.o Object code Linker executable ClassName.cpp ClassName.h Processor libraries ClassName.o Object code Object code Object code Object code Non-standard ! execute, execute,test, test, debug debug Platform-dependent ! Einführung in C++ $ ./main.exe ./main.exe arg1 arg1 … 24 12 C++ Programmierzyklus iterative yedit – compile – link – run (test,debug) – cycle Editor Compiler Linker *.h *.h *.cpp *.cpp *.o *.o *.h *.h *.cpp *.cpp *.o *.o *.h *.h *.cpp *.cpp *.o *.o *.h *.h *.cpp *.cpp *.o *.o make *.exe *.exe declarations test test cases cases definitions Object Object files files in in libraries libraries *.h *.h Can also include global data and functions! Einführung in C++ 25 Trennung Deklaration & Definition • Deklaration (Struktur) in .h-Datei (Headerfile) • Definition (Implementierung) (Implementier ng) in .cpp-Datei cpp Datei • Bsp.: Association to class point.cpp #include “point.h“ returns new point point point::add( point v ) { Object return point( x + v.x, y + v.y ); } // point::add( ) Class based visibility (like Java) #ifndef __POINT_H__ #define __POINT_H__ Prevent multiple declarations class point { StdConstructor StdConstructor point( point( )) default values private: == == point( point( 00 )) == == point( point( 0, 0, 00 )) for arguments double x, y; public: point( double a=0, double b=0): x( a ), y( b ) { }; point add( point v ); }; // class point initialize #endif __POINT_H__ Einführung in C++ attributes 26 13 Beispielprojekt mit Modul point • Inkludieren des Headerfiles instead of Java toString( ) method point.cpp #include "point.h" point point::add( point v ) { return point( x + v.x, y + v.y ); } could have also been void point::print( ) { cout << "(" << x << "|" << y << ")"; } int main ( ) { main.cpp point i u(( 1.0 1 0 )), v(( -0.5, 05 4 4.2 2 )), w; w = u.add( v ); cout << "u = "; u.print( ); cout << endl; cout << "v = "; v.print( ); cout << endl; cout << "w = "; w.print( ); cout << endl; return 0; } // main( ) Einführung in C++ defined in point.cpp object bj t creation ti without ith t new using three different constructors uu == (1|0) (1|0) vv == (-0.5|4.2) (-0.5|4.2) ww == (0.5|4.2) (0.5|4.2) 27 Kompilieren und Linken • Jedes Modul separat kompilieren $ g++ –c –Wall –pedantic-error -ansi point.cpp point.o $ g++ –c –Wall –pedantic-error -ansi main.cpp main.o • Objektdateien linken $ gcc –o main main.o point.o main[.exe] • Ausführen des Programms – endlich! $ ./main Einführung in C++ 28 14 Auf ins Gefecht - womit • Gnu Compiler unter Linux/Unix oder cygwin: www.cygwin.org • Dev C++ g grafische Oberfläche für Windows: www.bloodshed.net • oder Eclipse: www.eclipse.org aber • Beispielabgabe muss korrekt auf dem System der Übung laufen! Einführung in C++ 29 Danke für die Aufmerksamkeit! Fragen, Kommentare, Wünsche? Einführung in C++ 30 15