Programowanie C/C++ Jezyk C++ wykład VII
Transkrypt
Programowanie C/C++ Jezyk C++ wykład VII
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Programowanie C/C++
Język C++
wykład VII
Przyjaźń
dr Jarosław Mederski
uzupełnienie notatek: dr Jerzy Białkowski
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
1 Polimorfizm
Spis
Polimorfizm
Pola i metody
statyczne
2 Pola i metody statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
3 Lista inicjatorów konstruktora
4 Przyjaźń
Programowanie
C/C++
Język C++
wykład VII
Obiektowość języka C++
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
Klasa (rozszerzenie struktury), obiekt instancją klasy,
konstruktory i destruktory
Enkapsulacja - kapsułkowanie, ukrywanie informacji
(public, protected, private, friend)
Polimorfizm i metody wirtualne
Dziedziczenie
Programowanie
C/C++
Język C++
wykład VII
Obiektowość języka C++
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
Klasa (rozszerzenie struktury), obiekt instancją klasy,
konstruktory i destruktory
Enkapsulacja - kapsułkowanie, ukrywanie informacji
(public, protected, private, friend)
Polimorfizm i metody wirtualne
Dziedziczenie
pola static
Szablony, STL
Operacje we-wy
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# include <i o s t r e a m >
using namespace std ;
class Bryla {
public :
int l_wierzcholkow ;
int l_scian ;
int l_krawedzi ;
int euler ( ) {
return l_wierzcholkow + l_scian
−l_krawedzi ;
}
};
class Prostopadloscian : public Bryla {
private :
double bok_a ;
26
double bok_b ;
27
double bok_c ;
Programowanie 23
C/C++
24
Język C++
wykład VII 25
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
28
29 public :
30
Prostopadloscian ( double a=0, double b=0, ←-
double c=0){
31
bok_a=a ;
32
bok_b=b ;
33
bok_c=c ;
34
l_wierzcholkow =8;
35
l_scian =6;
36
l_krawedzi =12;
37
}
38
double objetosc ( ) {
39
return bok_a * bok_b * bok_c ;
40
}
41 } ;
42
43
class Czworoscian : public Bryla {
private :
double bok_podstawy ;
47
double wys_podstawy ;
48
double wys ;
Programowanie 44
C/C++
45
Język C++
wykład VII 46
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
49
50 public :
51
Czworoscian ( double b=0, double w_p =0, double←-
wys=0){
52
bok_podstawy=b ;
53
wys_podstawy=w_p ;
54
this−>wys=wys ;
55
l_wierzcholkow =4;
56
l_scian =4;
57
l_krawedzi =6;
58
}
59
double objetosc ( ) {
60
return bok_podstawy * wys_podstawy * wys / 6 . 0 ;
61
}
62 } ;
63
64
Programowanie 65
C/C++
66
Język C++
wykład VII 67
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
int main ( ) {
Prostopadloscian P ( 2 , 1 , 3 ) ;
68
Czworoscian C ( 2 , 1 , 3 ) ;
69
cout << P . objetosc ( ) << "\n" ;
70
cout << C . objetosc ( ) << "\n" ;
71
72
73
74
75
76
77
78
79
80
81
82
83 }
Bryla * B ;
B = &P ;
cout << " Liczba Eulera ="
<< B−>euler ( ) << "\n" ;
B = &C ;
cout << " Liczba Eulera ="
<< B−>euler ( ) << "\n" ;
//B−>o b j e t o s c ( ) ; Bla d !
Programowanie
C/C++
Język C++
wykład VII
Metody wirtualne
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
Metoda wirtualna jest metodą, która zastępuje siebie przez
nową wersję, zdefiniowaną w klasie pochodnej. Polimorfizm wielopostaciowość wskaźników.
Programowanie
C/C++
Język C++
wykład VII
Metody wirtualne
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
Metoda wirtualna jest metodą, która zastępuje siebie przez
nową wersję, zdefiniowaną w klasie pochodnej. Polimorfizm wielopostaciowość wskaźników.
Konstruktor nie może być wirtualny
Destruktor powinien być wirtualny
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Która metoda objetosc()?
class Bryla {
public :
int l_wierzcholkow ;
int l_scian ;
int l_krawedzi ;
int euler ( ) {
return l_wierzcholkow + l_scian
−l_krawedzi ;
}
double objetosc ( ) { return −1; }
};
class Czworoscian : public Bryla {
...
double objetosc ( ) . . . } ;
...
Czworoscian C ( 2 , 1 , 3 ) ;
Bryla * B ;
B = &C ;
cout << B−>objetosc ( ) << "\n" ;
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# include <i o s t r e a m >
using namespace std ;
class Bryla {
public :
int l_wierzcholkow ;
int l_scian ;
int l_krawedzi ;
int euler ( ) {
return l_wierzcholkow + l_scian
− l_krawedzi ;
}
virtual double objetosc ( ) {
}
};
ostream& operator<<(ostream& os , Bryla * B ) {
os << " Objetosc wynosi "
<< B−>objetosc ( ) << "\n" ;
return os ;
}
Programowanie 23
C/C++
24
Język C++
wykład VII 25
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
class Prostopadloscian : public Bryla {
private :
26
double bok_a ;
27
double bok_b ;
28
double bok_c ;
29
30 public :
31
Prostopadloscian ( double a=0, double b=0, ←-
double c=0){
32
bok_a=a ;
33
bok_b=b ;
34
bok_c=c ;
35
l_wierzcholkow =8;
36
l_scian =6;
37
l_krawedzi =12;
38
}
39
double objetosc ( ) {
40
return bok_a * bok_b * bok_c ;
41
}
42 } ;
43
Programowanie 44
C/C++
45
Język C++
wykład VII 46
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
class Czworoscian : public Bryla {
private :
47
double bok_podstawy ;
48
double wys_podstawy ;
49
double wys ;
50
51 public :
52
Czworoscian ( double b=0, double w_p =0, double←-
wys=0){
53
bok_podstawy=b ;
54
wys_podstawy=w_p ;
55
this−>wys=wys ;
56
l_wierzcholkow =4;
57
l_scian =4;
58
l_krawedzi =6;
59
}
60
double objetosc ( ) {
61
return bok_podstawy * wys_podstawy * wys / 6 . 0 ;
62
}
63 } ;
64
Programowanie 65
C/C++
66
Język C++
wykład VII 67
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
int main ( ) {
Prostopadloscian P ( 2 , 1 , 3 ) ;
68
Czworoscian C ( 2 , 1 , 3 ) ;
69
Bryla * B ;
70
71
72
73
74
75
76
77
78 }
B = &P ;
cout << B−>objetosc ( ) << "\n" ;
B = &C ;
cout << B−>objetosc ( ) << "\n" ;
// l u b
cout << B ;
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
Wielodziedziczenie
i związane z nim problemy
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
Wielodziedziczenie
i związane z nim problemy
Język C++ dopuszcza wielodziedziczenie po klasach.
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Wielodziedziczenie
i związane z nim problemy
Spis
Język C++ dopuszcza wielodziedziczenie po klasach.
Polimorfizm
Jeżeli w obu klasach bazowych znajduje się funkcja o tej
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
samej nazwie dochodzi do konfiktu.
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Wielodziedziczenie
i związane z nim problemy
Spis
Język C++ dopuszcza wielodziedziczenie po klasach.
Polimorfizm
Jeżeli w obu klasach bazowych znajduje się funkcja o tej
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
samej nazwie dochodzi do konfiktu.
W przypadku użycia funkcji która zaimplementowana jest
w obu klasach bazowych dochodzi do błędu kompilacji
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Wielodziedziczenie
i związane z nim problemy
Spis
Język C++ dopuszcza wielodziedziczenie po klasach.
Polimorfizm
Jeżeli w obu klasach bazowych znajduje się funkcja o tej
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
samej nazwie dochodzi do konfiktu.
W przypadku użycia funkcji która zaimplementowana jest
w obu klasach bazowych dochodzi do błędu kompilacji
nawet w przypadku gdy te funkcje różnią się argumentami
(są przeciążone).
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Wielodziedziczenie
i związane z nim problemy
Spis
Język C++ dopuszcza wielodziedziczenie po klasach.
Polimorfizm
Jeżeli w obu klasach bazowych znajduje się funkcja o tej
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
samej nazwie dochodzi do konfiktu.
W przypadku użycia funkcji która zaimplementowana jest
w obu klasach bazowych dochodzi do błędu kompilacji
nawet w przypadku gdy te funkcje różnią się argumentami
(są przeciążone).
W większości obiektowych języków programowania (też
powstaych na bazie języka C++) nie jest możliwe
dziedziczenie po klasach
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Wielodziedziczenie
i związane z nim problemy
Spis
Język C++ dopuszcza wielodziedziczenie po klasach.
Polimorfizm
Jeżeli w obu klasach bazowych znajduje się funkcja o tej
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
samej nazwie dochodzi do konfiktu.
W przypadku użycia funkcji która zaimplementowana jest
w obu klasach bazowych dochodzi do błędu kompilacji
nawet w przypadku gdy te funkcje różnią się argumentami
(są przeciążone).
W większości obiektowych języków programowania (też
powstaych na bazie języka C++) nie jest możliwe
dziedziczenie po klasach, ale możliwe jest
wielodziedziczenie po interfejsach (iterfejsy są podobne do
klas, ale nie zawierają pól i zawierają jedynie deklaracje
metod – bez definicji).
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# include <i o s t r e a m >
using namespace std ;
class A {
public :
void Metoda ( ) { cout << "A" << endl ; }
};
class B {
public :
void MetodaB ( ) { cout << "B" << endl ; }
// Błędy : ( a l e po zakom . l i n i i 21 poprawne )
// v o i d Metoda ( ) { c o u t << ”B1” << e n d l ; }
// v o i d Metoda ( i n t i ) { c o u t << ”B2\n ” ; }
};
class C : public A , public B { } ;
int main ( ) {
C c;
c . Metoda ( ) ;
}
Programowanie
C/C++
Język C++
wykład VII
static
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
Pole static jest wspólne dla wszystkich obiektów.
Domyślna wartość 0, inicjalicacja pola w pliku
implementacji klasy.
Metoda statyczna może być wywołana nawet, gdy nie
istnieją obiekty danej klasy.
Metoda statyczna może odwoływać się tylko do
składowych statycznych, nie zawiera this.
Programowanie
C/C++
Język C++
wykład VII
Kiedy użyć static?
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
zlicznie obiektów
komunikacja pomiędzy obiektami
wspólna informacja dla wszystkich obiektów
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# include <i o s t r e a m >
using namespace std ;
class Bryla {
private :
static int liczba_obiektow ;
public :
int l_wierzcholkow ;
int l_scian ;
int l_krawedzi ;
int euler ( ) {
return l_wierzcholkow + l_scian
− l_krawedzi ;
}
virtual double objetosc ( ) { return −1;}
static int ile ( ) { return liczba_obiektow ; }
Bryla ( ) {
liczba_obiektow++; }
˜ Bryla ( ) {
liczba_obiektow −−; }
};
int Bryla : : liczba_obiektow =0;
Programowanie 23
C/C++
24
Język C++
wykład VII 25
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
class Prostopadloscian : public Bryla {
26 private :
27
double bok_a ;
28
double bok_b ;
29
double bok_c ;
30
31 public :
32
Prostopadloscian ( double a=0, double b=0, ←-
double c=0){
33
bok_a=a ;
34
bok_b=b ;
35
bok_c=c ;
36
l_wierzcholkow =8;
37
l_scian =6;
38
l_krawedzi =12;
39
}
40
double objetosc ( ) {
41
return bok_a * bok_b * bok_c ;
42
}
43 } ;
Programowanie 44
C/C++
45
Język C++
wykład VII 46
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
class Czworoscian : public Bryla {
47 private :
48
double bok_podstawy ;
49
double wys_podstawy ;
50
double wys ;
51
52 public :
53
Czworoscian ( double b=0, double w_p =0, double←-
wys=0){
54
bok_podstawy=b ;
55
wys_podstawy=w_p ;
56
this−>wys=wys ;
57
l_wierzcholkow =4;
58
l_scian =4;
59
l_krawedzi =6;
60
}
61
double objetosc ( ) {
62
return bok_podstawy * wys_podstawy * wys / 6 . 0 ;
63
}
64 } ;
Programowanie 65
C/C++
66
Język C++
wykład VII 67
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
int main ( ) {
cout << Bryla : : ile ( ) << "\n" ;
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 }
Prostopadloscian P ( 2 , 1 , 3 ) ;
cout << Bryla : : ile ( ) << "\n" ;
Czworoscian C ( 2 , 1 , 3 ) ;
cout << Bryla : : ile ( ) << "\n" ;
if ( true ) {
Bryla B ;
cout << Bryla : : ile ( ) << "\n" ;
}
cout << Bryla : : ile ( ) << "\n" ;
Bryla * B1 ;
cout << Bryla : : ile ( ) << "\n" ;
Programowanie
C/C++
Język C++
wykład VII
Lista inicjatorów konstruktora
W klasie pochodnej (podrzędnej) konstruktor może wywołać
konstruktor klasy bazowej (nadrzędnej) i zainicjować swoje pola
oraz pola klasy bazowej.
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
1
2
3
4
5
6
7
8
9
10
11
12
13
class A {
public :
int poleA ;
A() { . . . }
A ( int i , int j ) { . . . }
};
class B : public A {
int poleB ;
B ( int k ) : A ( 1 , k ) , poleB ( k ) , poleA ( k )
...
}
};
{
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# include <i o s t r e a m >
using namespace std ;
class Bryla {
private :
static int liczba_obiektow ;
public :
int l_wierzcholkow ;
int l_scian ;
int l_krawedzi ;
int euler ( ) {
return l_wierzcholkow + l_scian
− l_krawedzi ;
}
virtual double objetosc ( ) { return −1;}
static int ile ( ) { return liczba_obiektow ; }
Bryla ( ) {
liczba_obiektow++; }
Programowanie 23
C/C++
24
Język C++
wykład VII 25
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Bryla ( int l_w , int l_s , int l_k ) {
liczba_obiektow++;
l_wierzcholkow = l_w ;
l_scian = l_s ;
l_krawedzi = l_k ;
}
˜ Bryla ( ) { liczba_obiektow −−; }
};
int Bryla : : liczba_obiektow =0;
class Prostopadloscian : public Bryla {
private :
double bok_a ;
double bok_b ;
double bok_c ;
public :
Prostopadloscian ( double a=0, double b=0, ←double c=0) : Bryla ( 8 , 6 , 1 2 ) {
bok_a=a ;
bok_b=b ;
bok_c=c ;
}
double objetosc ( ) {
return bok_a * bok_b * bok_c ;
}
Programowanie 44
C/C++
45
Język C++
wykład VII 46
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
};
class Czworoscian : public Bryla {
private :
double bok_podstawy ;
double wys_podstawy ;
double wys ;
public :
Czworoscian ( double b=0, double w_p =0, double←wys=0) : Bryla ( 4 , 4 , 6 ) {
bok_podstawy=b ;
wys_podstawy=w_p ;
this−>wys=wys ;
}
double objetosc ( ) {
return bok_podstawy * wys_podstawy * wys / 6 . 0 ;
}
};
Programowanie 65
C/C++
66
Język C++
wykład VII 67
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
int main ( ) {
cout << Bryla : : ile ( ) << "\n" ;
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 }
Prostopadloscian P ( 2 , 1 , 3 ) ;
cout << Bryla : : ile ( ) << "\n" ;
Czworoscian C ( 2 , 1 , 3 ) ;
cout << Bryla : : ile ( ) << "\n" ;
if ( true ) {
Bryla B ;
cout << Bryla : : ile ( ) << "\n" ;
}
cout << Bryla : : ile ( ) << "\n" ;
Bryla * B1 ;
cout << Bryla : : ile ( ) << "\n" ;
Funkcję lub metodę zaprzyjaźnioną tworzymy w celu uzyskania
dostępu do prywatnych składowych klasy.
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A {
private :
int poleA ;
public :
A ( ) { poleA =5;}
friend int funkcja ( A&) ;
};
int funkcja ( A& objA ) {
return objA . poleA ;
}
int main ( ) {
A objA ;
cout << funkcja ( objA ) << endl ;
}
Programowanie
C/C++
Język C++
wykład VII
dr Jarosław
Mederski
Spis
Polimorfizm
Pola i metody
statyczne
Lista
inicjatorów
konstruktora
Przyjaźń
Dziękuję za uwagę.