Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Podobne dokumenty
Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Język C++ wykład VIII

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Dziedziczenie & W slajdach są materiały zapożyczone z

Programowanie obiektowe

Plik klasy. h deklaracje klas

TEMAT : KLASY POLIMORFIZM

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

TEMAT : KLASY DZIEDZICZENIE

Enkapsulacja, dziedziczenie, polimorfizm

Zaawansowane programowanie w języku C++ Programowanie obiektowe

dr inż. Jarosław Forenc

Programowanie 2. Język C++. Wykład 9.

Mechanizm dziedziczenia

Programowanie obiektowe w języku

Programowanie 2. Język C++. Wykład 3.

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Dziedziczenie. Ogólna postać dziedziczenia klas:

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

Materiały do zajęć VII

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Wstęp do Programowania 2

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Programowanie obiektowe

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Do czego służą klasy?

Programowanie Obiektowe i C++

Podstawy Programowania Obiektowego

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Zaawansowane programowanie w języku C++ Klasy w C++

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie obiektowe w C++ Wykład 12

Abstrakcyjny typ danych

Laboratorium 1 - Programowanie proceduralne i obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 2

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie Obiektowew języku C++ Zadania L4

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Programowanie, część I

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Mechanizm dziedziczenia

Programowanie Obiektowe i C++

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

Hermetyzacja oraz pola i metody statyczne

Projektowanie klas c.d. Projektowanie klas przykład

Programowanie 2. Język C++. Wykład Relacje między klasami, klasy zagnieŝdŝone, klasy lokalne

Wykład 4: Klasy i Metody

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Technologie i usługi internetowe cz. 2

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Informatyka 2. Wykład nr 3 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Programowanie obiektowe

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Programowanie, część I

Programowanie obiektowe język C++

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Pola i metody statyczne

Języki i paradygmaty programowania

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Definiowanie własnych klas

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Informatyka II Laboratorium 3 : Programowania obiektowe C++ - dziedziczenie

PARADYGMATY PROGRAMOWANIA Wykład 4

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Podstawy programowania w języku C++ Zadania - dziedziczenie i polimorfizm

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie Obiektowew języku C++ Zadania L9

Wprowadzenie do programowanie obiektowego w języku C++

Wstęp do Programowania 2

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Wyjątki (exceptions)

Wyliczanie wyrażenia obiekty tymczasowe

Język C++ Programowanie obiektowe

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Operacje wejścia/wyjścia (odsłona druga) - pliki

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Programowanie obiektowe Wykład 1. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

Programowanie obiektowe

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

C++ - [4-7] Polimorfizm

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Transkrypt:

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