Sie sind auf Seite 1von 114

Einfhrung in C++ u

Martin Holzer
Lehrstuhl fr Algorithmik I u

April/Mai 2005

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Einleitung

Uberblick Zielstellung

Vermittlung grundlegender Kenntnisse in C++ Gegenberstellung von Java und C++ u Voraussetzung: Kenntnis allgemeiner Programmierkonzepte:

Syntax Variablen Schleifen Verzweigungen Unterprogramme Objektorientierung etc.

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Einleitung

Uberblick Verwandtschaft C++ und Java

C++ C

Java

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Einleitung

Uberblick Frage

Welches sind die grten Unterschiede o zwischen Java und C++?

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Einleitung

Uberblick Antwort (diskussionsfhig) a


Java Referenzen automatisch Collection) strikter Java-Bytecode, JVM (GarbageC++ Kopien, Referenzen, Zeiger Selbstverwaltung

Variablen/ Parameter Speicherverwaltung Objektorientierung Portabilitt a

C-Erbe direkt ausfhrbares u Programm (maschinenabhngig) a . . .


Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

. . .

. . .

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Einleitung

Uberblick Inhalt

Einleitung Entwicklung Klassen und Header-Dateien Bezeichner Parameter

Speicherverwaltung Operatoren a Vererbung und Namensrume Generisches Programmieren STL

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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/

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Entwicklung Kompilieren und Linken Vergleich

Java

C++

Quellcode

Kompiler

Bytecode

JVM Quellcode Kompiler Programm

Kompilieren Resultat: Java-Bytecode (vereinfacht) Resultat: ausfhrbares u Programm

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Entwicklung

Kompilieren und Linken Kompilieren und Linken in C++

Quellcode

Kompiler

Objektcode

Quellcode

Kompiler

Objektcode Linker Programm

Quellcode

Kompiler

Objektcode

Bibliothek

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Entwicklung

Kompilieren und Linken Der Compiler Syntax

g++ -c -Wall -g Quelldatei -o Objektdatei Argumente:


g++ -c: Kompilieren -Wall: alle Warnungen einschalten -g: Debugging-Informationen Quelldatei -o Objektdatei: Ausgabedatei

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Entwicklung

Kompilieren und Linken Der Linker

Entwicklungstool, unabhngig vom Compiler a Linker stellt fest, ob alle Programmteile vorhanden sind Entwickler muss vor Linken Aktualitt der Objektdateien a sicherstellen

Automatisierung? make (s. u.)

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Entwicklung

Kompilieren und Linken Syntax

g++ -Wall -g Objektdateien -o Zieldatei Argumente:


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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Entwicklung

make Das Tool make

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Entwicklung

make Syntax

Ziel: Abhngigkeiten a Befehl


Ziel: Regelname Abhngigkeiten : Liste (leerzeichensepariert) von a vorausgesetzten Dateien : Tabulator Befehl: Kommando zum Erstellen der Zieldatei

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Entwicklung

make Arbeitsweise

Aufruf make Regel make myprog

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Entwicklung

make Beispiel mit Variablen

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.

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Entwicklung

Weitere Tools Weitere Tools

Entwicklungsumgebung, z. B. Eclipse Dokumentationstool, z. B. Doxygen Debugger, z. B. ddd Proler, z. B. valgrind

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien Fragen

Welche grundstzlichen Merkmale hat eine Klasse? a Was ist ein Konstruktor? Was ist der Unterschied zwischen Deklaration und Denition?

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

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

public Konstruktor public Var.-/Fkt.-Dekl. }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

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 und Header-Dateien

Klassen

Hinweise
private: kann weggelassen werden (Variablen und Funktionen vor public: automatisch als privat deklariert). ; nach Klassendenition notwendig.

Java Variableninitialisierung this.x = x

C++ : myX(x)

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

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.

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

Klassen

Deklaration und Denition


Deklaration
class Vektor { double myX, myY; public: Vektor(double x, double y) : myX(x), myY(y) {}; Vektor addiere(Vektor v); };

Denition Vektor 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 und Header-Dateien

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

Header

Die Denition
vektor.cc #include "vektor.h" Vektor Vektor::addiere(Vektor v) { return Vektor(myX+v.myX, myY+v.myY); }

Java Klassenreferenz Klasse.Element

C++ Klasse::Element

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

Header

Kompilieren und Linken (mit Header-Dateien)

Deklaration

Definition

Kompiler

Objektcode

Deklaration

Definition

Kompiler

Objektcode Linker Programm

Definition

Kompiler

Objektcode

Deklaration

Bibliothek

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

Header

make (mit Header-Dateien)

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

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

Klassen und Header-Dateien

Compiler-Guards

Ubersicht uber Compiler-Direktiven

#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.

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

Ausgabe

Ausgabe Syntax

Java Ausgabe
System.out.println(String);

C++
std::cout << String << std::endl; int main() {} oder

Main

public static void main(String[] args) {}

int main(int argn, char* argv[]) {}

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Klassen und Header-Dateien

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; }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Bezeichner Fragen

Welche Funktion haben Bezeichner (Qualier)? Welche Bezeichner haben Sie bereits kennengelernt? Welche Bedeutung hat eine static deklarierte Variable in Java?

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Bezeichner

Einfhrung u Antworten

Funktion von Bezeichnern:

Zugriskontrolle etc.

Bisher kennengelernt:

private, public

static deklarierte Variable:

Nur eine Instanz pro Klasse

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Bezeichner

Ubersicht static vs. extern

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

extern deklarierte Variablen sind schlechter Stil!

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Bezeichner

Ubersicht static

static hat weitere Bedeutung (hnlich Java): a

static denierte Variable/Funktion:


statische Variable existiert nur einmal pro Klasse statische Funktion darf nur statische Variablen und Funktionen verwenden

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Bezeichner

Ubersicht Beispiel static

class Vektor { . . . static int maximalLength; static Vektor generateRandom(); . . . }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Bezeichner

Ubersicht Beispiele inline

inline int abs(int i) { return i<0 ? -i : i; }


class Vektor { 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

Parameter Frage

Welche Mglichkeiten der Parameterbergabe gibt es? o u

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Parameter

Einfhrung u Antwort

Mglichkeiten der Parameterbergabe: o u

Werte-Parameter, Referenz-Parameter

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Parameter

Parameterbergabe u Ubersicht

Werte-Parameter
funktion(double wert) { wert = 0.0; }

Referenz-Parameter
funktion(double& wert) { wert = 0.0; }

Anderung des Wertes lokal begrenzt Kopieren notwendig

Anderung wirkt sich auerhalb aus (fast) keine Laufzeiteinbuen

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

Wie versehentliches Andern von Referenzen verhindern? const


Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Parameter

Parameterbergabe u const-Deklarationen

Bezeichnung Konstante Referenz Konstante Funktion

Syntax
Fkt(Typ const& Name)

Fkt() const

Semantik Referenz unvernderlich a Funktion a ndert Klasse nicht

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

3.14159; final String STR = new String("Hello World!");

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Parameter

Parameterbergabe u Beispiele

funktion(double const& wert) { wert = 0.0; // nicht mehr mglich o }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Parameter

Parameterbergabe u Beispiele (Forts.)

#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; . . .

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Parameter

Kopierkonstruktor Kopierkonstruktor Verwendung

Zweck: Instanziierung einer Klasse durch Referenz auf andere Instanz dieser Klasse Konstruktor mit konstanter Referenz als Parameter Standard-Kopierkonstruktor kopiert alle Datenelemente

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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); };

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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;

kontostand ist 1000 nur Anderung der Kopie

kontostand ist 0 Anderung von Original und Referenz

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Speicherverwaltung Fragen

Was ist unter dem Gltigkeitsbereich (Scope) einer u Variablen zu verstehen? Wie wird in Java Speicherplatz fr ein Objekt angefordert? u

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Speicherverwaltung

Einfhrung u Antworten

Gltigkeitsbereich: u

Codeabschnitt, in dem Variable deniert ( ansprechbar) ist (kleinster umschlieender Block)

Speicherplatz anfordern:

new-Operator

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Speicherverwaltung

Gltigkeit u Speicherfreigabe

Speicherfreigabe

Java Garbage-Collection

C++ sofort bei Verlassen des Gltigkeitsbereichs; dau vor evtl. Aufruf des Destruktors

Destruktor Klasse::~Klasse() {...};

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Speicherverwaltung

Gltigkeit u Globale Gltigkeit u

Was tun, wenn Speicherbereich lnger bentigt wird? a o Zeiger/new/delete (s. u.)
Java new C++ lokal (Scope), new

Instanziierung

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Speicherverwaltung

Zeiger Zeiger Verwendung

char double* int double

data

verkettete Listen
data data data

dynamische Arrays Bume a

data

data

data

data

data

data

data

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Speicherverwaltung

Zeiger Syntax

Bezeichnung Zeigerdeklaration Speicheradresse Dereferenzierung

Syntax Typ* Zeiger; &Variable *Zeiger

Semantik Zeigervariable Zeiger vom Typ Typ Adresse von Variable Inhalt von Zeiger

Achtung: Mehrfachbedeutungen von * und &!

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Speicherverwaltung

Zeiger Beispiel

int a = 5; int b = 7; int* p = &a; int* q = &5; int* r; r = &b; *p = 9; p = r; *p = 8;

// Fehler

// a ist nun 9 // p zeigt nun auf b // b ist nun 8

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Speicherverwaltung

Zeiger Speicher anfordern

Java Speicher anfordern


Referenz = new Typ();

C++ Zeiger = new Typ;

Zeiger mssen im Gegensatz zu Referenzen nicht initiau lisiert werden.

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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; }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Speicherverwaltung

Zeiger Hinweise

Bezeichnung Zeiger auf Konstante Konstanter Zeiger

Syntax Typ const* Zeiger

Semantik Zeiger kann TypVariable nicht verndern a Zeiger nicht um biegbar

Typ* const Zeiger

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

Zeiger Speicher zurckgeben u

Java Speicher zurckgeu ben Garbage-Collection

C++ delete Zeiger;

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

// nachfolgend undef. Verhalten!!

Speicherverwaltung

Zeiger Felder

Java Feld anlegen Feld zurckgeu ben Typ[] Referenz = new Typ[Gre]; o Garbage-Collection

C++ Typ* Zeiger = new Typ[Gre]; o delete[] Zeiger;

Alternative: std::vector

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Speicherverwaltung

Zeiger Beispiel

int main() { int* feld = new int[1000]; . . . delete[] feld; return 0; }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Speicherverwaltung

Zeiger C-Strings

Syntax char* Variable; char const* Variable = "Zeichenkette"; Alternative: std::string

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Speicherverwaltung

Beispiel Dynamischer Vektor

class Vektor { private: double* data; unsigned int groesse; public: Vektor(unsigned int g); Vektor(Vektor const& v); ~Vektor(); . . . };

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

Vektor::~Vektor() { delete[] data; }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Operatoren Fragen

Welche Operatoren aus Java oder C++ kennen Sie bereits? In welche beiden Kategorien lassen sich diese einteilen?

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Operatoren

Einfhrung u Antworten

Operatoren:

-, ++, =, <<, [] etc.

Kategorien:

Unre und binre Operatoren a a

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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; }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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; }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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]; }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Operatoren

Beispiele Regel der Goldenen Drei

Brauchst du eine, brauchst du alle! (Kopierkonstruktor, Destruktor, Zuweisungsoperator)

Beispiel 1. Kopierkonstruktor: Vektor::Vektor(Vektor const& v) 2. Destruktor: Vektor::~Vektor() 3. Zuweisungsoperator: Vektor& Vektor::operator=(Vektor const& v)

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Operatoren

Ausgabeoperator Beispiel Denition

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; }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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; }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

Vererbung und Namensrume a Fragen

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?

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Vererbung und Namensrume a

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Vererbung und Namensrume a

Vererbung

Vererbung Syntax

Java Vererbung class Klasse extends Basisklasse { ... }

C++
class Klasse : public Basisklasse { ... };

Zugrisregelung Deklaration in Basisklasse private: protected: public: Zugri nur Basisklasse Basisklasse und Klassen global

abgeleitete

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Vererbung und Namensrume a

Vererbung

Beispiel

class Figur { void zeichne(); }; class Kreis : public Figur { void zeichne(); };

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Vererbung und Namensrume a

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Vererbung und Namensrume a

Vererbung

Beispiel

class Figur { virtual void zeichne(); }; class Kreis : public Figur { virtual void zeichne(); }; virtual bei der zeichne-Funktion von Kreis kann weggelassen werden.

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Vererbung und Namensrume a

Vererbung

Beispiel (Forts.)

Kreis meinKreis; Figur* zeiger; zeiger = &meinKreis; (*zeiger).zeichne(); Zu (*zeiger).zeichne() alternative Syntax: zeiger->zeichne().

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Vererbung und Namensrume a

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Vererbung und Namensrume a

Vererbung

Syntax

virtual Funktionssignatur = 0;

Schnittstelle, Abstraktion

Java abstract, Interface

C++ abstrakte Klasse

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Vererbung und Namensrume a

Vererbung

Beispiel

class Figur { virtual void zeichne() = 0; } class Kreis : public Figur { void zeichne() { . . . } };

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Vererbung und Namensrume a

Namensrume a

Namensrume Syntax a

Java Namensraum Zugri package Paket; Paket.Element

C++
namespace Namensraum { ... }

Namensraum::Element using Namensraum ::Element; using namespace Namensraum;

Importieren import Paket;

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Vererbung und Namensrume a

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 Frage

Welche Funktion erfllen Casts in Java? u

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Generisches Programmieren

Einfhrung u

Antwort

Sicherstellen des gewnschten aktuellen Typs eines Objekts. u

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Generisches Programmieren

Templates

Syntax

Template-Funktion template<typename Parameter> Funktion(...) { // Funktionsdefinition mit Parameter } Funktion(...);

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

Beispiel Template-Funktion (Forts.)

Gemeinsamkeiten

Operator < Operator - (unr) a Konstruktor, der 0 als Parameter akzeptiert Kopierkonstruktor

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Generisches Programmieren

Templates

Syntax

Template-Klasse template<typename Parameter> class Klasse { // Klasse mit Parameter }; Klasse<Typ> Instanz;

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

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

Beispiel Template-Klasse (Forts.)


template<typename T> Vektor<T>::Vektor(unsigned int g) { groesse = g; data = new T[g]; } . . . template<typename T> T& Vektor<T>::operator[](unsigned int const index) { return data[index]; }

Methodendenitionen template<typename T>.


Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

verlangen

ebenfalls
Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Generisches Programmieren

Templates

Beispiel Template-Klasse (Forts.)

. . . Vektor<double> meinVektor(7); . . . meinVektor[4] = 3.14; . . .

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Generisches Programmieren

Templates

Vor- und Nachteile

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

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

STL Fragen

Welche Datenstrukturen zhlen Sie zu den a grundlegendsten? Was ist unter einem Iterator zu verstehen?

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

STL

Einfhrung u Antworten

Datenstrukturen:

Array, Liste, Warteschlange, Stapel, Suchbaum etc.

Iterator:

Objekt zum Navigieren auf Datenstrukturen wie z. B. Listen

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

STL

Ubersicht Die Standard Template Library

Standardcontainer Iteratoren Grundlegende Funktionen und Algorithmen (z. B. Sortieren) ...

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

STL

Ubersicht Vektor und Liste

Vektor

Container: std::vector<T> Zugrisoperator: operator[] ...

Liste

Container: std::list<T> Anhngen (hinten): push back(...) a Entfernen (vorne): pop first() ...
Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

STL

Ubersicht Beispiel Graphdatenstruktur

#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()

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

STL

Iteratoren Beispiel Iterator

int Graph::Node::degree() { int number = 0; for (NeighbourContainer::iterator it = neighbours.begin(); it != neighbours.end(); ++it) ++number; return number; }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

STL

Iteratoren Beispiel konstanter Iterator

int Graph::Node::degree() const { int number = 0; for (NeighbourContainer::const iterator it = neighbours.begin(); it != neighbours.end(); ++it) ++number; return number; }

Universitt Karlsruhe (TH) a Institut fr Theoretische Informatik u

Lehrstuhl fr Algorithmik I u http://i11www.ira.uka.de

Das könnte Ihnen auch gefallen