Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Programowanie obiektowe Dynamiczne tworzenie obiektów klas 2
Dynamiczne obiekty klas Możemy utworzyć obiekt dynamiczny alokując pamięć i używając wskaźników (podobnie jak dynamiczne zmienne proste i struktury). Obiekt tworzy się za pomocą operatora new i przypisuje do wskaźnika tego samego typu co klasa. Obiekt usuwa się z pamięci za pomocą operatora delete. Operacja ta zwalnia pamięć i wywołuje destruktor obiektu. Obiekty stworzone w sposób dynamiczny zawsze trzeba ręcznie usunąć z pamięci gdy nie są już używane (np. podczas zamykania programu). W C++ nie ma mechanizmów automatycznego oczyszczania pamięci tak jak np. w Java i C#. 3
Dynamiczne obiekty klas Do składników klasy dynamicznej możemy odwoływać się operatorem strzałki -> 4
Dynamiczne obiekty klas Do składników klasy dynamicznej możemy również odwoływać się operatorem strzałki. (kropka), ale zapis ten niej jest intuicyjny. 5
Dynamiczne obiekty klas Wskaźniki do obiektów możemy zapamiętywać w tablicach. 6
Programowanie obiektowe Składniki statyczne klas 7
Składniki statyczne klas Pola statyczne stosujemy, gdy poszczególne egzemplarze obiektów danej klasy powinny posługiwać się tą samą daną. Dana statyczna jest w pamięci tworzona jednokrotnie i jest wspólna dla wszystkich egzemplarzy obiektów danej klasy. Co więcej: istnieje nawet wtedy, gdy jeszcze nie zdefiniowaliśmy ani jednego egzemplarza obiektu tej klasy. class klasa{ public : int x ; static int skladnik ; }; 8
Składniki statyczne klas Deklaracja składnika statycznego w ciele klasy nie jest jego definicją. Definicję musimy umieścić gdzieś tak, by miała zakres pliku. Czyli tak, jakbyśmy umieszczali definicję zmiennej globalnej. Definicja taka może zawierać inicjalizację. int klasa::składnik = 6 ; Składnik statyczny może być także typu private. Inicjalizacja składnika statycznego możliwa jest nawet jeśli jest on typu private. Po inicjalizacji prywatny składnik statyczny nie może być przez obcych czytany ani zapisywany. 9
Składniki statyczne klas Do składnika statycznego można odwołać się na trzy sposoby: 1. Za pomocą nazwy klasy i operatora zakresu :: klasa::składnik 2. Jeśli istnieją już jakieś egzemplarze obiektów klasy, to możemy posłużyć się operatorem. obiekt.składnik 3. Jeśli mamy wskaźnik do obiektu stosujemy operator -> *wsk = &obiekt; wsk->składnik; 10
Składniki statyczne klas 11
Składniki statyczne klas Przykład: Klasa automatycznie nadająca kolejne numery id nowo tworzonym obiektom 12
Programowanie obiektowe Konstruktor i destruktory c.d. 13
Konstruktor i destruktor Jawne wywołanie konstruktora Obiekt może być też stworzony przez jawne wywołanie konstruktora. W efekcie otrzymujemy obiekt, który nie ma nazwy, a czas jego życia ogranicza się do wyrażenia, w którym go użyto. nazwa_klasy(argumenty) Uwaga: nie stosujemy zapisu: obiekt.funkcja_składowa(argumenty) Konstruktor nie jest wywoływany na rzecz jakiegoś obiektu, bo ten obiekt jeszcze nie istnieje. Zadaniem konstruktora jest go utworzyć. 14
Konstruktor i destruktor Jawne wywołanie destruktora Należy podać całą jego nazwę. Jawne wywołanie destruktora nie może się zacząć od ~(wężyka) i wcześniej musi być albo obiekt, na rzecz którego jest wywoływany i kropka lub wskaźnik do obiektu -> obiekt.~klasa(); wskaznik->~klasa(); 15
Konstruktor i destruktor Konstruktor domniemany Konstruktor domniemany to taki konstruktor, który można wywołać bez żadnego argumentu. class klasa { public : klasa(); //konst. domniemany }; 16
Konstruktor i destruktor Konstruktor domniemany Konstruktor domniemany może posiadać dowolną ilość parametrów, jednak wszystkie muszą mieć zdefiniowaną wartość domyślną (aby nie trzeba było podawać ich wartości podczas inicjacji klasy). 17
Konstruktor i destruktor Konstruktor domniemany z parametrami domyślnymi 18
Konstruktor i destruktor Przeciążanie konstruktorów Jedna klasa może posiadać kilka konstruktorów 19
Konstruktor i destruktor Przeciążanie konstruktorów 20
Konstruktor i destruktor Lista inicjalizacyjna konstruktora Czasami zachodzi potrzeba zainicjowania zmiennej w trakcie tworzenia klasy, a nie po jej utworzeniu. Lista inicjalizacyjna to lista oddzielonych przecinkami identyfikatorów pól (składowych) z podanymi w nawiasach okrągłych argumentami dla konstruktorów obiektów będących składowymi tworzonego obiektu. Zwykle są to jednocześnie argumenty formalne definiowanego konstruktora, choć nie musi tak być. 21
Konstruktor i destruktor Lista inicjalizacyjna konstruktora Wartość zmiennej WIEK, która jest argumentem konstruktora przypisywana jest zmiennej wiek, która jest składnikiem klasy. Po przecinku można wypisać kolejne inicjalizowane składowe. 22
Konstruktor i destruktor Taki zapis ma kilka bardzo istotnych zalet: 1. Jest szybszy - różnice są znaczne gdy przyjdzie do wykonywania pomiarów czasowych. 2. Jest czytelniejszy - programista nie musi analizować zawartości konstruktora, by wiedzieć jaką domyślną wartością zostanie zainicjowana klasa. 3. Umożliwia inicjowanie zmiennych zdefiniowanych jako stałe (const). 4. Umożliwia inicjowanie zmiennych zdefiniowanych jako referencje (tylko tą metodą można zainicjować zmienną zadeklarowaną np. tak: int & zmienna;). 5. Jest metodą stosowaną przy dziedziczeniu klas. 23
Konstruktor i destruktor Lista inicjalizacyjna konstruktora Zwróćmy uwagę, że w przypadku użycia listy inicjalizacyjnej ciało konstruktora jest puste. Można oczywiście umieścić w nim jakiejś instrukcje. Niektóre składowe mogą być inicjalizowane poprzez konstruktor a inne poprzez listę inicjalizacyjną. Jeśli w klasie tylko deklarujemy konstruktor, a jego definicję podajemy poza klasą, to w deklaracji listy inicjalizacyjnej nie umieszczamy. 24
Konstruktor i destruktor 25
Programowanie obiektowe Obiekty i funkcje const 26
Składniki statyczne klas Funkcje składowe typu const funkcje takie nie mogą modyfikować składników klas. Modyfikator const za metodą informuje, że nie ulega zmianie stan obiektu mogą one być używane dla obiektów typu const (obiektów stałych) 27
Składniki statyczne klas Skoro obiekt dom jest stały wolno używać tylko jego funkcji const. 28
Programowanie obiektowe Funkcje zaprzyjaźnione 29
Funkcje zaprzyjaźnione Funkcja zaprzyjaźniona to funkcja która ma prawo dostępu do prywatnych składników klasy. Wewnątrz definicji klasy wystarczy umieścić deklarację tej funkcji poprzedzoną słowem friend. Uwaga: to nie funkcja ma twierdzić, że jest zaprzyjaźniona. To klasa ma zadeklarować, że przyjaźni się z tą funkcją i nadaje jej prawo dostępu do składników prywatnych. Zatem słowo friend pojawia się tylko wewnątrz definicji klasy. Funkcja może być zaprzyjaźniona z wieloma klasami. 30
Funkcje zaprzyjaźnione 31
Programowanie obiektowe Listy obiektowe - przykład 32
Listy obiektowe - przykład Nasz program będzie składał się z dwóch klas: 1. klasa osoba obsługująca pojedynczy rekord; 2. Klasa lista implementująca listę jednokierunkową obiektów klasy osoba 33
Listy obiektowe - przykład Uwaga klasa lista nie dziedziczy po klasie osoba, a tylko z niej korzysta (tworzy zmienne dynamiczne typu osoba. O dziedziczeniu w następnym wykładzie. 34
Listy obiektowe - przykład Klasa lista nie ma bezpośredniego dostępu do pól prywatnych kasy osoba, musi korzystać z jej interfejsu (publicznych metod set. get.) 35
Listy obiektowe - przykład 36
Listy obiektowe - przykład Destruktor klasy lista sprząta po niej czyli zwalnia utworzone dynamicznie obiekty klasy osoba 37
Listy obiektowe - przykład Obiekt lista możemy utworzyć zarówno statycznie, jak i dynamicznie efekt będzie prawie ten sam, tzn. w obu wypadkach obiekty osoba będą tworzone dynamicznie. Główna różnica to moment wywołania destruktora listy. 38
Literatura: W prezentacji wykorzystano przykłady i fragmenty: Grębosz J. : Symfonia C++, Programowanie w języku C++ orientowane obiektowo, Wydawnictwo Edition 2000. Jakubczyk K.: Turbo Pascal i Borland C++ Przykłady, Helion. Warto zajrzeć także do: Sokół R. : Microsoft Visual Studio 2012 Programowanie w Ci C++, Helion. Kerninghan B. W., Ritchie D. M.: język ANSI C, Wydawnictwo Naukowo Techniczne. Dla bardziej zaawansowanych: Grębosz J. : Pasja C++, Wydawnictwo Edition 2000. Meyers S.: język C++ bardziej efektywnie, Wydawnictwo Naukowo Techniczne 39