Programowanie obiektowe

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

Programowanie obiektowe
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
C++ wykład 2 ( ) Klasy i obiekty.
Programowanie obiektowe III rok EiT
Programowanie obiektowe
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 7 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Kurs języka C++ – wykład 4 ( )
Programowanie obiektowe Wykład 9 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/15 Dariusz Wardowski.
Wykład 5 Klasa Vec i jej operatory 1.Kategorie operatorów 2.Operatory ogólne - przykłady 3.Operatory specjalne [ ], ( ) oraz –> 4.Operatory new i delete.
Ekonometria WYKŁAD 10 Piotr Ciżkowicz Katedra Międzynarodowych Studiów Porównawczych.
Tworzenie odwołania zewnętrznego (łącza) do zakresu komórek w innym skoroszycie Możliwości efektywnego stosowania odwołań zewnętrznych Odwołania zewnętrzne.
PRACA Z APLIKACJAMI SYSTEM PRZEMIESZCZANIA oraz NADZORU WYROBÓW AKCYZOWYCH EMCS PL 1.
Wyszukiwanie informacji w Internecie. Czym jest wyszukiwarka? INTERNET ZASOBY ZAINDEKSOWANE PRZEZ WYSZUKIWARKI Wyszukiwarka to mechanizm, który za pomocą.
Excel 2007 dla średniozaawansowanych zajęcia z dnia
Finansowanie wybranych działań w parkach narodowych przy udziale środków funduszu leśnego - zakres finansowy Warszawa, 06 kwietnia 2016r.
Ryzyko a stopa zwrotu. Standardowe narzędzia inwestowania Analiza fundamentalna – ocena kondycji i perspektyw rozwoju podmiotu emitującego papiery wartościowe.
EWALUACJA JAKO ISTOTNY ELEMENT PROJEKTÓW SYSTEMOWYCH Sonia Rzeczkowska.
OBSŁUGA KARTY DILO. Karta diagnostyki i leczenia onkologicznego zawiera: - oznaczenie pacjenta, pozwalające na ustalenie jego tożsamości, - oznaczenie.
Zmienne losowe Zmienne losowe oznacza się dużymi literami alfabetu łacińskiego, na przykład X, Y, Z. Natomiast wartości jakie one przyjmują odpowiednio.
ENERGIA to podstawowa wielkość fizyczna, opisująca zdolność danego ciała do wykonania jakiejś pracy, ruchu.fizyczna Energię w równaniach fizycznych zapisuje.
Algorytmy Informatyka Zakres rozszerzony
O konkursie Konkurs Employer Branding Stars (EBstars) jest organizowany przez portal HRstandard.pl na terenie Rzeczpospolitej Polskiej w oparciu o regulamin.
Model warstwowy OSI Model OSI (Open Systems Interconnection) opisuje sposób przepływu informacji między aplikacjami programowymi w jednej stacji sieciowej.
Budżet rodzinny Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego.
Menu Jednomiany Wyrażenia algebraiczne -definicja Mnożenie i dzielenie sum algebraicznych przez jednomian Mnożenie sum algebraicznych Wzory skróconego.
Ocena ryzyka zawodowego może być prosta – wystarczy tylko pięć kroków, by wykonać ją właściwie! Co to jest ryzyko zawodowe? Mówiąc najprościej, ryzyko.
Optymalna wielkość produkcji przedsiębiorstwa działającego w doskonałej konkurencji (analiza krótkookresowa) Przypomnijmy założenia modelu doskonałej.
Definiowanie i planowanie zadań typu P 1.  Planowanie zadań typu P  Zadania typu P to zadania unikalne służące zwykle dokonaniu jednorazowej, konkretnej.
Zasada równości szans kobiet i mężczyzn (w oparciu o standard minimum) Olsztyn, 6 czerwca 2016r.
1 Definiowanie i planowanie zadań budżetowych typu B.
Magdalena Garlińska Generator wniosków o dofinansowanie Program INNOCHEM.
O konkursie Konkurs Employer Branding Stars (EBstars) jest organizowany przez Employer Branding Institute Sp. z o.o. na terenie Rzeczpospolitej Polskiej.
API jądra do obsługi przestrzeni użytkownika Co jest tematem tej prezentacji: Transport danych pomiędzy przestrzeniami użytkownika i jądra (asm/uaccess.h)
Moduł II. Obszar formułowania Programów i Projektów.
Język Java Paweł Rajba
Dziedziczenie, polimorfizm, Interfejsy
Programowanie Obiektowe – Wykład 1
Schematy blokowe.
Kurs języka C++ – wykład 2 ( )
DEFINICJA I ZASTOSOWANIE W JĘZYKU HASKELL
SYSTEM KWALIFIKACJI, AWANSÓW I SPADKÓW
On-the-Fly Garbage Collection
Prezentacja o Ubuntu Jakub Kociemba 2TI.
Akademia C# - Lab2 Zmienne, instrukcje warunkowe, pętle, debugger,
Kurs języka C++ – wykład 6 ( )
Akademia C# lab. 9 Zdarzenia i delegaty.
Programowanie obiektowe Wykład 10
Programowanie Obiektowe – Wykład 2
Programowanie obiektowe
Wstęp do Informatyki - Wykład 3
Optymalizacja programów Open-Source
Lekcja 1 – Hello World! Visual Studio, coś łatwego na początek 
Kurs języka C++ – wykład 13 ( )
Programowanie obiektowe
Języki programowania.
Programowanie obiektowe
Podstawy informatyki Zygfryd Głowacz.
Programowanie obiektowe Wykład 11
Zmienne i typy danych w C#
Proste obliczenia w arkuszu kalkulacyjnym
Zdarzenia (eventy) Zdarzenia służą do powiadomienia użytkownika, gdy w używanej klasie dojdzie do pewnych wydarzeń zdefiniowanych przez twórcę klasy.
Implementacja rekurencji w języku Haskell
Znajdowanie liczb pierwszych w zbiorze
Język C++ Preprocesor Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła.
Język C++ Operatory Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła.
Autor: Magdalena Linowiecka
dr Robert Kowalczyk, PWSZ Płock
Zapis prezentacji:

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

Przydzielanie pamięci Programowanie obiektowe Wykład 3 Przydzielanie pamięci Poniżej przedstawiono w C++ dwie klasy obrazujące sposób rezerwacji pamięci. class Osoba { private: char imie[30]; char nazwisko[30]; int wiek; public: Osoba(){} Osoba(char i[], char n[], int w); }; Osoba::Osoba(char i[], char n[], int w) strcpy(imie,i); strcpy(nazwisko,n); wiek = w; } class Osoba { private: char* imie; char* nazwisko; int wiek; public: Osoba(); Osoba(char* i, char* n, int w); ~Osoba(); }; Osoba::Osoba() {imie = new char[1]; imie[0]=‘\0’; nazwisko = new char[1]; nazwisko[0]=‘\0’; } Osoba::Osoba(char* i, char* n, int w) imie = new char[strlen(i)+1]; strcpy(imie,i); nazwisko = new char[strlen(n)+1]; strcpy(nazwisko,n); wiek = w; Osoba::~Osoba() delete [] imie; delete [] nazwisko; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Pamięć dynamiczna – new i delete Programowanie obiektowe Wykład 3 Pamięć dynamiczna – new i delete Do zaalokowania pamięci w sposób dynamiczny używamy operatoa new. Zastosowanie tego operatora wiąże się jednak z podjęciem dodatkowych czynności takich jak rozbudowanie destruktora klasy oraz zsynchronizowanie rezerwacji pamięci w konstruktorach z jej zwolnieniem w destruktorze za pomocą operatora delete. Osoba::Osoba(char* i, char* n, int w) { imie = new char[strlen(i)+1]; strcpy(imie,i); nazwisko = new char[strlen(n)+1]; strcpy(nazwisko,n); wiek = w; } Osoba::~Osoba() { delete [] imie; delete [] nazwisko; } W przypadku dynamicznego przydzielania pamięci konieczne jest również utworzenie odpowiednich metod, które będą obsługiwały inicjalizację i przypisanie. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie obiektowe Wykład 3 Pole statyczne klasy Statyczna składowa klasy ma specjalną właściwość polegająca na tym, że program tworzy tylko jedną jej kopię, niezależnie od tego, ile obiektów danej klasy zostanie utworzonych. Innymi słowy pole statyczne klasy jest współdzielone przez wszystkie obiekty klasy. class Osoba { private: static int ileOsob; char* imie; char* nazwisko; int wiek; public: Osoba(); Osoba(char* i, char* n, int w); ~Osoba(); }; int Osoba::ileOsob = 0; Osoba::Osoba() { imie = new char[1]; imie[0]=‘\0’; nazwisko = new char[1]; nazwisko[0]=‘\0’; ileOsob++; } Osoba::Osoba(char* i, char* n, int w) imie = new char[strlen(i)+1]; strcpy(imie,i); nazwisko = new char[strlen(n)+1]; strcpy(nazwisko,n); wiek = w; Osoba::~Osoba() ileOsob--; delete [] imie; delete [] nazwisko; Pole statyczne inicjalizowane jest niezależnie poza deklaracją klasy i poza konstruktorami. Możliwe jest natomiast zainicjalizowanie stałego pola statycznego w deklaracji klasy. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie obiektowe Wykład 3 Pole statyczne klasy Statyczna składowa klasy ma specjalną właściwość polegająca na tym, że program tworzy tylko jedną jej kopię, niezależnie od tego, ile obiektów danej klasy zostanie utworzonych. Innymi słowy pole statyczne klasy jest współdzielone przez wszystkie obiekty klasy. class Osoba { private: static int ileOsob; char* imie; char* nazwisko; int wiek; public: Osoba(); Osoba(char* i, char* n, int w); ~Osoba(); }; int Osoba::ileOsob = 0; Osoba::Osoba() { imie = new char[1]; imie[1]=‘\0’; nazwisko = new char[1]; nazwisko[1]=‘0’; ileOsob++; } Osoba::Osoba(char* i, char* n, int w) imie = new char[strlen(i)+1]; strcpy(imie,i); nazwisko = new char[strlen(n)+1]; strcpy(nazwisko,n); wiek = w; Osoba::~Osoba() ileOsob--; delete [] imie; delete [] nazwisko; Pole statyczne inicjalizowane jest niezależnie poza deklaracją klasy i poza konstruktorami. Możliwe jest natomiast zainicjalizowanie stałego pola statycznego w deklaracji klasy. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie obiektowe Wykład 3 char * Pola składowe imie oraz nazwisko w konstruktorze klasy Osoba są wskaźnikami, a zatem konstruktor musi zaalokować pamięć odpowiednią dla danego łańcucha znaków przekazanego jako argument do konstruktora. strlen(char*) Funkcja zwraca długość łańcucha (nie uwzględnia końcowego znaku null) strcpy(cel, źródło) Funkcja kopiująca łańcuch znaków. Należy pamiętać, że instrukcja: nazwisko = n spowoduje tylko skopiowanie adresu. Osoba::Osoba(char* i, char* n, int w) { imie = new char[strlen(i)+1]; strcpy(imie,i); nazwisko = new char[strlen(n)+1]; strcpy(nazwisko,n); wiek = w; ileOsob++; } Przy czym wskaźnik do łańcucha można przekazać do konstruktora podczas inicjalizacji obiektu: Osoba o(„Jan”,”Kowalski”,37); dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

NazwaKlasy(const NazwaKlasy &); Programowanie obiektowe Wykład 3 Konstruktor kopiujący Podczas inicjalizacji jednego obiektu drugim, kompilator automatycznie generuje konstruktor zwany konstruktorem kopiującym. Zadaniem tego konstruktora jest kopiowanie obiektu istniejącego do obiektu nowo tworzonego. Konstruktor ten jest używany podczas inicjalizacji, a nie podczas przypisania. Osoba o1(„Jan”, „Dzik”, 47); Osoba o2 = o1; //działa konstruktor kopiujący Osoba o3; o3 = o1; // nie jest używany konstruktor kopiujący Prototyp konstruktora kopiującego: NazwaKlasy(const NazwaKlasy &); dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Kiedy działa konstruktor kopiujący? Programowanie obiektowe Wykład 3 Kiedy działa konstruktor kopiujący? Konstruktor kopiujący zostaje wywołany wówczas, gdy nowo tworzony obiekt jest inicjalizowany istniejącym obiektem tej samej klasy. Osoba o1(„Jan”, „Dzik”, 47); Osoba o2 = o1; Kompilator używa konstruktora kopiującego, gdy program generuje kopię obiektu (np. w sytuacji, gdy obiekt przekazywany jest do funkcji przez wartość). void f(Osoba o); //funkcja, do której przekazywany jest obiekt przez wartość. Osoba o1(„Alicja”, „Lis”, 32); f(o1); Niektóre kompilatory używają konstruktora kopiującego, gdy funkcja zwraca obiekt. Osoba g() { return Osoba(„Jan”,”Kowalski”,23); } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Co robi konstruktor kopiujący? Programowanie obiektowe Wykład 3 Co robi konstruktor kopiujący? Domyślny konstruktor kopiujący wykonuje tzw. kopiowanie płytkie, tzn. kopiuje tylko do nowotworzonego obiektu wartość każdej niestatycznej składowej kopiowanego obiektu. (Statyczne składowe nie są kopiowane, gdyż należą one do całej klasy, a nie pojedynczych obiektów). a x = 2 y = 4 z = true b i = 0 Obiekt b jest kopią obiektu a. Zmienna statyczna i nie jest kopiowana. class A { private: static int i; int x; double y; bool z; public: A(int _x, double _y, bool _z) x = _x; y = _y; z = _z; } }; int A::i = 0; int main() { A a(2,4,true); A b = a; //domyślny konstruktor kopiujący return 0; } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Przykład użycia jawnego konstruktora kopiującego Programowanie obiektowe Wykład 3 Przykład użycia jawnego konstruktora kopiującego Jeśli klasa zawiera pole statyczne, którego wartość jest zmieniana przez konstruktor (np. zliczanie utworzonych obiektów), wówczas należy zdefiniować w sposób jawny konstruktor kopiujący, który będzie aktualizował pole statyczne. class A { private: static int i; int x; double y; bool z; public: A(int _x, double _y, bool _z) x = _x; y = _y; z = _z; i++; } ~A(){i--;} A(const A & a) //konstruktor //kopiujący x = a.x; y = a.y; z = a.z; }; int A::i = 0; int main() { A a(2,4,true); A b = a; //działą jawny konstruktor kopiujący return 0; } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Obiekt b2 jest kopią obiektu b1. Programowanie obiektowe Wykład 3 Domyślny konstruktor kopiujący a łańcuchy znaków class B { private: char* tekst; int x; public: B(char* t, int _x) tekst = new char[strlen(t)+1]; strcpy(tekst,t); x = _x; } ~B() delete [] tekst; }; int main() { B b1(„Ala ma kota”,10); B b2 = b1; return 0; } b1 tekst = 0xbf858054 x = 10 Ala ma kota Obiekt b2 jest kopią obiektu b1. Adres 0xbf858054 b2 Jeżeli pole składowe klasy jest wskaźnikiem do łańcucha znaków, wówczas domyślny konstruktor kopiujący kopiuje jedynie adresy, a nie cały łańcuch znaków. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Domyślny konstruktor kopiujący a łańcuchy znaków c.d. Programowanie obiektowe Wykład 3 Domyślny konstruktor kopiujący a łańcuchy znaków c.d. class B { private: char* tekst; int x; public: B(char* t, int _x) tekst = new char[strlen(t)+1]; strcpy(tekst,t); x = _x; } ~B() delete [] tekst; wypisz() cout << tekst << „ „ << x << endl; }; void f(B b) // obiekt przekazywany przez wartość b.wypisz(); int main() { B b1(„Ala ma kota”,10); f(b1); b1.wypisz(); return 0; } Działanie programu: Ala ma kota 10 10 (ewentualnie wystąpi błąd) dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie obiektowe Wykład 3 Rozwiązanie problemu Jeśli klasa posiada składowe, które są wskaźnikami inicjalizowanymi za pomocą operatora new, wówczas należy napisać jawny konstruktor kopiujący, który skopiuje całe dane wskazywane przez wskaźniki. Jest to tzw. głębokie kopiowanie. class B { private: char* tekst; int x; public: B(char* t, int _x) tekst = new char[strlen(t)+1]; strcpy(tekst,t); x = _x; } B(const B & a) x = a.x; tekst = new char[strlen(a.tekst)+1]; strcpy(tekst,a.tekst); ~B() delete [] tekst; }; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Argument formalny (parametr) Programowanie obiektowe Wykład 3 Rozwiązanie problemu c.d. void f(B b) { b.wypisz(); } int main() B b1(„Ala ma kota”,10); f(b1); b1.wypisz(); return 0; b1 tekst = 0xbf858054 x = 10 Ala ma kota Adres 0xbf858054 b tekst = 0xbf858098 Argument rzeczywisty Argument formalny (parametr) Adres 0xbf858098 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

NazwaKlasy & NazwaKlasy::operator=(const NazwaKlasy &); Programowanie obiektowe Wykład 3 Problemy z operatorem = Analogiczne problemy, które pojawiają się podczas kopiowania obiektu, mogą się pojawić podczas przypisania jednego obiektu drugim. Operacja przypisania wykonywana jest poprzez operator przypisania (=), który podobnie jak konstruktor kopiujący może być przeciążony przez programistę. Prototyp operatora przypisania: NazwaKlasy & NazwaKlasy::operator=(const NazwaKlasy &); Operator = używany jest wówczas, gdy do utworzonego obiektu przypisujemy drugi, jak w przykładzie poniżej: Osoba o1(„Jan”, „Kowalski”, 45); Obiekt o2 = o1; //działa konstruktor kopiujący Osoba o3; o3 = o1; //działa operator przypisania Inicjalizacja obiektu obiektem istniejącym zawsze powoduje wywołanie konstruktora kopiującego, ponadto w niektórych kompilatorach użycie operatora = powoduje wywołanie funkcji operator=. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie obiektowe Wykład 3 Działanie operatora = Operator przypisania w postaci niejawnej (nieprzeciążonej przez użytkownika) podobnie jak domyślny konstruktor kopiujący kopiuje pola składowe obiektu (poza statycznymi). Jest to również tzw. płytkie kopiowanie, czego konsekwencją będzie wskazywanie tego samego łańcucha znaków poprzez wskaźnik w oryginalnym obiekcie jak i jego kopii. class Osoba { private: char* imie; char* nazwisko; int wiek; public: Osoba() {}; Osoba(char* i, char* n, int w); ~Osoba(); }; Osoba::Osoba(char* i, char* n, int w) imie = new char[strlen(i)+1]; strcpy(imie,i); nazwisko = new char[strlen(n)+1]; strcpy(nazwisko,n); wiek = w; ileOsob++; } Osoba::~Osoba() { ileOsob--; delete [] imie; delete [] nazwisko; } int main() { Osoba janek(„Jan”, „Kowalski”, 43); Osoba jan; jan = janek; return 0; } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Działanie domyślnego operatora = Programowanie obiektowe Wykład 3 Działanie domyślnego operatora = Po wywołaniu destruktora obiektu janek jan imie = 0xbf234354 nazwisko = 0xbf234390 wiek = 43 janek imie = 0xbf234354 nazwisko = 0xbf234390 wiek = 43 Jan Adres 0xbf234354 jan Kowalski Adres 0xbf234390 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Przeciążanie operatora = Programowanie obiektowe Wykład 3 Przeciążanie operatora = Aby uniknąć problemów związanych z operatorem przypisania, należy jawnie zdefiniować funkcję przeciążającą operator =, która wykona tzw. głęboką kopię. Mechanizm działania przeciążonego operatora = jest podobny do konstruktora kopiującego, przy czym należy pamiętać o następujących istotnych uwagach: Obiekt do którego będzie przypisywany drugi może odnosić się do danych, które zostały zaalokowane operatorem new, zatem operator = powinien zwolnić pamięć. W związku z punktem powyższym, nowa funkcja = nie powinna pozwolić na przypisanie do obiektu jego samego. Przeciążony operator = powinien zwracać referencję do obiektu, dzięki czemu możliwe będzie łączenie operatorów =. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Przeciążony operator = Programowanie obiektowe Wykład 3 Przeciążony operator = Osoba & Osoba::operator=(const Osoba & o) //uwaga 3 (funkcja zwraca referencję) { if (this == &o) return *this; //uwaga 2 (brak możliwości przypisania obiektu do samego siebie) delete [] imie; delete [] nazwisko; //uwaga 1 (zwolnienie niepotrzebnej pamięci) imie = new char[strlen(o.imie)+1]; strcpy(imie, o.imie); nazwisko = new char[strlen(o.nazwisko)+1]; strcpy(nazwisko, o.nazwisko); return *this; } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie obiektowe Wykład 3 Metoda statyczna class C { private: static int licz; int y; public: C(int _y); ~C(); static int ile(); }; int C::ile = 0; C::C(int _y) y = _y; licz++; } C::~C() licz--; int C::ile() return licz; Słowo kluczowe static występuje tylko w deklaracji, nie w definicji. Metoda statyczna nie może być wywołana przez obiekt (C++). Do metody statycznej odwołujemy się poprzez nazwę klasy i operator zasięgu :: Metoda statyczna może korzystać wyłącznie z pól statycznych klasy. int main() { C c(2); C c(10); cout << „Ilość utworzonych obiektów: ” << C::ile(); return 0; } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

 Dziękuję za uwagę Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ .