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
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
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
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
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
Plik z chomika:
Fonev
Inne pliki z tego folderu:
Programowanie obiektowe pojęcia sciaga popr.pdf
(459 KB)
Programowanie obiektowe pojęcia sciaga.docx
(23 KB)
Programowanie Obiektowe - W01.pdf
(1005 KB)
Programowanie Obiektowe - W01a.pdf
(408 KB)
Programowanie Obiektowe - W02.pdf
(233 KB)
Inne foldery tego chomika:
Laborka
Projekt
Zgłoś jeśli
naruszono regulamin