Von Java/C nach C++ Fokus Der bekannteste Unterschied

Werbung
Überblick
1
Primitive Datentypen
2
Komplexe Datentypen
3
Funktionen
Fabian Scheler, Peter Ulbrich, Niko Böhm
4
Zeiger und Parameterübergabe
Friedrich-Alexander-Universität Erlangen-Nürnberg
Lehrstuhl Informatik 4 (Verteilte Systeme und Betriebssysteme)
www4.informatik.uni-erlangen.de
5
Klassen
6
Typumwandlung
7
Namensräume
8
Templates
Von Java/C nach C++
21. Oktober 2008
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Fokus
Von Java/C nach C++
21. Oktober 2008
1 / 59
Generelles
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
2 / 59
Generelles
Der bekannteste Unterschied
Worum geht es hier nicht?
Standardbibliothek
Java-Programme werden auf einer virtuellen Maschine
ausgeführt:
Speicherverwaltung
mächtiges Laufzeitsystem (z.B. Garbage Collection)
Typinformation
dynamische Laden von Klassen
Überprüfungen zur Laufzeit
...
Ein- und Ausgabe
Warum geht es nicht darum?
Weil wir es hier nicht brauchen!
C++-Programme werden auf der nackten Hardware ausgeführt:
kein Laufzeitsystem
keine Typinformation
Ausnahme: RTTI und Exceptions (teuer!)
Worum es geht?
Abbildung von Java auf C++
Was gibt es in C++, was es in Java nicht gibt?
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
3 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
4 / 59
Primitive Datentypen
Primitive Datentypen
Primitive Datentypen in Java und C++
Primitive Datentypen - Übersicht
Diese Angaben für C++-Datentypen gelten z.B. auf heutigen
x86-Systemen mit dem GNU C Compiler (Version 3.3.5):
Bezeichner
boolean
char
byte
short
int
long
float
double
void
primitive Datentypen in Java sind exakt spezifiziert
primitive Datentypen in C++ sind hochgradig abhängig von der
Implementierung
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
5 / 59
Primitive Datentypen
Java
min
Unicode 0
-128
−215
−231
−263
IEEE754
IEEE754
-
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
max
Unicode 216 − 1
127
215 − 1
231 − 1
263 − 1
IEEE754
IEEE754
-
Bezeichner
bool
char
signed char
unsigned char
signed short
unsigned short
signed int
unsigned int
signed long
unsigned long
float
double
long double
void
Von Java/C nach C++
max
Unicode 216 − 1
127
215 − 1
231 − 1
263 − 1
IEEE754
IEEE754
-
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Bezeichner
bool
char
signed char
unsigned char
signed short
unsigned short
signed int
unsigned int
signed long
unsigned long
float
double
long double
void
C++
Größe
8 Bit
8 Bit
8 Bit
16 Bit
16 Bit
32 Bit
32 Bit
32 Bit
32 Bit
32 Bit
64 Bit
96 Bit
-
min
-128
-128
0
−215
0
−231
0
−231
0
-
Von Java/C nach C++
max
+127
+127
255
215 − 1
216 − 1
231 − 1
232 − 1
231 − 1
232 − 1
-
21. Oktober 2008
6 / 59
Wie löst man dieses Problem?
Diese Angaben für C++-Datentypen gelten z.B. auf einem H8/300 mit
dem GNU C Compiler (Version 3.4):
Größe
16 Bit
8 Bit
16 Bit
32 Bit
64 Bit
32 Bit
64 Bit
-
Java
min
Unicode 0
-128
−215
−231
−263
IEEE754
IEEE754
-
Primitive Datentypen
Primitive Datentypen - Übersicht
Bezeichner
boolean
char
byte
short
int
long
float
double
void
Größe
16 Bit
8 Bit
16 Bit
32 Bit
64 Bit
32 Bit
64 Bit
-
C++
Größe
8 Bit
8 Bit
8 Bit
16 Bit
16 Bit
16 Bit
16 Bit
32 Bit
32 Bit
32 Bit
32 Bit
32 Bit
-
min
-128
-128
0
−215
0
−215
0
−231
0
-
typedef unsigned char
// ..
typedef long long
typedef e z s t u b s _ u i n t 3 2
max
+127
+127
255
215 − 1
216 − 1
215 − 1
216 − 1
231 − 1
232 − 1
-
21. Oktober 2008
Abbildung auf wohldefinierte Typen
Abbildung
ezstubs_uint8 ;
ezstubs_int64 ;
ezstubs_addrword ;
ausschließliche Verwendung der wohldefinierten Typen
Verwendung
e z s t u b s _ u i n t 3 2 MyClass : : myMethod ( ) {
// ...
}
7 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
8 / 59
Primitive Datentypen
Konstanten in Java:
Konstanten
Primitive Datentypen
Konstanten in C++:
Konstanten
Präprozessor
# define PI 3.14159
Keyword final
class Foo {
s t a t i c f i n a l i n t Bar = 0 x f f ;
}
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Primitive Datentypen
Konstanten in C++:
Schlecht, weil:
rein textuelle Ersetzung
keine Typprüfung möglich
21. Oktober 2008
9 / 59
Konstanten
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Arrays
Keyword const
Von Java/C nach C++
Komplexe Datentypen
21. Oktober 2008
10 / 59
21. Oktober 2008
12 / 59
Java
Arrays
const unsigned i n t k o n s t a n t e = 5 ;
i n t [ ] i = new i n t [ 5 ] ;
O b j e c t [ ] o = new O b j e c t [ 1 0 ] ;
muss initialisiert werden
nicht nur eine Reihung von Objekten gleichen Typs
ermöglicht Typüberprüfung
Arrays sind Objekte
Zusicherung des Programmierers an den Übersetzer!
Unterschied zu C: benötigt nicht unbedingt Speicherplatz
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
11 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Klassen
Komplexe Datentypen
Java
Arrays
Komplexe Datentypen
C++
Schlüsselwort class
Arrays
class Foo {
private int x ;
int i [10];
myClass myClassObjects [ CONST_EXPRESSION ] ;
public i n t Bar ( ) {
return x ;
}
}
sind keine Objekte
einfache Aneinanderreihung von Objekten gleichen Typs
...
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Aufzählung
Von Java/C nach C++
Komplexe Datentypen
21. Oktober 2008
13 / 59
C++
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Verbund
Von Java/C nach C++
Komplexe Datentypen
21. Oktober 2008
14 / 59
C++
Schlüsselwort union
union TCSR {
unsigned char v a l ;
struct {
unsigned char OCLRA : 1 ;
unsigned char OVF
: 1;
...
unsigned char ICFA : 1 ;
} bits ;
};
Schlüsselwort enum
enum Wochentage {
Montag ,
Dienstag ,
...
Sonntag
};
fasst eine Menge von Werten zu einem eigenständigen Typen
zusammen
val und bits sollten gleich groß sein
unterschiedliche Interpretationen für den denselben
Speicherbereich
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
15 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
16 / 59
Komplexe Datentypen
Strukturen und Klassen
C++
Komplexe Datentypen
Benutzerdefinierte Typen
Schlüsselwort struct
Schlüsselwort class
Schlüsselwort typedef
s t r u c t Foo {
...
};
class Bar {
...
};
typedef type_A type_B ;
C++
type_B kann synonym zu type_A verwendet werden
Vorsicht bei Forward Declarations und typedef
Forward Declaration != typedef
Strukturen und Klassen sind in C++ fast äquivalent
Unterschied: Sichtbarkeit
typedef my_Class_A my_Class_B ;
...
class my_Class_B ;
Strukturen: standardmäßig public
Klassen: standardmäßig private
zu Klassen später mehr . . .
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
obiges Beispiel wird eine Fehlermeldung beim Übersetzen liefern!
Von Java/C nach C++
Funktionen
21. Oktober 2008
17 / 59
Definition
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Funktionen
Funktionsdefinitionen in Java
21. Oktober 2008
18 / 59
Definition
Funktionsdefinitionen in C++
Funktionsdefinition im Klassenrumpf
Funktionsdefinition im Klassenrumpf
class Foo {
i n t Bar ( i n t i ) { r e t u r n
};
class Foo {
public i n t a ;
public i n t Bar ( i n t i ) {
return i + a ;
}
}
i + 5; }
Funktionsdefinition außerhalb des Klassenrumpfs
class Foo {
i n t Bar ( i n t i ) ;
};
i n t Foo : : Bar ( i n t i ) { r e t u r n i + 5 ; }
Alle Funktionen sind Methoden genau einer Klasse
Keine globalen Funktionen
Funktionen werden immer im Klassenrumpf definiert
Funktionsdefinition innerhalb oder außerhalb des Klassenrumpfs
auch globale Funktionen sind erlaubt
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
19 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
20 / 59
Funktionen
Überladen
Funktionen
Einbettung von Funktionen
Überladen von Funktionen in Java
void Bar ( i n t i ) { . . . }
void Bar ( long l ) { . . . }
void Bar ( O b j e c t o ) { . . . }
O b j e c t Bar ( i n t i ) { . . . }
O b j e c t Bar ( O b j e c t o , i n t i ) { . . . }
//
//
//
//
//
OK
Fehler
OK
Fehler
Fehler
//
//
//
//
//
OK
Fehler
OK
Fehler
OK
Überladen von Funktionen in C++
void Bar ( i n t i ) { . . . }
void Bar ( long l ) { . . . }
void Bar ( O b j e c t o ) { . . . }
O b j e c t Bar ( i n t i ) { . . . }
O b j e c t Bar ( O b j e c t o , i n t i ) { . . . }
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Funktionen
Einbettung von Funktionen
21. Oktober 2008
Einbettung
Original
Eingebettet
int inc ( int a) {
return a + 1;
}
i n t main ( ) {
int a = 2;
a = inc (a ) ;
a = inc (a ) ;
a = inc (a ) ;
return 0;
}
i n t main ( ) {
int a = 2;
{ i n t a_temp
a = a_temp
{ i n t a_temp
a = a_temp
{ i n t a_temp
a = a_temp
return 0;
}
=
+
=
+
=
+
a;
1; }
a;
1; }
a;
1; }
Semantik der Parameterübergabe bleibt erhalten
(hier call by value)
21 / 59
Einbettung
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Funktionen
21. Oktober 2008
22 / 59
Einbettung
Einbettung von Funktionen in Java
Schlüsselwort final
class Bar {
f i n a l i n t Foo ( ) { . . . }
}
Einbettung ist nicht gleich textueller Ersetzung
das macht der Präprozessor
Vorteil: Man spart den Overhead des Funktionsaufrufs
Gefahr: Code Bloat
Es gibt kein explizites Inlining in Java!
Achtung: sehr schwer die optimale Inlining-Strategie zu finden!
Schlüsselwort final signalisiert dem Compiler: diese Methode wird
nicht mehr überschrieben!
Solche Methoden kann der Compiler einbetten
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
23 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
24 / 59
Funktionen
Einbettung
Funktionen
Einbettung von Funktionen in C++
Beispiele
durch Definition im Klassenrumpf
class Foo {
/ / Zuweisungsoperator
Foo operator =( Foo v a l ) ;
/ / Typkonvertierung
operator Bar ( ) ;
};
durch entsprechende Deklaration
Schlüsselwort inline
class Foo {
i n l i n e i n t Bar ( i n t i ) ;
};
i n t Foo : : Bar ( i n t i ) { r e t u r n i + 5 ; }
Syntactic Sugar
Definition muss beim Aufruf für den Compiler sichtbar sein
keine echten benutzerdefinierten Operatoren
letztendliche Einbettung hängt vom Compiler und den
Compiler-Optionen ab!
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Zeiger und Parameterübergabe
Was sind Zeiger
Operatoren
Operatoren entsprechen normalen Funktionen
21. Oktober 2008
gewisse Operatoren können nicht überladen werden
Präzedenz kann nicht beeinflusst werden
25 / 59
Zeiger
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Zeiger und Parameterübergabe
Verwendung von Zeigern
ein Zeiger ist ein Tripel (Typ, Bezeichner, Wert)
Wert eines Zeigers: eine Adresse
Semantik eines Zeigers: an der Adresse findet man ein Objekt
vom Typ Typ
Java: alle komplexen Datentypen sind Zeiger
C++: wählbar
21. Oktober 2008
26 / 59
Zeiger
Deklaration:
int ∗ i ;
MyClass∗ f o o ;
Zugriff auf den referenzierten Wert:
Operator *
∗ i = 5;
int
ptr_int
0x0ae0
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Wo kommen Zeiger her?
0x0ae0
int
Von Java/C nach C++
21. Oktober 2008
27 / 59
Operator &
Operator new
int i ;
int ∗ ptr_to_i = &i ;
Foo∗ f = new Foo ( ) ;
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
28 / 59
Referenzen
Zeiger und Parameterübergabe
Zeiger
Zeiger und Parameterübergabe
C++
≈ konstanter Zeiger, der automatisch dereferenziert wird
muss initialisiert werden
Verwendung:
primitive Datentypen: call by value
komplexe Datentypen: call by reference
call by value: ein Objekt übergeben
call by reference: einen Zeiger oder eine Referenz übergeben
void by_value ( i n t i , Foo f ) ;
void b y _ r e f e r e n c e ( i n t ∗ i , Foo& f ) ;
int i = 6;
in t& c = i ;
Foo bar ;
Foo& f o o b a r = bar ;
int i = 5;
Foo f ;
i n t main ( ) {
by_value ( i , f ) ;
b y _ r e f e r e n c e (& i , f ) ;
return 0;
}
c = 5;
/ / i == 5 !
f o o b a r . bar_method ( )
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Parameterübergabe
Java
Von Java/C nach C++
21. Oktober 2008
29 / 59
Klassen
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
/ / c a l l by v a l u e
/ / c a l l by r e f e r e n c e
Von Java/C nach C++
Klassen
Klassen in Java und C++
... sind im Großen und Ganzen sehr ähnlich, vor allem, was das
Konzept betrifft
Java
C++
class Foo {
public i n t a ;
protected i n t b ;
private int c ;
public i n t Bar ( ) {
...
}
}
class Foo {
private :
int c ;
protected :
int b;
public :
int a;
i n t Bar ( ) { . . . }
};
Angabe der Sichtbarkeit
für jedes Feld einer Klasse
einzeln
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
30 / 59
Sichtbarkeit
Sichtbarkeit von Klassenfeldern
21. Oktober 2008
31 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Angabe der Sichtbarkeit
für eine Gruppe von
Feldern einer Klasse
21. Oktober 2008
32 / 59
Klassen
Statische Felder
Klassenvariablen - statische Felder
Einfache Vererbung
Deklaration wie in Java
Schlüsselwort static
class Foo {
s t a t i c i n t bar ;
s t a t i c void f o o b a r ( ) ;
};
Klassen
Vererbung
Java
C++
class Foo extends Bar {
...
}
class Foo : public Bar {
...
};
Felder und Methoden der
Basisklasse werden public
vererbt.
In C++ muss aber Speicher angefordert werden:
i n t Foo : : bar = 0 ;
Sichtbarkeit von Feldern
und Methoden der
Basisklasse muss
spezifiziert werden.
Vorsicht: static für globale Variablen/Funktionen existiert, hat
aber eine andere Bedeutung!
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Klassen
Sichtbarkeit und Vererbung
Basisklasse
public
protected
private
21. Oktober 2008
33 / 59
Vererbung
Vererbung
public
protected
private
public
protected
private
public
protected
private
Wozu ist das gut?
Klassen
21. Oktober 2008
34 / 59
Vererbung
Schnittstelle
/ / n o t s y n c h ro n iz e d
class MyClass {
public :
myMethod ( ) ;
};
/ / s y n c h ro n iz e d
class MyGuardedClass
: protected myClass
{
public :
myMethod ( ) ;
};
Interface- vs. Implementation-Inheritance
default: private
Von Java/C nach C++
Von Java/C nach C++
Definition von Benutzerschnittstellen
Beispiel: Unterbrechungssynchronisation
Klasse
public
protected
private
protected
protected
private
private
private
private
Vorsicht: protected/private-Vererbung ändert die Schnittstelle
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
21. Oktober 2008
35 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Verwendung
MyGuardedClass myObject ;
/ / OK
myObject . myMethod ( ) ;
/ / Compiler F e h l e r
myObject .
MyClass : : myMethod ( ) ;
Von Java/C nach C++
21. Oktober 2008
36 / 59
Mehrfache Vererbung
Klassen
Vererbung
Polymorphismus
class Foo
: public Bar1 , protected Bar2 ,
{
...
};
i n t main ( ) {
Oberklasse ∗ o ;
U n t e r k l a s s e 1 ∗ u1 = new U n t e r k l a s s e 1 ( ) ;
U n t e r k l a s s e 2 ∗ u2 = new U n t e r k l a s s e 2 ( ) ;
. . . p r i v a t e Barn
/ / Unterklasse1 : : foo ( )
o = u1 ;
o−>f o o ( ) ;
/ / Unterklasse2 : : foo ( )
o = u2 ;
o−>f o o ( ) ;
eine Klasse kann mehr als eine Basisklasse haben
Vorsicht: Konflikte können entstehen
Klasse Bar1 definiert Methode void Bar1::FooBar()
Klasse Bar2 definiert Methode void Bar2::FooBar()
in Klasse Foo: welche Methode ist gemeint?
Konflikte müssen vom Programmierer aufgelöst werden!
Virtuelle Methoden
Polymorphismus und virtuelle Methoden
Auswahl der Methode zur Laufzeit
Mehrfachvererbung
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Klassen
Von Java/C nach C++
Klassen
21. Oktober 2008
}
37 / 59
Polymorphismus und virtuelle Methoden
return 0;
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Klassen
21. Oktober 2008
38 / 59
21. Oktober 2008
40 / 59
Abstrakte Klassen und Interfaces
Schnittstellenbeschreibungen
Klassen
Interfaces in Java
Schlüsselwort interface
Polymorphismus nur bei virtuellen Methoden
in Java sind alle Methoden virtuell
i n t e r f a c e Comparable {
public i n t compare ( O b j e c t o ) ;
}
in C++ müssen Methoden als virtuell deklariert werden
Schlüsselwort virtual
class Foo {
v i r t u a l void bar ( ) ;
};
Abstrakte Klassen in C++: rein virtuelle Methoden
class Comparable {
public :
v i r t u a l i n t compare ( O b j e c t o ) = 0 ;
};
Vorsicht: Virtuelle Methoden sind teuer!
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
39 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Konstruktoren
Klassen
Konstruktoren und Destruktoren
Destruktoren
sehr ähnlich zu Java
Reihenfolge:
1
2
räumt ein Objekt auf, wenn seine Lebenszeit endet
Reihenfolge:
1
2
Achtung: Reihenfolge der Basisklassenkonstruktoren bei
Mehrfachvererbung ist nicht immer definiert!
Unterschied: kein super
Basisklassenkonstruktor in der Initializer-list des Konstruktors
Es gibt für jede Klasse genau einen Destruktor!
Syntax
class Foo {
Foo ( ) { . . }
~Foo ( ) { . . }
};
nicht notwendig bei Default-Konstruktoren
Von Java/C nach C++
Klassen
21. Oktober 2008
41 / 59
Erzeugung von Objekten
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
/ / Konstruktor
/ / Destruktor
Von Java/C nach C++
Klassen
21. Oktober 2008
42 / 59
Erzeugung von Objekten
Implizite Erzeugung - lokale Variablen
Lokale Variablen
dynamische Erzeugung von Objekten mit dem Operator new
i n t main ( ) {
myClass a ;
/ / D e f a u l t −K o n s t r u k t o r
yourClass b ( 3 ) ; / / b e n u t z e r d e f i n i e r t e r K o n s t r u k t o r
...
return 0;
}
MyClass∗ mc = new MyClass ( ) ;
liefert einen Zeiger auf das erzeuge Objekt
benötigt dynamische Speicherverwaltung
Vorsicht: Speicher mit delete wieder freigegeben!
d e l e t e mc ;
werden auf dem Stapel angelegt
beim Betreten des Sichtbarkeitsbereichs: Konstruktor
Keine Garbage Collection!
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Destruktor der eigentlichen Klasse
Destruktor der Basisklasse
Achtung: Reihenfolge der Basisklassendestruktoren bei
Mehrfachvererbung ist nicht immer definiert!
class Foo : public Bar {
Foo ( ) : Bar ( ) {
...
}
};
Explizite Erzeugung
Konstruktoren und Destruktoren
ähnelt dem finalize aus Java
Konstruktor der Basisklasse
Konstruktor der eigentlichen Klasse
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Klassen
Von Java/C nach C++
beim Verlassen des Sichtbarkeitsbereichs: Destruktor
21. Oktober 2008
43 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
44 / 59
Klassen
Erzeugung von Objekten
Klassen
Implizite Erzeugung - Felder
Felder einer Klasse
class Foo {
myClass a ;
yourClass b ;
ourClass c ;
};
Erzeugung von Objekten
Implizite Erzeugung - global
Globale Variablen
/ / D e f a u l t −K o n s t r u k t o r
/ / benutzerdefinierter Konstruktor
/ / benutzerdefinierter Konstruktor
Foo ( ) : b ( 3 ) , c ( " H a l l o " ) { . . . }
myClass a ;
/ / D e f a u l t −K o n s t r u k t o r
yourClass b ( 3 ) ; / / b e n u t z e r d e f i n i e r t e r K o n s t r u k t o r
globaler Sichtbarkeitsbereich wird beim
Start der Anwendung betreten
Beenden der Anwendung verlassen
Compiler erzeugt entsprechende Konstruktor/Destruktor-Aufrufe
Kind-Objekte werden implizit mit dem Eltern-Objekt erzeugt
Vorsicht: Reihenfolge nicht spezifiziert!
Aufruf des Default-Konstruktors durch den Compiler
Compiler-spezifische Erweiterungen notwendig
andere Konstruktoren in der Initializer-Liste
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Klassen
21. Oktober 2008
45 / 59
Zugriff auf Felder
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Klassen
Zugriff auf nicht-statische Felder
21. Oktober 2008
46 / 59
Zugriff auf Felder
Zugriff auf nicht-statische Felder
Zugriff auf nicht-statische Felder bei Objekten
Zugriff auf nicht-statische Felder bei Zeigern auf Objekte
Operator ->
Operator .
class Foo {
public :
i n t bar_var ;
i n t bar_method ( ) ;
};
class Foo {
public :
i n t bar_var ;
i n t bar_method ( ) ;
};
i n t main ( ) {
int a ,b;
Foo f o o ;
i n t main ( ) {
int a ,b;
Foo∗ f o o = new Foo ( ) ;
a = foo −>b a r _ v a r ;
b = foo −>bar_method ( ) ;
a = foo . bar_var ;
b = f o o . bar_method ( ) ;
}
}
return 0;
return 0;
foo->a ist Kurzform für (*foo).a
Syntactic Sugar
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
47 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
48 / 59
Klassen
Zugriff auf statische Felder
Zugriff auf Felder
Typumwandlung
Typumwandlung in C++
t y p e v a r = const_cast < t y p e >(param ) ;
Operator :: (scope-Operator)
class Foo {
public :
s t a t i c i n t bar_var ;
s t a t i c i n t bar_method ( ) ;
};
i n t main ( ) {
int a ,b;
entfernt const-Qualifizierung
besser: mutable-Qualifizierung für Instanzvariablen
a = Foo : : b a r _ v a r ;
b = Foo : : bar_method ( ) ;
}
return 0;
Ausnahme: existierende API, die kein const unterstützt
void f o o ( const char ∗ s t r ) {
l e g a c y _ f u n c ( const_cast < char ∗ >( s t r ) ) ;
}
Achtung: legacy_func darf str nicht verändern!
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
49 / 59
Typumwandlung
21. Oktober 2008
50 / 59
t y p e v a r = dynamic_cast< t y p e >(param ) ;
Konvertierung zwischen verschiedenen Zahlenformaten
(z.B. int und float)
Konvertierung zwischen verwandten Zeiger- und Referenztypen
(die Typen werden statisch während der Übersetzung aufgelöst)
nur möglich wenn die Typdefinition bekannt ist (eine Deklaration
alleine reicht nicht aus), ansonsten 7→ Übersetzungsfehler
this-Zeiger werden bei Bedarf angepasst
(z.B. im Falle der Mehrfachvererbung)
Von Java/C nach C++
Von Java/C nach C++
Typumwandlung in C++
t y p e v a r = s t a t i c _ c a s t < t y p e >(param ) ;
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Typumwandlung
Typumwandlung in C++
Konvertierung zwischen verwandten Zeiger- und Referenztypen
(wird dynamisch während der Laufzeit aufgelöst)
Im Fehlerfall wird 0 zurück gegeben (Zeiger) oder eine Ausnahme
bad_cast geworfen (Referenzen).
Ist nur in Verbindung mit polymorphen Typen möglich
(virtuelle Methoden!)
Alternative: dynamic dispatch durch virtuelle Funktionen
21. Oktober 2008
51 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
52 / 59
Typumwandlung
Typumwandlung
Typumwandlung in C++
Typumwandlung im C-Stil
t y p e v a r = r e i n t e r p r e t _ c a s t < t y p e >(param ) ;
class A { . . . } ;
class B : public class A { . . . } ;
erzwungene Reinterpretation einer bestimmten Speicherstelle
ähnlich zu Typumwandlungen für Zeiger in C
(6= Typumwandlung im C-Stil)
keine Überprüfung - weder zur Übersetzungs- noch zur Laufzeit
in der Regel: Finger weg!
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
53 / 59
A∗
B∗
A∗
B∗
B∗
B∗
B∗
a = new A ( ) ;
b = new B ( ) ;
pa = b ;
b1 = a ;
b2 = pa ;
b3 = (B∗ ) pa ;
b4 = (B∗ ) a ;
//
//
//
//
//
//
//
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Typumwandlung
Von Java/C nach C++
21. Oktober 2008
54 / 59
21. Oktober 2008
56 / 59
Namensräume
Typumwandlung im C-Stil (considered harmful)
Java: Packages
Schlüsselwort package
package Bar ;
6= Typumwandlung in C
probiert verschiedene C++-Typumwandlungen:
1
2
3
4
5
OK
OK
OK
Fehler
Fehler
OK ( m i t e i n f a c h e r Vererbung )
F e h l e r ( n i c h t erkennbar )
public class Foo { . . . }
const_cast
static_cast
static_cast, dann const_cast
reinterpret_cast
reinterpret_cast, dann const_cast
Vollständiger Name der Klasse “Foo”: Bar.Foo
C++: Namensräume
Schlüsselwort namespace
das Ergebnis unterscheidet sich, je nachdem ob
alle Header eingebunden wurden 7→ static_cast oder
nur eine Deklaration verfügbar ist 7→ reinterpret_cast
namespace Bar {
solange es irgendwie geht: Finger weg!
Problem: Verwendung von C-Bibliotheken in C++-Programmen
}
class Foo { . . .
};
Vollständiger Name der Klasse “Foo”: Bar::Foo
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
55 / 59
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Funktionstemplates
Templates
Klassentemplates
Zweck: parametrisierbare Klassen
Zweck: generische Funktion für verschiedene Parameter- und
Rückgabetypen
Syntax:
Syntax:
template < class class_name > d e c l a r a t i o n
template < t y p e type_name > d e c l a r a t i o n
template < class class_name > d e c l a r a t i o n
template < t y p e type_name > d e c l a r a t i o n
Beispiel:
Beispiel:
template < t y p e T , i n t I > class Tuple {
T content [ I ] ;
public :
T get ( i n t i ) { return content [ i ] ; }
void s e t ( T v a l , i n t i ) { c o n t e n t [ i ] = v a l ; }
};
template < t y p e T > T max ( T a , T b ) {
return a > b ? a : b ;
}
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
57 / 59
21. Oktober 2008
59 / 59
Literatur
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
Templates
F. Scheler, P. Ulbrich, N. Böhm (Informatik 4)
Von Java/C nach C++
21. Oktober 2008
58 / 59
Herunterladen