Von Java nach C++ Frank Weichert Lehrstuhl Informatik VII Technische Universität Dortmund http://ls7-www.cs.uni-.de Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 1
Übersicht Einleitung Literatur Vergleich zwischen C++ und Java Klassen in C++ Übersetzungsprozess von C++-Programmen Programmieren in Visual Studio Ausgewählte C++-Konzepte Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 2
Einleitung C makes it easy to shoot yourself in the foot, C++ makes it harder, but when you do, it blows away your whole leg. (Bjarne Stroustrup) Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 3
Literatur Die C++-Programmiersprache, Bjarne Stroustrup, Addison-Wesley Visual C++, Frank Budszuhn, Addison-Wesley Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 4
C++ vs. Java Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 5
C++ vs. Java typisches Programm #include <iostreams.h> int main() { return 0; } import java.awt.*; class Test{ public static void main(string[] argv){ } } Dateinamen beliebig, Konvention *.cpp, *.h <Klassenname>.java generierter Code - Maschinencode - plattformabhängig - *.exe - Java-Byte-Code - plattformunabhängig - *.class Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 6
C++ vs. Java bedingte Anweisungen, Schleifen, Verbundanweisungen, identisch Funktionen globale Funktionen möglich Felder int a[4]; int a[] = {1,2,3}; keine Überprüfung auf Array-Grenzen Konstanten const double pi=3.14; identisch Methoden müssen in einer Klasse stehen int a[] = new int[4]; int a[] = {1,2,3}; Felder sind Objekte, Überprüfung auf Array-Grenzen final double pi=3.14; Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 7
C++ vs. Java (Variablen-) Deklaration keine Default-Werte int a[4]; Default-Werte int a[] = new a[4]; Speicherverwaltung durch den Programmierenden automatisch durch den Garbage Collector Eingabe- und Ausgabeanweisungen cin >> x; cout << x; x=iohelp.read(); System.out.println(x); Boolescher Datentyp bool boolean Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 8
C++ vs. Java Type-Casting (explizite Konvertierung) a) (Typ) Ausdruck in C++ und Java erlaubt Beispiel: int a=3; double b=(double) a / 2; // b = 1.5 b) Typ (Ausdruck) nur in C++ erlaubt Beispiel: int a=3; double b= double(a) / 2; // b = 1.5 Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 9
C++ vs. Java Zusätzliche Java-Funktionalität Automatische Speicherverwaltung Code ist (direkt) systemportabel Strings und Felder Applets Multitasking durch Thread-Modell Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 10
C++ vs. Java Zusätzliche C++-Funktionalität (1) Zeiger (Pointer) Kontrolle des Memory Management Templates Operator-Overloading Mehrfachvererbung Präprozessor Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 11
C++ vs. Java Zusätzliche C++-Funktionalität (2) Einschränkung des Wertebereichs in C++ per unsigned möglich z.b. int: -2 31 bis 2 31 1 unsigned int: 0 bis 2 32 1 Symbolische Konstanten Präprozessorbefehl, erkennbar am # -Zeichen #define PI=3.14 (kein ; am Zeilenende) Typdeklaration Definiert neuen Namen für einen Datentyp typedef int Index; Index a=3; Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 12
Ein einfaches Programm - Quellcodes Java: class BV{ } public static void main(string[] argv){ System.out.println "C++ in der Bildverarbeitung!"; } C++: #include <iostream> using namespace std; int main(int argc){ cout << "C++ in der Bildverarbeitung!"; return 0; } Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 13
Ein einfaches Programm - Übersetzen Java: Dateiname: BV.java Übersetzen: javac BV.java Ausführen: java BV (Java Byte-Code) (Java Virtual Machine) C++: Dateiname: BV.cpp Übersetzen: cl /c BV.cpp Linken: link BV.obj cl BV.cpp Ausführen: BV Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 14
Klassen in C++ Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 15
Klassen in C++ Klassen in C++ = Deklaration + Implementierung Headerdatei (.h) Implementationsdatei (.cpp) Studierende.h: class Studierende{ }; Studierende.cpp: #include "Studierende.h" Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 16
Klassen in C++: Aufbau der Headerdatei Studierende.h: class Studierende{ Konstruktor Destruktor Methoden Attribute public: Studierende(); ~Studierende(); void setzematrikelnummer(int nummer); int gibmatrikelnummer(); private: int matrikelnummer; }; Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 17
Klassen in C++: Aufbau der Headerdatei Spezifizierung einer Klasse mit class Klassen sind immer public Konstruktoren und Destruktoren Konstruktoren: Instanziierung von Objekten Destruktoren: Löschen von instanziierten Objekten (~ vorangestellt) Deklaration von Methoden und Variablen (Instanz-) Variablen dürfen bei der Deklaration nicht initialisiert werden Modifier werden nicht separat spezifiziert Klassendefinition wird mit Semikolon beendet Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 18
Klassen in C++: Aufbau der Implementationsdatei Einbinden der Headerdatei mit include Durch den Klassennamen und dem Bereichsoperator :: wird die Zugehörigkeit zur Klasse gekennzeichnet Studierende.cpp: #include "Studierende.h" Studierende::Studierende(){} Studierende::~Studierende(){} void Studierende::setzeMatrikelnummer(int nummer){ matrikelnummer = nummer; } int Studierende::gibMatrikelnummer(){ return matrikelnummer; } Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 19
Klassen in C++: Aufbau der Implementationsdatei Präprozessoranweisung #include "Studierende.h bindet Headerdatei ein. Nennung von Fully Qualified Names z.b.: Studierende::Studierende() :: wird als Bereichsoperator (Scope Operator) bezeichnet inline-spezifikation möglich z.b.: inline int Studierende::gibMatrikelnummer(){ return matrikelnummer; } Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 20
Übersetzungsprozess von C++-Programmen Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 21
Übersetzen von C++-Programmen Übersetzungsprozess besteht aus drei Komponenten 1. Präprozessor: Vorverarbeitung des Quellcodes 2. Compiler: Überführt Quellcode in Objektcode 3. Linker: Fasst alle Objektdateien zu einem ausführbaren Programm zusammen Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 22
Übersetzen von C++-Programmen Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 23
Übersetzen von C++-Programmen Präprozessor Präprozessorbefehle beginnen mit dem #-Zeichen Sucht im Quellcode nach speziellen Befehlen, z.b. - #include einbinden von Headerdateien a) <name> Standard Libraries aus Systemverzeichnis z.b.: #include <iostream> b) name eigene Dateien aus Projektverzeichnis z.b.: #include "Studierende.h" -> Problem: mehrfache Deklarationen - #define führt textuelle Ersetzungen (Konstanten) aus. z.b.: #define pi 3.14 - #ifdef, #ifndef, Konditionales Kompilieren z.b.: #ifdef DEBUG #endif Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 24
Übersetzen von C++-Programmen Präprozessor -> Problem: mehrfache Deklarationen Lösung: Headerdatei um konditionalen Kopf erweitern z.b.: Studierende.h: #ifndef STUDIERENDE_H #define STUDIERENDE_H class Studierende{ }; #endif Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 25
Übersetzen von C++-Programmen Compiler Generiert aus dem vom Präprozessor vorverarbeiteten Quellcode den Objektcode. Maschinennahe Objektcodedatei kann noch offene Aufrufe enthalten und nicht ausgeführt werden. Überprüfung auf syntaktische Korrektheit - Fehlermeldungen z.b.: error C2065: 'h': nichtdeklarierter Bezeichner - Warnungen z.b.: warning C4244: 'Initialisierung': Konvertierung von 'double' in 'int', möglicher Datenverlust Objektcode wird nur erzeugt, sofern keine Fehler aufgetreten sind. Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 26
Übersetzen von C++-Programmen Linker Generiert (vollständig) ausführbares Programm Fasst die - Objektdateien des Projektes, - Code aus Standard Libraries und - zusätzliche Libraries zusammen Zwei mögliche Link-Modi - statisch - dynamisch Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 27
Programmieren in Visual Studio Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 28
C++-Programm mit Visual Studio Neues Projekt anlegen: Datei -> Neu -> Projekt Projekttyp festlegen Projektnamen und Verzeichnis auswählen Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 29
C++-Programm mit Visual Studio Initiales Arbeitsfenster der Entwicklungsumgebung Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 30
C++-Programm mit Visual Studio Klasse hinzufügen (Header- und Implementationsdatei) Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 31
C++-Programm mit Visual Studio Typ der Klasse auswählen, die hinzugefügt werden soll Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 32
C++-Programm mit Visual Studio Klassennamen festlegen Modifikator und Basisklasse (optional) bestimmen Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 33
C++-Programm mit Visual Studio Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 34
C++-Programm mit Visual Studio Ausführbares Programm erstellen - Kompilieren (Strg+F7) - Programm ausführen (Strg+F5) - Programm unter Debugger ausführen (F5) Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 35
C++-Programm mit Visual Studio Dateitypen von Visual-Studio Extension *.cpp *.h *.exe *.dsp *.dsw *.obj *.rc *.res C++-Quelldatei C++-Headerdatei Ausführbares Programm Bedeutung Informationen zum Projekt. Projekt kann über dsp- Datei geöffnet werden Informationen zum Arbeitsbereich. Dieser sollte auch über diese Datei geöffnet werden. Nicht eingebundene Kompilate (Objekt-Dateien) Ressourcen-Skriptdatei Binäre Ressourcendatei des Linkers Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 36
Ausgewählte C++-Konzepte Komplexe Datentypen Zeiger und Referenzen Vererbung STL Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 37
Komplexe Datentypen Benutzerdefinierter Datentyp mit eindeutigem Namen typedef struct{ double x, y, z; } vector3d; int main() { vector3d veca = {0.4, 4, 6.2}; vector3d vecb; vecb = veca; // vecb = {0.4, 4, 6.2} double a = veca.z; // a = 6.2 Zugriff auf Elemente mit. -Operator Bei Zuweisungen werden komplette Strukturen kopiert Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 38
Ausgewählte C++-Konzepte Komplexe Datentypen Zeiger und Referenzen Vererbung STL Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 39
Objekte instanziieren und löschen ProgrammStudierende.cpp: #include "Studierende.h" int main(int argc, char* argv[]){ Studierende* einstudent = new Studierende(); delete einstudent; } return 0; Instanziierung eines Objektes vom Typ Studierende Studierende*: Variablendeklaration einstudent: Zeiger auf Studierende new: Ruft Konstruktor auf und legt Objekt vom angegebenen Typ im Speicher an delete ruft Destruktor der Klasse auf und gibt den zuvor belegten Speicher wieder frei (kein Garbage Collector wie in Java) Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 40
Zeiger und Referenzen Anweisung: Studierende* einstudent = new Studierende(); Repräsentierung: 0x0000 0x1200 Studierende int matrikelnummer Speicher Studierende* einstudent = 0x1200 0xffff Klasseninstanz Zeiger Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 41
Zeiger und Referenzen Zeiger (Pointer): Variable, dessen Wert auf die Position (Speicheradresse) eines anderen Objektes zeigt. eigener Datentyp typisiert durch Zeichen * gekennzeichnet Beispiel: a) kein Zeiger: int a; b) mit Zeiger: int* a; Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 42
Zeiger und Referenzen Adresse Speicherstelle, die für ein Objekt zur Verfügung gestellt wird. Die Adresse wird bei der Objekt- Instanziierung und der damit verbundenen Bereitstellung des benötigten Speichers vergeben. Inhalt Wert (Daten), der für ein Objekt unter einer Adresse gespeichert wird. Initiale Belegung erfolgt durch den Konstruktor. Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 43
Zeiger und Referenzen Pointer: Pointer (Pointervariable) ist eine Variable in der eine Adresse gespeichert wird. Die Variable hat den identischen Typ wie die Variable, deren Adresse gespeichert wird. Dereferenzierungsoperator * : Zugriff auf den Wert, der in der Pointervariablen gespeicherten Adresse steht ( Wert, auf den der Pointer verweist ) Referenzoperator & : Liefert für eine Variable die zugehörige Speicheradresse Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 44
Zeiger und Referenzen Pointer-Deklaration Adresse Name int *iptr;??? 10012 10013 iptr 10014 Pointer-Deklaration und Initialisierung Adresse Name int *iptr=0; NULL 10012 10013 iptr 10014 Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 45
Zeiger und Referenzen Deklaration eines primitiven Datentyps Adresse Name 10824 int i=423; 423 10825 i 10826 Pointer-Initialisierung und Adressoperator Adresse Name int *iptr=0; iptr = &i; 10825 NULL 10012 10013 10014 iptr Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 46
Zeiger und Referenzen Vereinfachte grafische Repräsentierung Adresse Name 423 10824 10825 10826 i i 423 Adresse Name iptr 10825 10012 10013 10014 iptr Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 47
Zeiger und Referenzen Initialisierung von Pointern int a = 423; a 423 int b = 78; b 78 int *ptr_1 = &b; ptr_1 int *ptr_2 = ptr_1; ptr_2 int *ptr_3 = &a; ptr_3 Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 48
Zeiger und Referenzen Pointer Aliasing: Zwei Pointer enthalten dieselbe Adresse a 423 *ptr_1 = *ptr_3; ptr_2 = ptr_3; b ptr_1 ptr_2 423 78 ptr_3 Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 49
Zeiger und Referenzen Zeigervariablen können auch auf einen weiteren Zeiger verweisen Auch iteriete Pointer-Anwendungen sind möglich Jeder * -Operator im Ausdruck entspricht einer Dereferenzierung int a = 423; a 423 int *ptr = &a; ptr int **ptrptr = 0; ptrptr = &ptr; ptrptr NULL Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 50
Zeiger und Referenzen Anwendungsbeispiel #include <iostream> #include "Studierende.h" using namespace std; int main(int argc, char* argv[]){ Studierende* einstudent = new Studierende(); einstudent->setzematrikelnummer(88456); Studierende zweiterstudent; zweiterstudent.setzematrikelnummer(87393); Studierende* ptr_zweiterstudent = &zweiterstudent; cout << ptr_zweiterstudent << endl; Studierende* dritterstudent = NULL; dritterstudent->setzematrikelnummer(89263); delete einstudent; delete dritterstudent; return 0; } Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 51
Zeiger und Referenzen Zeiger einstudent, der auf Objekt vom Typ Studierende zeigt Über Operator -> (Dereferenzieren) Methode aufrufen ( es wird einem Zeiger gefolgt ) Studierende* einstudent = new Studierende(); einstudent->setzematrikelnummer(88456); zweiterstudent als (statische) Instanz Methodenaufruf für statische Instanzen über Punktoperator Studierende zweiterstudent; zweiterstudent.setzematrikelnummer(87393); Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 52
Zeiger und Referenzen Pointer auf statische Instanz über Referenzoperator & Studierende* ptr_zweiterstudent = &zweiterstudent; cout << ptr_zweiterstudent << endl; Zeiger für ein Objekt, der mit NULL initialisiert wird Methodenaufruf führt zu einem Laufzeitfehler (Exception) Studierende* dritterstudent = NULL; dritterstudent->setzematrikelnummer(89263); Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 53
Ausgewählte C++-Konzepte Komplexe Datentypen Zeiger und Referenzen Vererbung STL Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 54
Vererbung einfache Vererbung: Klasse Bachelor erbt von Klasse Studierende Vererbungsoperator : (entspricht extends in Java) Studierende Bachelor Studierende.h: class Studierende{ }; Bachelor.h: #include "studierende.h" class Bachelor : public Studierende{ public: Bachelor(); ~Bachelor(); }; Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 55
Vererbung Mehrfachvererbung: Klasse Bachelor erbt von Klassen Studierende und HiWi Studierende HiWi Bachelor Bachelor.h: #include "studierende.h" #include "HiWi.h" class Bachelor : public Studierende, public HiWi{ public: Bachelor(); ~Bachelor(); }; Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 56
Ausgewählte C++-Konzepte Komplexe Datentypen Zeiger und Referenzen Vererbung STL Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 57
STL Standard-Template-Library (kurz STL) Vordefinierte Templates für viele Anwendungsbereiche STL gliedert sich in drei Teilbereiche auf: 1.) Container: Speicherstrukturen, z.b. Bäume, Listen, 2.) Algorithmen: Operatoren für Container-Klassen, z.b. Sortieren einer Liste 3.) Iteratoren: Traversierungsoperatoren für Container-Klassen Einbinden der Headerdateien per include ohne Endung.h Beispiel: #include<list> Notwendigkeit des korrekten Namespace, geschieht durch die Anweisung using namespace std; Infos zur STL: Silicon Graphics Inc., http://www.sgi.com/tech/stl Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 58
STL Anwendungsbeispiel: #include <list> #include "Studierende.h" using namespace std; int main(int argc, char* argv[]){ Studierende* student1 = new Studierende(); Studierende* student2 = new Studierende(); } list<studierende*> listestudierende; listestudierende.push_back(student1); listestudierende.push_back(student1); Einbinden der Headerdatei für die Container-Klasse list. Instanziierung einer Liste listestudierende, die Zeiger auf Objekte vom Typ Studierende speichern kann. Methode push_back fügt Zeiger auf Typ Studierende der Liste an. Vorkurs Informatik, Von Java nach C++, LS VII, TU Dortmund, WS 2009/2010 59