Programowanie Obiektowe - W02.pdf

(233 KB) Pobierz
Programowanie Obiektowe
(Inicjowanie, przypisywanie oraz niszczenie obiektów)
dr inż. Jarosław Zdrojewski
jzdrojewski@utp.edu.pl
10/2009
1
Zagadnienia
Tworzenie obiektów klasy,
Usuwanie obiektów klasy,
Lista inicjowania składowych ,
Inicjowanie składowa po składowej,
Przypisywanie składowa po składowej,
Wydajność tworzonego kodu od strony we/wy funkcji.
2
1229711139.040.png 1229711139.041.png 1229711139.042.png 1229711139.043.png 1229711139.001.png
Inicjowanie klasy
Poprawna in icjalizacja wymaga znajomości znaczenia pól klasy. Stad jej projektant dostarcza
mechanizm u odpowiedzialnego za inicjalizację i ustalenie wartości początkowych,
p g j ję p ą y ,
Konstruktor domyślny (bez parametrów) jest konstruktorem obiektów, które na danym etapie
często nie wiemy, jakie wartości powinny zawierać , a musimy utworzyć ich instancję.
Konstruktor klasy możemy przeciążać i w takiej sytuacji kompilator odpowiada za wybór
właściwego.
UWAGA:
Dla klas mających wyłącznie pola
publiczne istnieje możliwość
zastosowanie jawnej listy inicjującej ,
gdzie kolejność zadeklarowanych pól klasy
gd e oej ość ade ao a yc pó asy
i kolejność na liście muszą być zgodne.
Podejście ma dwie wady :
1. pola muszą być publiczne ,
2. projektant liczy na użytkownika , że
ten dokona poprawnego przypisania
wartości początkowych
3
Konstruktor klasy
Nazwa klasy jest zarazem nazwą konstruktora . Każda klasy, pod warunkiem, że nie
mainnychprzeciwwskazańpowinnamiećzdefiniowanykonstruktordomyślny
ma innych przeciwwskazań powinna mieć zdefiniowany konstruktor domyślny.
UWAGA:
C++ gwarantujewywołanie konstruktora obiektu przed pierwszym jego użyciem ,
Konstruktor nie zwraca , żadnej wartości ‐nie może to być również void .
4
1229711139.002.png 1229711139.003.png 1229711139.004.png 1229711139.005.png 1229711139.006.png 1229711139.007.png 1229711139.008.png 1229711139.009.png 1229711139.010.png
Konstruktor klasy
Konstruktorobiektu tworzonego poleceniem New jest wywoływany wyłącznie w
sytuacji gdytworzenieobiektuzakończyłosię pomyślnie przydzielonopamięć
sytuacji, gdy tworzenie obiektu zakończyło się pomyślnie ‐przydzielono pamięć
UWAGA
Przykład powyżej jest wyłącznie wizualizacją procesu dynamicznego tworzenia obiektów.
5
Konstruktor klasy ‐uwagi
Konstruując obiekt powinniśmy pamiętać, że:
Obiekty możemy definiować bez podania listy
argumentów , jeśli klasa nie posiada deklaracji żadnego
konstruktora lub zawiera deklaracje konstruktora
domyślnego ,
Obiekty bez konstruktora d omyślnego z pustą listą
argumentów trudno używać w połączeniu ze
standardowymi kolekcjami .
Konstruktor domyślny powinien inicjować obiekt w
taki sposób, aby jednoznacznie zasygnalizować, że
obiekt wymagapowtórnejdokładniejszejinic jalizacji
obiekt wymaga powtórnej dokładniejszej inic jalizacji.
Lista inicjalizowania składowych jest mechanizmem
inicjalizowania pól klasy w (!) definicji konstruktora.
Słowo kluczowe explicit w definicji konstruktora chroni
go przed niezamierzonym, automatycznym
rzutowaniem parametrów na konstruktor domyślny i
oznacza, że nie życzymy sobie niejawnych
przekształceń typów.
6
1229711139.011.png 1229711139.012.png 1229711139.013.png 1229711139.014.png 1229711139.015.png 1229711139.016.png 1229711139.017.png 1229711139.018.png 1229711139.019.png 1229711139.020.png 1229711139.021.png
Konstruktor domyślny
Konstruktor domyślny to taki konstruktor, który wykonuje się gdy użytkownik nie
zdefiniowałżadnychargumentówwinstrukcjitworzącejdanyobiekt Kt t t
zdefiniował żadnych argumentów w instrukcji tworzącej dany obiekt. Konstruktor ten
może posiadać argumenty ale dla wszystkich z nich ustalono wartości domyślne, a użytkownik nie
zmodyfikował żadnego z nich.
UWAGA:
Jeśli pola klasy zadeklarowane zostały jako publiczne, a klasa nie ma konstruktora to:
1. Obiekty o zasięgu statycznym mają gwarantowane zerowanie pól,
2. Obiekty lokalne i tworzone dynamicznie skazane są na przypadkowość wartości początkowych.
7
Konstruktor domyślny
Zasady użytkowania konstruktora domyślnego ‐stosowane w czasie kompilacji
programu:
programu:
1. Weryfikacja czy zdefiniowano konstruktor domyślny, jeśli tak to zostanie użyty,
2. Konstruktor domyślny istnieje ale jest niepubliczny (!), błąd main() nie ma prawa dostępu,
3. Brak konstruktora domyślnego ale zdefiniowano konstruktor z przynajmniej jednym parametrem.
Kompilator zgłasza błąd –brak argumentów do konstruktora,
4. Nie zdefiniowano ani konstruktora domyślnego, ani konstruktora z parametrami. W tym przypadku
definicja acct jest poprawna, a obiekt jest inicjowany bez użycia konstruktora.
8
1229711139.022.png 1229711139.023.png 1229711139.024.png 1229711139.025.png 1229711139.026.png 1229711139.027.png 1229711139.028.png 1229711139.029.png 1229711139.030.png
Konstruktor kopiujący
Domyślne inicjowanie składowa po składowej to postępowanie kopiowanie
jednego obiektu klasy do drugiego obiektu klasy poprzez przepisanie wszystkich
pól niestatycznych.
Domyślny sposób inicjowania nie zawsze zapewnia poprawną wartość początkową
pól obiektu (w powyższym przykładzie dwa obiekty posiadały be ten sam numer
konta). W takich przypadkach konieczne jest zdefiniowanie jawnej wersji
konstruktora kopiującego .
9
Destruktor klasy
Destruktor to specjalna metoda klasy symetryczna do działania konstruktora
zapewniająca automatycznezwolnieniezasobów przydzielonychobiektowiklasy
zapewniająca automatyczne zwolnienie zasobów przydzielonych obiektowi klasy.
Destruktor jest wywoływany gdy obiekt klasy opuszcza zasięg lub zastosujemy
operator delete do wskaźnika tego obiektu.
Destruktor:
Nadajemy nazwę klasy poprzedzoną
znakiem tyldy (~),
Nie może on przekazywać żadnych
wartości ani pobierać żadnych
wartości , ani pobierać żadnych
argumentów,
Metoda destruktora nie może być
przeciążana ,
Dla klas nie przydzielających
zasobów które powinny zostać
zwolnione nie definiujemy
destruktora.
10
1229711139.031.png 1229711139.032.png 1229711139.033.png 1229711139.034.png 1229711139.035.png 1229711139.036.png 1229711139.037.png 1229711139.038.png 1229711139.039.png
Zgłoś jeśli naruszono regulamin