Klassen, Vererbung
Philipp Lucas
phlucas@cs.uni-sb.de
Sebastian Hack
hack@cs.uni-sb.de
Wintersemester 2008/09
saarland
university
computer science
Inhalt
Klassen in C++
Sichtbarkeit
Erzeugen von Objekten
Vererbung
Methoden
Uberladen
Default-Parameter
virtual
C++
Ubersicht
I
I
Schablonen (templates)
Operator
uberladung
Uberladung
von Funktionen
Referenzen
Umgebungen (namespaces)
...
Weitestgehend abwartskompatibel zu C
Interoperabel mit C:
C kann C++ Funktionen rufen und umgekehrt
Klassen in C++
class Bruch {
int _z , _n ;
void kuerze () {
int g = ggT ( _z , _n );
_z /= g ;
_n /= g ;
}
bool istGanz () { return _n == 1; }
Bruch ( int z , int n ) : _z ( z ) , _n ( n ) { }
};
Spezialsyntax f
ur die Initialisierung der Felder
Klassen in C++
Sichtbarkeit
class Bruch {
int _z , _n ;
void kuerze () {
int g = ggT ( _z , _n );
_z /= g ;
_n /= g ;
}
public :
bool istGanz () { return _n == 1; }
Bruch ( int z , int n )
: _z ( z ) , _n ( n ) { }
};
I
Wie in Java kann man die Sichtbarkeit von Methoden und Feldern
einschranken:
public u
berall sichtbar
protected Nur in Klasse und Unterklassen sichtbar
private Nur in Klasse selbst sichtbar
+ Keine Paket-Sichtbarkeit wie in Java
5
Klassen in C++
Sichtbarkeit
class A {
public :
...
private :
...
public :
...
protected :
...
};
I
I
Klassen in C++
Erzeugen von Objekten
void test () {
Bruch eins ;
Bruch einhalb (1 , 2);
...
}
I
(im Unterschied zu C)
Klassen in C++
Erzeugen von Objekten
void test () {
Bruch eins ;
Bruch einhalb (1 , 2);
...
}
I
I
I
I
Die Lebenszeit von eins und einhalb ist auf die Ausf
uhrung von
test beschrankt
Kehrt test zur
uck, sterben beide Objekte
eins und einhalb wurden in der Aufrufschachtel von test angelegt
Man kann Objekte auch auf der Halde erzeugen
void test () {
Bruch * eins = new Bruch ();
Bruch * einhalb = new Bruch (1 , 2);
...
}
I
I
delete ruft den Destruktor auf und gibt den Speicher wieder frei
Wozu Destruktoren?
delete ruft den Destruktor auf und gibt den Speicher wieder frei
Wozu Destruktoren?
I
Regel
In C++ immer new und delete verwenden
Reihungen
Mit
A * arr = new A [10];
Das Freigeben muss mit delete[] erfolgen, und nicht mit delete
delete arr ;
delete [] arr ;
// Undefiniertes Verhalten
// Ruft Destruktoren aller Elemente auf
Fallstrick: Einem Zeiger sieht man nicht an, ob er auf eines oder auf
mehrere Objekte zeigt
10
Vererbung
Sichtbarkeit
11
Vererbung
Initialisierung
12
Methoden
Uberladen
class Bruch {
public :
void set ( int z , int n )
{ _z = z ; _n = n ; }
void set ( int z )
{ _z = z ; _n = 1; }
void set ( const Bruch & b ) { _z = b . _z ; _n = b . _n ; }
};
Methoden k
onnen u
berladen werden
Methoden mit gleichem Namen m
ussen sich in den Typen der
Parameter unterscheiden
Wie in Java
13
Operatoruberladung
Ausblick
I
anstatt (a, b)
und
a
I
anstatt (a)
14
Default-Parameter
class Bruch {
...
public :
void set ( int z , int n = 1) { _z = z ; _n = n ; }
void set ( const Bruch & b )
{ _z = b . _z ; _n = b . _n ; }
};
I
I
I
I
Methodenparameter k
onnen mit voreingestellten Werten
gekennzeichnet werden
Wird kein anderer Wert vom Aufrufer gew
unscht, kann das
Argument entfallen
Default-Parameter sind immer die letzten in der Parameterliste
Es darf zu keinen Widerspr
uchen kommen,
z.B. ware im obigen Beispiel die Methode
void set ( int z ) { ... }
Uberschreiben
I
I
I
I
struct A {
char f ()
{
virtual char g () {
};
struct B : public A {
char f ()
{
virtual char g () {
};
void test () {
A * a = new B (); //
B * b = new B (); //
a - > f ();
//
a - > g ();
//
b - > f ();
//
b - > g ();
//
}
return A ; }
return A ; }
return B ; }
return B ; }
statischer Typ : A
statischer Typ : B
Ergebnis : A
Ergebnis : B
Ergebnis : B
Ergebnis : B
16
Destruktoren
I
An der Stelle der Destruktion kann der statische Typ unpraziser sein
class Vector {
int _len ;
double * _arr ;
public :
Vector ( int len ) : _len ( len ) , _arr ( new double [ _len ]) { }
virtual ~ Vector () { delete [] _arr ; }
};
17
Inhalt
Klassen in C++
Sichtbarkeit
Erzeugen von Objekten
Vererbung
Methoden
Uberladen
Default-Parameter
virtual
18
Ubersicht
I
I
I
I
C++ Ubersetzer
k
onnen die meisten C Programme u
bersetzen
Man kann C++ Funktionen f
ur C Programme rufbar machen
Die C-Kompatibilitat von C++ basiert auf C90
+ Das meiste aus C99 ist in C++ nicht verf
ugbar
19
Zur Aufl
osung der Uberladung
verwendet C++ name mangling
Beispiel:
// foo . c
int foo ( double x , char s ) {
...
}
Ubersetzt
man die Datei mit c++, dann heit das Symbol Z3foodc
+ Die Parametertypen werden in den Symbolnamen kodiert
Ubersetzt
man die Datei mit cc, dann heit das Symbol foo
20
Mochte man C-Funktionen von C++ aus rufen, so muss man das
name mangling f
ur diese deaktivieren
// myprg . cpp
extern " C " int foo ( double x , char s );
int myfunc () {
return foo (1.234 , A );
}
C++ Ubersetzer
wei nun, dass foo in einer C-Bibliothek liegt
21
/* MYHEADER_H */
22
I
I
foo ;
{
foo { };
sizeof ( foo );
In C und C++ g
ultig
R
uckgabewert in C: sizeof(int), in C++: sizeof(struct foo)
23
usw.
24
I
I
25