Programowanie uzupełnienie notatek: dr Jerzy Białkowski
1 2 3 4
Obiektowość języka C++ ˆ Klasa (rozszerzenie struktury), obiekt instancją klasy, konstruktory i destruktory ˆ Enkapsulacja - kapsułkowanie, ukrywanie informacji (public, protected, private, friend) ˆ i metody wirtualne ˆ Dziedziczenie
Obiektowość języka C++ ˆ Klasa (rozszerzenie struktury), obiekt instancją klasy, konstruktory i destruktory ˆ Enkapsulacja - kapsułkowanie, ukrywanie informacji (public, protected, private, friend) ˆ i metody wirtualne ˆ Dziedziczenie ˆ pola static ˆ Szablony, STL ˆ Operacje we-wy
1 #include <i o s t r e a m > 2 using namespace std ; 3 4 class Bryla { 5 public : 6 int l_wierzcholkow ; 7 int l_scian ; 8 int l_krawedzi ; 9 int euler ( ) { 10 return l_wierzcholkow + l_scian 11 l_krawedzi ; 12 } 13 } ; 14 15 16 17 18 19 20 21 22
23 class Prostopadloscian : public Bryla { 24 private : 25 double bok_a ; 26 double bok_b ; 27 double bok_c ; 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
44 class Czworoscian : public Bryla { 45 private : 46 double bok_podstawy ; 47 double wys_podstawy ; 48 double wys ; 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
65 66 int main ( ) { 67 Prostopadloscian P ( 2, 1, 3 ) ; 68 Czworoscian C ( 2, 1, 3 ) ; 69 cout << P. objetosc ( ) << "\n" ; 70 cout << C. objetosc ( ) << "\n" ; 71 72 Bryla *B ; 73 74 B = &P ; 75 cout << " Liczba Eulera =" 76 << B >euler ( ) << "\n" ; 77 78 B = &C ; 79 cout << " Liczba Eulera =" 80 << B >euler ( ) << "\n" ; 81 82 //B >o b j e t o s c ( ) ; Blad! 83 }
Metody wirtualne Metoda wirtualna jest metodą, która zastępuje siebie przez nową wersję, zdefiniowaną w klasie pochodnej. - wielopostaciowość wskaźników.
Metody wirtualne Metoda wirtualna jest metodą, która zastępuje siebie przez nową wersję, zdefiniowaną w klasie pochodnej. - wielopostaciowość wskaźników. ˆ Konstruktor nie może być wirtualny ˆ Destruktor powinien być wirtualny
Która metoda objetosc()? 1 class Bryla { 2 public : 3 int l_wierzcholkow ; 4 int l_scian ; 5 int l_krawedzi ; 6 int euler ( ) { 7 return l_wierzcholkow + l_scian 8 l_krawedzi ; 9 } 10 double objetosc ( ) { return 1; } 11 } ; 12 class Czworoscian : public Bryla { 13... 14 double objetosc ( )... } ; 15... 16 Czworoscian C ( 2, 1, 3 ) ; 17 Bryla *B ; 18 B = &C ; 19 cout << B >objetosc ( ) << "\n" ;
1 #include <i o s t r e a m > 2 using namespace std ; 3 4 class Bryla { 5 public : 6 int l_wierzcholkow ; 7 int l_scian ; 8 int l_krawedzi ; 9 int euler ( ) { 10 return l_wierzcholkow + l_scian 11 l_krawedzi ; 12 } 13 virtual double objetosc ( ) { 14 15 } 16 } ; 17 18 ostream& operator<<(ostream& os, Bryla * B ) { 19 os << " Objetosc wynosi " 20 << B >objetosc ( ) << "\n" ; 21 return os ; 22 }
23 24 class Prostopadloscian : public Bryla { 25 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
44 45 class Czworoscian : public Bryla { 46 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
65 66 int main ( ) { 67 Prostopadloscian P ( 2, 1, 3 ) ; 68 Czworoscian C ( 2, 1, 3 ) ; 69 Bryla *B ; 70 71 B = &P ; 72 cout << B >objetosc ( ) << "\n" ; 73 74 B = &C ; 75 cout << B >objetosc ( ) << "\n" ; 76 // l u b 77 cout << B ; 78 }
Wielodziedziczenie i związane z nim problemy
Wielodziedziczenie i związane z nim problemy ˆ dopuszcza wielodziedziczenie po klasach.
Wielodziedziczenie i związane z nim problemy ˆ dopuszcza wielodziedziczenie po klasach. ˆ Jeżeli w obu klasach bazowych znajduje się funkcja o tej samej nazwie dochodzi do konfiktu.
Wielodziedziczenie i związane z nim problemy ˆ dopuszcza wielodziedziczenie po klasach. ˆ Jeżeli w obu klasach bazowych znajduje się funkcja o tej samej nazwie dochodzi do konfiktu. ˆ W przypadku użycia funkcji która zaimplementowana jest w obu klasach bazowych dochodzi do błędu kompilacji
Wielodziedziczenie i związane z nim problemy ˆ dopuszcza wielodziedziczenie po klasach. ˆ Jeżeli w obu klasach bazowych znajduje się funkcja o tej 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).
Wielodziedziczenie i związane z nim problemy ˆ dopuszcza wielodziedziczenie po klasach. ˆ Jeżeli w obu klasach bazowych znajduje się funkcja o tej 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
Wielodziedziczenie i związane z nim problemy ˆ dopuszcza wielodziedziczenie po klasach. ˆ Jeżeli w obu klasach bazowych znajduje się funkcja o tej 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).
1 #include <i o s t r e a m > 2 using namespace std ; 3 4 class A { 5 public : 6 void Metoda ( ) { cout << "A" << endl ; } 7 } ; 8 9 class B { 10 public : 11 void MetodaB ( ) { cout << "B" << endl ; } 12 // Błędy : ( a l e po zakom. l i n i i 21 poprawne ) 13 // v o i d Metoda ( ) { cout << B1 << e n d l ; } 14 // v o i d Metoda ( i n t i ) { cout << B2\n ; } 15 } ; 16 17 class C : public A, public B { } ; 18 19 int main ( ) { 20 C c ; 21 c. Metoda ( ) ; 22 }
static ˆ 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.
Kiedy użyć static? ˆ zlicznie obiektów ˆ komunikacja pomiędzy obiektami ˆ wspólna informacja dla wszystkich obiektów
1 #include <i o s t r e a m > 2 using namespace std ; 3 class Bryla { 4 private : 5 static int liczba_obiektow ; 6 public : 7 int l_wierzcholkow ; 8 int l_scian ; 9 int l_krawedzi ; 10 int euler ( ) { 11 return l_wierzcholkow + l_scian 12 l_krawedzi ; 13 } 14 virtual double objetosc ( ) { return 1;} 15 16 static int ile ( ) { return liczba_obiektow ; } 17 Bryla ( ) { 18 liczba_obiektow++; } 19 Bryla ( ) { 20 liczba_obiektow ; } 21 } ; 22 int Bryla : : liczba_obiektow =0;
23 24 25 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 } ;
44 45 46 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 } ;
65 66 int main ( ) { 67 cout << Bryla : : ile ( ) << "\n" ; 68 69 Prostopadloscian P ( 2, 1, 3 ) ; 70 cout << Bryla : : ile ( ) << "\n" ; 71 72 Czworoscian C ( 2, 1, 3 ) ; 73 cout << Bryla : : ile ( ) << "\n" ; 74 75 if ( true ) { 76 Bryla B ; 77 cout << Bryla : : ile ( ) << "\n" ; 78 } 79 cout << Bryla : : ile ( ) << "\n" ; 80 81 Bryla * B1 ; 82 cout << Bryla : : ile ( ) << "\n" ; 83 84 }
W klasie pochodnej (podrzędnej) konstruktor może wywołać konstruktor klasy bazowej (nadrzędnej) i zainicjować swoje pola oraz pola klasy bazowej. 1 class A { 2 public : 3 int polea ; 4 A ( ) {... } 5 A ( int i, int j ) {... } 6 } ; 7 8 class B : public A { 9 int poleb ; 10 B ( int k ) : A ( 1, k ), poleb ( k ), polea ( k ) { 11... 12 } 13 } ;
1 #include <i o s t r e a m > 2 using namespace std ; 3 class Bryla { 4 private : 5 static int liczba_obiektow ; 6 public : 7 int l_wierzcholkow ; 8 int l_scian ; 9 int l_krawedzi ; 10 int euler ( ) { 11 return l_wierzcholkow + l_scian 12 l_krawedzi ; 13 } 14 15 virtual double objetosc ( ) { return 1;} 16 17 static int ile ( ) { return liczba_obiektow ; } 18 19 Bryla ( ) { 20 liczba_obiektow++; } 21 22
23 Bryla ( int l_w, int l_s, int l_k ) { 24 liczba_obiektow++; 25 l_wierzcholkow = l_w ; 26 l_scian = l_s ; 27 l_krawedzi = l_k ; 28 } 29 Bryla ( ) { liczba_obiektow ; } 30 } ; 31 int Bryla : : liczba_obiektow =0; 32 33 class Prostopadloscian : public Bryla { 34 private : 35 double bok_a ; 36 double bok_b ; 37 double bok_c ; 38 public : 39 Prostopadloscian ( double a=0, double b=0, double c=0) : Bryla ( 8, 6, 1 2 ) { 40 bok_a=a ; 41 bok_b=b ; 42 bok_c=c ; 43 }
44 double objetosc ( ) { 45 return bok_a * bok_b * bok_c ; 46 } 47 } ; 48 49 class Czworoscian : public Bryla { 50 private : 51 double bok_podstawy ; 52 double wys_podstawy ; 53 double wys ; 54 55 public : 56 Czworoscian ( double b=0, double w_p =0, double wys=0) : Bryla ( 4, 4, 6 ) { 57 bok_podstawy=b ; 58 wys_podstawy=w_p ; 59 this >wys=wys ; 60 } 61 double objetosc ( ) { 62 return bok_podstawy *wys_podstawy *wys / 6. 0 ; 63 } 64 } ;
65 66 int main ( ) { 67 cout << Bryla : : ile ( ) << "\n" ; 68 69 Prostopadloscian P ( 2, 1, 3 ) ; 70 cout << Bryla : : ile ( ) << "\n" ; 71 72 Czworoscian C ( 2, 1, 3 ) ; 73 cout << Bryla : : ile ( ) << "\n" ; 74 75 if ( true ) { 76 Bryla B ; 77 cout << Bryla : : ile ( ) << "\n" ; 78 } 79 cout << Bryla : : ile ( ) << "\n" ; 80 81 Bryla * B1 ; 82 cout << Bryla : : ile ( ) << "\n" ; 83 84 }
Funkcję lub metodę zaprzyjaźnioną tworzymy w celu uzyskania dostępu do prywatnych składowych klasy. 1 class A { 2 private : 3 int polea ; 4 5 public : 6 A ( ) { polea =5;} 7 friend int funkcja ( A&) ; 8 } ; 9 10 int funkcja ( A& obja ) { 11 return obja. polea ; 12 } 13 14 int main ( ) { 15 A obja ; 16 cout << funkcja ( obja ) << endl ; 17 }
Dziękuję za uwagę.