Beruflich Dokumente
Kultur Dokumente
Martin Holzer
Lehrstuhl fr Algorithmik I u
April/Mai 2005
Einleitung
Uberblick Zielstellung
Vermittlung grundlegender Kenntnisse in C++ Gegenberstellung von Java und C++ u Voraussetzung: Kenntnis allgemeiner Programmierkonzepte:
Einleitung
C++ C
Java
Einleitung
Uberblick Frage
Einleitung
. . .
. . .
Einleitung
Uberblick Inhalt
Einleitung
Referenzen Referenzen
Thomas Willhalm: Von Java nach C++ http://i11www.ira.uka.de/teaching/scripts/sources/ java2c++.pdf Bjarne Stroustrup: The C++ Programming Language Addison-Wesley Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns Elements of Reusable Object-Oriented Software Addison-Wesley
Einleitung
Referenzen Online-Referenzen
The cplusplus.com Tutorial http://www.cplusplus.com/doc/tutorial/ Bruce Eckel: Thinking in C++ http://www.mindview.net/Books/TICPP/ ThinkingInCPP2e.html STL Programmers Guide http://www.sgi.com/tech/stl/
Java
C++
Quellcode
Kompiler
Bytecode
Entwicklung
Quellcode
Kompiler
Objektcode
Quellcode
Kompiler
Quellcode
Kompiler
Objektcode
Bibliothek
Entwicklung
g++ -c: Kompilieren -Wall: alle Warnungen einschalten -g: Debugging-Informationen Quelldatei -o Objektdatei: Ausgabedatei
Entwicklung
Entwicklungstool, unabhngig vom Compiler a Linker stellt fest, ob alle Programmteile vorhanden sind Entwickler muss vor Linken Aktualitt der Objektdateien a sicherstellen
Entwicklung
g++: Linken -Wall: alle Warnungen einschalten -g: Debugging-Informationen Objektdateien : Liste (leerzeichensepariert) von Objektdateien -o Zieldatei: Ausgabedatei
Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
Entwicklung
Zentrale Datei mit Regeln, d. h. Information, welche Objektdateien jeweils bentigt werden o make berprft an Hand des Zeitpunkts der letzten u u Dateinderung, welche Quelltexte kompiliert und welche a Objektdateien gelinkt werden mssen u Abhngigkeit kann beliebig kompliziert werden a
Entwicklung
make Syntax
Ziel: Regelname Abhngigkeiten : Liste (leerzeichensepariert) von a vorausgesetzten Dateien : Tabulator Befehl: Kommando zum Erstellen der Zieldatei
Entwicklung
make Beispiel
Makele myprog.o: myprog.cc g++ -c -Wall -g myprog.cc -o myprog.o datastruc.o: datastruc.cc g++ -c -Wall -g datastruc.cc -o datastruc.o myprog: myprog.o datastruc.o g++ -Wall -g myprog.o datastruc.o -o myprog
Entwicklung
make Arbeitsweise
Uberprfung der Aktualitt von myprog (Ziel jnger als u a u Objektdateien) Falls nicht aktuell (oder nicht vorhanden):
Evtl. Erzeugen von myprog.o bzw. datastruc.o Ausfhren des Link-Befehls der Regel myprog u
Entwicklung
CC = g++ FLAGS = -Wall -g myprog.o: myprog.cc $(CC) -c $(FLAGS) myprog.cc -o myprog.o datastruc.o: datastruc.cc $(CC) -c $(FLAGS) datastruc.cc -o datastruc.o myprog: myprog.o datastruc.o $(CC) $(FLAGS) myprog.o datastruc.o -o myprog Oram/Talbott: Managing Projects with make. OReilly & Associates, Inc.
Entwicklung
Welche grundstzlichen Merkmale hat eine Klasse? a Was ist ein Konstruktor? Was ist der Unterschied zwischen Deklaration und Denition?
Einfhrung u
Antworten
Klasse:
Kapselung von Attributen (Variablen) und Methoden (Funktionen), privat entlich, statisch o
Konstruktor:
Methode, die bei der Instanziierung aufgerufen wird Deklaration: Skelett festlegen Denition: Funktionalitt/ Inhalt festlegen a
Klassen
Klassen Syntax
Java
class Klassenname { private Var.-/Fkt.-Dekl.
C++
class Klassenname { private: priv. Var.-/Fkt.-Dekl. public: Konstruktor o . Var.-/Fkt.-Dekl. };
Klassen
Klassen
Beispiel
class Vektor { private: double myX, myY; public: Vektor(double x, double y) : myX(x), myY(y) {}; Vektor addiere(Vektor v) { return Vektor(myX+v.myX, myY+v.myY); } };
Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
Klassen
Hinweise
private: kann weggelassen werden (Variablen und Funktionen vor public: automatisch als privat deklariert). ; nach Klassendenition notwendig.
C++ : myX(x)
Klassen
Hinweise
Variablen sollten in Reihenfolge ihrer Deklaration initialisiert werden (sonst Warnung). Falls kein Konstruktor deniert: Standardkonstruktor (hat keine Parameter und ruft Standardkonstruktoren der Datenelemente auf). Falls eigener Konstruktor deniert ist, wird kein Standardkonstruktor deniert.
Klassen
Header
Die Header-Datei
Denition zu verarbeiten dauert relativ lange Von anderen Programmteilen wird nur Deklaration bentigt o = Deklaration und Denition getrennt verarbeiten Deklaration in sog. Header-Datei
Deklaration Definition Definition Deklaration
Header
Die Deklaration
vektor.h
class Vektor { double myX, myY; public: Vektor(double x, double y) : myX(x), myY(y) {}; Vektor addiere(Vektor v); };
Schnittstelle, Signatur
Java Interface
C++ Deklaration
Header
Die Denition
vektor.cc #include "vektor.h" Vektor Vektor::addiere(Vektor v) { return Vektor(myX+v.myX, myY+v.myY); }
C++ Klasse::Element
Header
Deklaration
Definition
Kompiler
Objektcode
Deklaration
Definition
Kompiler
Definition
Kompiler
Objektcode
Deklaration
Bibliothek
Header
CC = g++ FLAGS = -Wall -g myprog.o: myprog.cc datastruc.h $(CC) -c $(FLAGS) myprog.cc -o myprog.o datastruc.o: datastruc.cc $(CC) -c $(FLAGS) datastruc.cc -o datastruc.o myprog: myprog.o datastruc.o $(CC) $(FLAGS) myprog.o datastruc.o -o myprog
Compiler-Guards
Compiler-Guards
Compiler uberprft, ob Klassen- (Funktions-, Variablen-)Name u schon einmal deklariert wurde = sonst Fehlermeldung = Fehlermeldung, falls Header-Datei mehrfach eingebunden wird
Automatisierung? Compiler-Guards:
Denition einer Markierung, wenn Datei bearbeitet (eingebunden) wird
Compiler-Guards
Beispiel
vektor.h
#ifndef VEKTOR INC #define VEKTOR INC class Vektor { double myX, myY; public: Vektor(double x, double y) : myX(x), myY(y) {}; Vektor addiere(Vektor v); }; #endif
Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
Compiler-Guards
#include "Dateiname" Platziere Inhalt von Dateiname an diese Stelle. #include <Dateiname> Variante fr Systemdateien. u #ifndef MACRO Bearbeite nachfolgenden Code nur, wenn MACRO nicht deniert. #endif Ende der Bedingung. #define MACRO Deniere MACRO.
Ausgabe
Ausgabe Syntax
Java Ausgabe
System.out.println(String);
C++
std::cout << String << std::endl; int main() {} oder
Main
Ausgabe
Beispiel
#include <iostream> int main() { int a(5); int b(a+3); std::cout << "a ist " << a << " und b ist " << b << std::endl; return 0; }
Bezeichner Fragen
Welche Funktion haben Bezeichner (Qualier)? Welche Bezeichner haben Sie bereits kennengelernt? Welche Bedeutung hat eine static deklarierte Variable in Java?
Bezeichner
Einfhrung u Antworten
Zugriskontrolle etc.
Bisher kennengelernt:
private, public
Bezeichner
static nur Programmteilen bekannt, die Denition sehen Standard fr Variablen u static int abs(int i); besser: private Funktion einer Klasse
extern allen Programmteilen bekannt, die dazugelinkt werden Standard fr Funktionen u extern node array xpos; besser: als Parameter uberge ben
Bezeichner
Ubersicht static
statische Variable existiert nur einmal pro Klasse statische Funktion darf nur statische Variablen und Funktionen verwenden
Bezeichner
Bezeichner
Ubersicht inline
Bezeichner fr Funktionen u Hinweis an Compiler: kein Funktionsaufruf, sondern direktes Einfgen des Codes u Zeitersparnis Programmvergrerung o inline-Methode ist automatisch statisch Automatismus: Methode ist bei gleichzeitiger Deklaration und Denition inline deklariert
Bezeichner
Parameter Frage
Parameter
Einfhrung u Antwort
Werte-Parameter, Referenz-Parameter
Parameter
Parameterbergabe u Ubersicht
Werte-Parameter
funktion(double wert) { wert = 0.0; }
Referenz-Parameter
funktion(double& wert) { wert = 0.0; }
Parameter
Parameterbergabe u Hinweise
In C++ gibt es hier keine Unterscheidung zwischen eingebauten Typen und selbstdenierten Klassen. Java festgelegt C++ benutzerdeniert
Parameteru bergabe
Referenzparameter an unerwarteter Stelle knnen o schwer aufzusprende Fehler nach sich ziehen! u
Parameter
Parameterbergabe u const-Deklarationen
Syntax
Fkt(Typ const& Name)
Fkt() const
Parameter
Parameterbergabe u Hinweise
Konstante Funktionen fr Aufrufe von konstanten Klasu seninstanzen. Java
final double PI =
C++
const double PI(3.14159); double const PI(3.14159); std::string const STR("Hello World!"); oder
Konstanten
Parameter
Parameterbergabe u Beispiele
Parameter
#include <cmath> #include "vektor.h" double Vektor::norm() const { return sqrt(myX*myX + myY*myY); } . . . Vektor const meinVektor(1, 2); std::cout << meinVektor.norm() << std::endl; . . .
Parameter
Zweck: Instanziierung einer Klasse durch Referenz auf andere Instanz dieser Klasse Konstruktor mit konstanter Referenz als Parameter Standard-Kopierkonstruktor kopiert alle Datenelemente
Parameter
Kopierkonstruktor Beispiel
class Vektor { double myX, myY; public: Vektor(double x, double y) : myX(x), myY(y) {}; Vektor(Vektor const& v) : myX(v.myX), myY(v.myY) {}; Vektor addiere(Vektor v); };
Parameter
Kopierkonstruktor Beispiel
Werte-Parameter
double kontostand; kontostand = 1000.0; double einkommen(kontostand); einkommen = 0.0;
Referenz-Parameter
double kontostand; kontostand = 1000.0; double& einkommen(kontostand); einkommen = 0.0;
Speicherverwaltung Fragen
Was ist unter dem Gltigkeitsbereich (Scope) einer u Variablen zu verstehen? Wie wird in Java Speicherplatz fr ein Objekt angefordert? u
Speicherverwaltung
Einfhrung u Antworten
Gltigkeitsbereich: u
Speicherplatz anfordern:
new-Operator
Speicherverwaltung
Gltigkeit u Speicherfreigabe
Speicherfreigabe
Java Garbage-Collection
C++ sofort bei Verlassen des Gltigkeitsbereichs; dau vor evtl. Aufruf des Destruktors
Speicherverwaltung
Was tun, wenn Speicherbereich lnger bentigt wird? a o Zeiger/new/delete (s. u.)
Java new C++ lokal (Scope), new
Instanziierung
Speicherverwaltung
data
verkettete Listen
data data data
data
data
data
data
data
data
data
Speicherverwaltung
Zeiger Syntax
Semantik Zeigervariable Zeiger vom Typ Typ Adresse von Variable Inhalt von Zeiger
Speicherverwaltung
Zeiger Beispiel
// Fehler
Speicherverwaltung
Speicherverwaltung
Zeiger Beispiel
#include <string> int main() { int* zeiger1 = new int; string* zeiger2 = new string; short int* zeiger3 = new short int(42); double const* zeiger4 = new double const(3.14159); return 0; }
Speicherverwaltung
Zeiger Hinweise
Deklarationen von rechts nach links lesen! Konstanten (z. B. konstanter Zeiger) mssen initialisiert u werden.
Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
Speicherverwaltung
Speicherverwaltung
Zeiger Beispiel
int main() { int* zeiger1 = new int; double* zeiger2 = new double; . . . delete zeiger1; double* zeiger3 = zeiger2; *zeiger3 = 1.41; delete zeiger3; . . . *zeiger2 = 1.73; return 0; }
Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
Speicherverwaltung
Zeiger Felder
Java Feld anlegen Feld zurckgeu ben Typ[] Referenz = new Typ[Gre]; o Garbage-Collection
Alternative: std::vector
Speicherverwaltung
Zeiger Beispiel
Speicherverwaltung
Zeiger C-Strings
Speicherverwaltung
class Vektor { private: double* data; unsigned int groesse; public: Vektor(unsigned int g); Vektor(Vektor const& v); ~Vektor(); . . . };
Speicherverwaltung
Beispiel Konstruktoren
Vektor::Vektor(unsigned int g) { groesse = g; data = new double[g]; } Vektor::Vektor(Vektor const& v) { groesse = v.groesse; data = new double[groesse]; for (unsigned int position=0; position<groesse; ++position) data[position] = v.data[position]; }
Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
Speicherverwaltung
Beispiel Destruktor
Operatoren Fragen
Welche Operatoren aus Java oder C++ kennen Sie bereits? In welche beiden Kategorien lassen sich diese einteilen?
Operatoren
Einfhrung u Antworten
Operatoren:
Kategorien:
Operatoren
Ubersicht Syntax
a Binrer Operator
Typ Klasse::operatorOperatorname(Typ const& Argument2); Objekt1 Operatorname Objekt2 // Infix Objekt1 Operatorname 1 Objekt2 Operatorname 2 // Zirkumfix
Unrer Operator a Typ Klasse::operatorOperatorname(); Operatorname Objekt // Prfix a Objekt Operatorname // Postfix
Operatoren
Beispiele Zuweisungsoperator
Vektor& Vektor::operator=(Vektor const& v) { delete[] data; groesse = v.groesse; data = new double[groesse]; for (unsigned int position=0; position<groesse; ++position) data[position] = v.data[position]; return *this; }
Operatoren
Beispiele Additionsoperator
Vektor Vektor::operator+(Vektor const& v) const { if (groesse!=v.groesse) throw "falsche Laenge"; Vektor ergebnis(groesse); for (unsigned int position=0; position<groesse; ++position) ergebnis.data[position] = data[position]+v.data[position]; return ergebnis; }
Operatoren
Beispiele Zugrisoperator
double& Vektor::operator[](unsigned int const index) { return data[index]; } double const& Vektor::operator[](unsigned int const index) const { return data[index]; }
Operatoren
Beispiel 1. Kopierkonstruktor: Vektor::Vektor(Vektor const& v) 2. Destruktor: Vektor::~Vektor() 3. Zuweisungsoperator: Vektor& Vektor::operator=(Vektor const& v)
Operatoren
std::ostream& operator<<(std::ostream& ausgabe, Vektor const& v) { ausgabe << (; for (unsigned int position=0; position<v.Groesse(); ++position) ausgabe << v[position] << ; ausgabe << ); return ausgabe; }
Operatoren
Ausgabeoperator Anwendung
#include <iostream> #include "vektor.h" int main() { Vektor v(7); for (int w=0; w<7; ++w) v[w] = w; std::cout << v << " ist der Inhalt von v" << std::endl; return 0; }
Operatoren
Ausgabeoperator Dateiausgabe
#include <fstream> #include "vektor.h" int main() { Vektor v(7); for (int w=0; w<7; ++w) v[w] = w; std::ofstream ausgabe("ausgabe.txt"); ausgabe << " v ist " << v << std::endl; return 0; } std::ofstream ist von std::ostream abgeleitet.
Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
Wie lautet die Syntax in Java fr das Ableiten einer u Klasse? Was bedeutet dynamisches Binden? Was ist unter einem Package in Java zu verstehen?
Einfhrung u
Antworten
Ableiten: class Klasse extends Basisklasse { ... } dynamisches Binden: Aufruf der entsprechenden Funktion
abhngig vom aktuellen Typ eines Objekts a Package: Sammlung von Klassen, Funktionen etc., die uber Package-Namen angesprochen werden
Vererbung
Vererbung Syntax
C++
class Klasse : public Basisklasse { ... };
Zugrisregelung Deklaration in Basisklasse private: protected: public: Zugri nur Basisklasse Basisklasse und Klassen global
abgeleitete
Vererbung
Beispiel
class Figur { void zeichne(); }; class Kreis : public Figur { void zeichne(); };
Vererbung
Dynamisches Binden
Aufruf der entsprechenden Funktion abhngig vom aktuellen a Typ einer Instanz Bezeichner virtual vor Funktion in Basisklasse (sonst statisches Binden der Basisklassenfunktion!) Funktion mit selber Signatur in abgeleiteter Klasse ebenfalls virtuell [ Speicherplatz (Tabelle), Rechenzeit] Java Standard C++ virtual
dynamisches Binden
Vererbung
Beispiel
class Figur { virtual void zeichne(); }; class Kreis : public Figur { virtual void zeichne(); }; virtual bei der zeichne-Funktion von Kreis kann weggelassen werden.
Vererbung
Beispiel (Forts.)
Kreis meinKreis; Figur* zeiger; zeiger = &meinKreis; (*zeiger).zeichne(); Zu (*zeiger).zeichne() alternative Syntax: zeiger->zeichne().
Vererbung
Abstrakte Klassen
Klasse ist abstrakt, sobald sie abstrakte Funktion hat Abstrakte Klasse kann nicht instanziiert werden Im Unterschied zu Java-Interfaces knnen Methoden deniert o werden Von abstrakter Klasse kann abstrakte Klasse abgeleitet werden Abgeleitete Klasse ist nicht mehr abstrakt, wenn alle abstrakten Funktionen deniert sind
Vererbung
Syntax
virtual Funktionssignatur = 0;
Schnittstelle, Abstraktion
Vererbung
Beispiel
class Figur { virtual void zeichne() = 0; } class Kreis : public Figur { void zeichne() { . . . } };
Namensrume a
Namensrume Syntax a
C++
namespace Namensraum { ... }
Namensrume a
Beispiel
namespace Bibliothek { void funktion(); } . . . int main() { Bibliothek::funktion(); } . . . using Bibliothek::funktion; int main() { funktion(); }
Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
Generisches Programmieren
Einfhrung u
Antwort
Generisches Programmieren
Templates
Templates Ubersicht
Parametrisierte Funktion/Klasse Abstraktion von konkreten Datentypen Funktion/Klasse kann fr alle Typen instanziiert werden, die u darin verwendete Funktionen bereitstellen
Generisches Programmieren
Templates
Syntax
Generisches Programmieren
Templates
Beispiel Template-Funktion
int float abs(int abs(float i) { return i<0 ? -i : i; } f) { return f<0 ? -f : f; }
double abs(double d) { return d<0 ? -d : d; } template<typename T> T abs(T x) { return x<0 ? -x : x; } . . . double d = -42; std::cout << abs(d) << std::endl;
Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
Generisches Programmieren
Templates
Gemeinsamkeiten
Operator < Operator - (unr) a Konstruktor, der 0 als Parameter akzeptiert Kopierkonstruktor
Generisches Programmieren
Templates
Hinweise
Mehrere Template-Parameter werden jeweils durch Komma getrennt. Durch Angabe von festgelegt werden. Java Cast, Java 1.5 = Typ kann Standardparameter
Generizitt a
C++ Template
Generisches Programmieren
Templates
Syntax
Template-Klasse template<typename Parameter> class Klasse { // Klasse mit Parameter }; Klasse<Typ> Instanz;
Generisches Programmieren
Templates
Beispiel Template-Klasse
template<typename T> class Vektor { T* data; unsigned int groesse; public: Vektor(unsigned int g); Vektor(Vektor<T> const& v); ~Vektor(); Vektor<T>& operator=(Vektor<T> const& v); Vektor<T> operator+(Vektor<T> const& v) const; T const& operator[](unsigned int const index) const; T& operator[](unsigned int const index); unsigned int getGroesse() const { return groesse; } };
Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
Generisches Programmieren
Templates
verlangen
ebenfalls
Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
Generisches Programmieren
Templates
Generisches Programmieren
Templates
Denition einer Funktion/Klasse fr mehrere Typen u Typsicherheit: Sicherstellen zur Kompilierzeit, dass verwendete Typen die notwendigen Funktionen bereitstellen und Typ einer Variablen der richtige ist (keine Casts notwendig) Erhhte Kompilierzeiten o Unhandliche Funktionsnamen Kryptische Fehlermeldungen Vergrerung des Programms o
STL Fragen
Welche Datenstrukturen zhlen Sie zu den a grundlegendsten? Was ist unter einem Iterator zu verstehen?
STL
Einfhrung u Antworten
Datenstrukturen:
Iterator:
STL
STL
Vektor
Liste
Container: std::list<T> Anhngen (hinten): push back(...) a Entfernen (vorne): pop first() ...
Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
STL
#include <vector> #include <list> using std::vector; using std::list; class Graph { struct Node { typedef Node* NeighbourType; typedef list<NeighbourType> NeighbourContainer; NeighbourContainer neighbours; }; vector<Node> nodes; };
Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de
STL
Iteratoren Ubersicht
Iterator: ContainerTyp::iterator Konstanter Iterator: ContainerTyp::const iterator Zugrisoperator: operator* Weiterschalten: operator++ Iterator, der auf erstes Element zeigt: Container::begin() Iterator, der hinter Ende zeigt: Container::end()
STL
int Graph::Node::degree() { int number = 0; for (NeighbourContainer::iterator it = neighbours.begin(); it != neighbours.end(); ++it) ++number; return number; }
STL
int Graph::Node::degree() const { int number = 0; for (NeighbourContainer::const iterator it = neighbours.begin(); it != neighbours.end(); ++it) ++number; return number; }