1
Programowanie obiektowe
Wykład 3
Koncepcja obiektowo
ś
ci
Poj
ę
cie klasy
Własno
ś
ci klasy
Obiekty
Paradygmat programowania obiektowego
Hermetyzacja
Dziedziczenie
Polimorfizm
Dziedziczenie
Konstruktory i destruktory
Funkcje i klasy zaprzyja
ź
nione
2
Programowanie obiektowe
Języki programowania - klasyfikacja
Stricte obiektowe j
ę
zyki programowania (OPL) – podstawow
ą
jednostk
ą
syntaktyczn
ą
jest klasa obiektów:
Simula 67,
Smalltalk.
J
ę
zyki programowania zorientowane obiektowo (OOPL) -
podstawow
ą
jednostk
ą
syntaktyczn
ą
jest moduł (program, unit,
package), w którym umieszczane s
ą
definicje klas, obiektów:
C++,
Java,
Borland Pascal (Delphi),
TopSpeed Modula2,
ModSim II,
Visual C++,
Visual Basic.
3
Programowanie obiektowe
Zastosowanie koncepcji obiektowości
J
ę
zyki programowania (Simula, Smalltalk, C++, Java, Eiffel, Beta,
OO-COBOL, Ada, Object Pascal, Visual Basic i inne)
j
ę
zyki te wprowadzaj
ą
nowe poj
ę
cia, bezpo
ś
rednio odnosz
ą
ce
si
ę
do obiektowo
ś
ci, tzn. klasy, dziedziczenie, hermetyzacja i
polimorfizm;
trudno
ś
ci w projektowaniu i wypromowaniu nowego j
ę
zyka
programowania skutkuj
ą
tendencj
ą
do rozszerzania
klasycznych j
ę
zyków programowania w kierunku obiektowo
ś
ci;
4
Programowanie obiektowe
Ewolucja języków programowania
1950
1960
1970
1980
1990
2000
Fortran(54)
PL/I(66)
Ada(95)
Java(96)
Basic(66)
C(72)
Pascal(70)
Cobol(58)
Algol(60)
Simula(67)
Smalltalk(80)
C++(89)
A
S
S
E
M
B
L
Y
Eiffel (86)
Ada(83)
5
Programowanie obiektowe
Koncepcja obiektowości
Obiektowo
ść
- cecha naturalnego postrzegania
ś
wiata - analiza
otoczenia poprzez relacje mi
ę
dzy obserwatorem a otaczaj
ą
cymi
obiektami;
Ś
wiat jest zło
ż
ony - składa si
ę
z wielu obiektów, pozostaj
ą
cych w
pewnych relacjach wzgl
ę
dem siebie;
Obiektami mog
ą
by
ć
np.: ludzie, pa
ń
stwa, domy, samochody, ale
tak
ż
e płace, zadania, decyzje itp.
Koncepcja obiektowo
ś
ci jest podstaw
ą
:
analizy obiektowej,
projektowania obiektowego,
programowania obiektowego.
6
Programowanie obiektowe
Koncepcja obiektowości
Obiekt:
podstawowa jednostka konstrukcyjna programu;
konkretny lub abstrakcyjny byt (wyró
ż
nialny w modelowanej
rzeczywisto
ś
ci), posiadaj
ą
cy nazw
ę
, okre
ś
lone granice, atrybuty
i inne własno
ś
ci;
charakteryzuj
ą
go:
Atrybuty – reprezentuj
ą
stan obiektu i zwi
ą
zki z innymi obiektami,
np. kolor, rozmiar, przynale
ż
no
ść
…
Procedury (usługi, metody) – operacje, które obiekt mo
ż
e
wykonywa
ć
, np. przemieszczanie, całkowanie, wyznaczanie stanu
konta…
Zasady – niezmiennicze reguły okre
ś
laj
ą
ce widzialno
ść
obiektu
i sposób powi
ą
zania z innymi obiektami.
7
Programowanie obiektowe
Pojęcie klasy
Zazwyczaj wiele obiektów ma taki sam zbiór cech, wskazane
jest, aby te cechy zdefiniowa
ć
raz, a potem wielokrotnie
wykorzystywa
ć
;
Umo
ż
liwia do klasa
klasa (słownik PWN) — kategoria przedmiotów lub zjawisk
wyró
ż
nionych na podstawie wspólnych cech
Klasa:
zbiór obiektów, maj
ą
cych wspólne atrybuty i metody;
wzorzec dla konkretnych egzemplarzy klasy – obiektów;
8
Programowanie obiektowe
Klasa w programowaniu
Klasa w programowaniu — uogólniony typ zdefiniowany przez
u
ż
ytkownika j
ę
zyka
Słu
ż
y do definiowania obiektów (uogólnionych zmiennych)
Dostarcza wielu nowych mo
ż
liwo
ś
ci (o czym pó
ź
niej)
9
Programowanie obiektowe
Przykład – osoba strukturalnie
struct osoba
{
int wiek;
char imi
ę
[20], nazwisko[30];
};
void wczytaj_osobe(osoba *o);
void ustaw(osoba *o, int wiek, char *imi
ę
, char *nazwisko);
void wypisz(osoba *o);
Wady:
brak kontroli dost
ę
pu do pól struktury
programista musi pami
ę
ta
ć
, których funkcji u
ż
ywa
ć
na rzecz
których struktur
10
Programowanie obiektowe
Przykład – osoba obiektowo
class osoba
{
int wiek;
// składowe klasy – zmienne klasowe
char imi
ę
[20], nazwisko[30];
public:
void wczytaj();
// składowe klasy – metody klasy
void ustaw(int wiek, char *p_imi
ę
, char *p_nazwisko);
void wypisz();
};
//
ś
rednik ko
ń
cz
ą
cy deklaracj
ę
klasy
Korzy
ść
dane i metody razem
dost
ę
p do danych: poprzez funkcje publiczne
11
Programowanie obiektowe
Deklaracja klasy
Deklaracja klasy
class Klasa
{
public:
Klasa();
// Konstruktor domy
ś
lny klasy – bezparametrowy
~Klasa();
// Destruktor klasy
// składowe dost
ę
pne dla innych klas
private:
// składowe dost
ę
pne tylko dla metod tej klasy
protected:
// składowe dost
ę
pne dla składowych klas potomnych
};
Uwagi:
Domniemanie: wszystkie składowe klasy s
ą
prywatne
Nie ma ogranicze
ń
na liczb
ę
okre
ś
le
ń
dost
ę
pu w definicji klasy
12
Programowanie obiektowe
Deklaracja klasy - przykład
#define SIZE 100
class stack
{
int stck[SIZE];
int tos;
public:
void init();
void push(int i);
int pop();
};
13
Programowanie obiektowe
Deklaracja klasy - przykład
void stack::init()
{
tos=0;
}
void stack::push(int i)
{
if (tos==SIZE) {
cout << „Stos jest pełny.\n”;
}
stck[tos]=i;
tos++;
}
14
Programowanie obiektowe
Deklaracja klasy - przykład
int stack::pop()
{
if (tos==0) {
cout << „Stos jest pusty.\n”;
return 0;
}
tos--;
return stck[tos];
}
15
Programowanie obiektowe
Deklaracja klasy - przykład
int main()
{
stack stos1, stos2;
//utworzenie dwóch obiektów typu stack
stos1.init(); stos2.init();
stos1.push(1); stos2.push(2);
stos1.push(3); stos2.push(4);
cout << stos1.pop() << „ „;
cout << stos1.pop() << „ „;
cout << stos2.pop() << „ „;
cout << stos2.pop() << „ „;
return 0;
}
Wynik działania programu:
3 1 4 2
Program 3.0
16
Programowanie obiektowe
Wprowadzenie do języka C++
Operatory dost
ę
pu do składowych i zakresu klasy
sposób dost
ę
pu zgodny z dost
ę
pem do „struct”;
operator dost
ę
pu „kropka”: „ . ” dotyczy:
składowych obiektów,
funkcji (metod) obiektów;
np.
obiekt.pole;
obiekt.metoda();
operator dost
ę
pu „strzałka”: „ -> ” dotyczy:
wska
ź
ników;
np.
wsk_na_obiekt -> metoda();
operator zakresu „ :: ”
klasa::pole;
klasa::metoda();
17
Programowanie obiektowe
Wprowadzenie do języka C++
Definicja funkcji (metody) klasy
Definicja składowej wewn
ą
trz deklaracji klasy:
class Moja_Klasa
{ public:
TypZwrotnejWarto
ś
ci NazwaMetodySkładowej()
{…};
};
Definicja funkcji (metody) poza deklaracj
ą
klasy:
TypZwrotnejWarto
ś
ci Moja_Klasa :: NazwaMetodySkładowej( )
{
…
};
Operator zakresu „::” wi
ąż
e metod
ę
z klas
ą
;
Ró
ż
ne klasy mog
ą
mie
ć
metody o tej samej nazwie;
18
Programowanie obiektowe
Wprowadzenie do języka C++
Definicja składowych klasy
Przykład poza deklaracj
ą
klasy:
void osoba::ustaw(int wiek, char *p_imie, char *p_nazwisko)
{
osoba::wiek = wiek;
strcpy(imie, p_imie);
strcpy(nazwisko, p_nazwisko);
};
operator zakresu w nagłówku
tu też operator zakresu,
bo „wiek” jest przysłonięty
19
Programowanie obiektowe
Obiekt – uogólniona struktura
Deklarujemy
class osoba ja, Ty;
osoba szef;
// w deklaracji/definicji obiektu mo
ż
na
// pomija
ć
„class”, „struct” i „union”
U
ż
ywamy
szef.wczytaj();
szef.wypisz();
20
Programowanie obiektowe
Jak definiować metody klasy?
Wewn
ą
trz deklaracji klasy
class osoba
{
…
inline void wczytaj()
{
cin>>wiek>>imie>>nazwisko;
}
// tu nie musi by
ć ś
rednika
…
};
Taka funkcja jest funkcj
ą
inline (wplatan
ą
)
Specyfikator inline mo
ż
e by
ć
(tutaj) pomini
ę
ty
21
Programowanie obiektowe
Jak definiować metody klasy?
Poza klas
ą
trzeba u
ż
y
ć
operatora zakresu w nagłówku
void osoba::ustaw(int wiek, char *p_imi
ę
, char *p_nazwisko)
{
osoba::wiek=wiek;
// tu te
ż
operator zakresu bo wiek przesłoni
ę
ty
strcpy(imi
ę
, p_imi
ę
);
strcpy(nazwisko, p_nazwisko);
}
Metoda ma by
ć
inline?
inline void osoba::wypisz()
{
cout<<"wiek: "<<wiek<<" imie: "<<imie<<
" nazwisko: "<<nazwisko<<"\n";
}
22
Programowanie obiektowe
Jak definiować metody klasy?
Metody (funkcje) mog
ą
mie
ć
argumenty domy
ś
lne i by
ć
przeci
ąż
ane
void znajdz(int wiek, char *pi="Jan", char *pn="Kowalski");
szef. znajdz(50, „Adam”, „Nowak”);
szef. znajdz(50, „Adam”);
szef. znajdz(50);
// ale nie: szef. znajdz();
Dlaczego?
23
Programowanie obiektowe
Jak definiować metody klasy?
Metody i zmienne zadeklarowane wewn
ą
trz klasy s
ą
widoczne od
pocz
ą
tku definicji klasy oraz wewn
ą
trz ciał funkcji zadeklarowanych
wewn
ą
trz klasy
class A
{
public:
void wczytaj()
{
cin>>i;
// deklaracja „i” jest wewn
ą
trz klasy
wypisz();
// „wypisz” jest wewn
ą
trz klasy
}
int i;
void wypisz();
};
24
Programowanie obiektowe
Paradygmat programowania obiektowego
Paradygmat (encyklopedia PWN) — ogólnie uznane
osi
ą
gni
ę
cie naukowe (teoria naukowa); dostarcza modelowych
rozwi
ą
za
ń
w danej dziedzinie nauki
Paradygmaty programowania
programowanie strukturalne
programowanie obiektowe
25
Programowanie obiektowe
Programowanie obiektowe:
metoda rozwi
ą
zywania problemów programistycznych
z wykorzystaniem obiektów;
sposób interpretacji problemu jako zbioru obiektów
i relacji pomi
ę
dzy nimi
Paradygmat programowania obiektowego
26
Programowanie obiektowe
Hermetyzacja
Dziedziczenie
Polimorfizm
Paradygmaty programowania obiektowego
27
Programowanie obiektowe
Hermetyzacja (ang. encapsulation) oznacza poł
ą
czenie danych i instrukcji
programu w jednostk
ę
programow
ą
, zwan
ą
obiektem
Zamkni
ę
cie pewnego zestawu bytów programistycznych w “kapsuł
ę
” o dobrze
okre
ś
lonych granicach
Informacja o wewn
ę
trznej budowie obiektu nie jest dost
ę
pna poza jego
definicj
ą
– oddzielenie specyfikacji obiektu (tak
ż
e klasy) od implementacji
Podstawow
ą
zalet
ą
hermetyzacji jest mo
ż
liwo
ść
zabezpieczenia danych przed
równoczesnym dost
ę
pem ze strony ró
ż
nych fragmentów kodu programowego.
W tym celu wszystkie dane (pola w obiekcie) i zapisy instrukcji (metody w
obiekcie) dzieli si
ę
na ogólnodost
ę
pne (interfejs obiektowy) i wewn
ę
trzne
(implementacja obiektu).
Dost
ę
p do pól i metod wewn
ę
trznych jest mo
ż
liwy tylko za po
ś
rednictwem
"ł
ą
cza obiektowego" - pól i metod ogólnodost
ę
pnych.
Wybrane pola i metody mo
ż
na ukry
ć
przed okre
ś
lonymi (tak
ż
e wszystkimi)
obiektami zewn
ę
trznymi.
Hermetyzacja ma ogromne znaczenie dla przeno
ś
no
ś
ci programów i
optymalizowania nakładów potrzebnych na ich modyfikacje.
Wpływa tak
ż
e dodatnio na osi
ą
ganie niezawodno
ś
ci w projektach
programistycznych.
Hermetyzacja
28
Programowanie obiektowe
Dziedziczenie
Dziedziczenie (ang. inheritance) oznacza zwi
ą
zek pomi
ę
dzy klasami
obiektów, okre
ś
laj
ą
cy przekazywanie cech (pól i metod) z klasy do jej
podklas;
np. obiekt klasy Samochód dziedziczy wszystkie własno
ś
ci (atrybuty i
metody) okre
ś
lone w klasie Pojazd;
Mechanizm dziedziczenia słu
ż
y w j
ę
zykach obiektowych do odwzorowania
wyst
ę
puj
ą
cych cz
ę
sto w naturze powi
ą
za
ń
typu generalizacja –
specjalizacja (uszczegółowienie).
Umo
ż
liwia programi
ś
cie definiowanie potomków istniej
ą
cych obiektów.
Ka
ż
dy potomek dziedziczy przy tym (wszystkie lub wybrane) pola i metody
obiektu bazowego, lecz dodatkowo uzyskuje pewne pola i własno
ś
ci
unikatowe, nadaj
ą
ce mu nowy charakter.
Typ takiego obiektu potomnego mo
ż
e sta
ć
si
ę
z kolei typem bazowym do
zdefiniowania kolejnego typu potomnego.
Dziedziczenie jest podstawowym mechanizmem sprzyjaj
ą
cym ponownemu
u
ż
yciu i rozszerzaniu klas;
29
Programowanie obiektowe
Dziedziczenie
Dziedziczenie to technika pozwalaj
ą
ca na definiowanie nowych klas przy
wykorzystaniu klas wcze
ś
niej istniej
ą
cych
Wyra
ż
a zwi
ą
zki hierarchiczne mi
ę
dzy klasami;
Specjalizuje lub generalizuje klasy;
Przykład:
ka
ż
dy dorosły i ka
ż
de dziecko jest osob
ą
(generalizacja);
dorosły jest przypadkiem szczególnym osoby, podobnie jak dziecko
(specjalizacja);
osoba
dziecko
dorosły
klasa bazowa
klasy pochodne
30
Programowanie obiektowe
Klasa pochodna:
dziedziczy wszystkie zmienne z sekcji „public” i „protected” klasy
bazowej;
dziedziczy wszystkie funkcje z sekcji „public” i „protected” klasy
bazowej;
do dost
ę
pnych składowych klasy bazowej mo
ż
na si
ę
odwoływa
ć
poprzez operator zakresu „::”;
W klasie pochodnej mo
ż
na tak
ż
e:
zdefiniowa
ć
dodatkowe zmienne składowe;
zdefiniowa
ć
dodatkowe funkcje składowe;
przedefiniowa
ć
(zmieni
ć
) funkcje składowe odziedziczone
z klasy bazowej (polimorfizm);
Dziedziczenie
31
Programowanie obiektowe
Posta
ć
ogólna dziedziczenia:
class Klasa_pochodna: sekcja Klasa_bazowa_1 [, Klasa_bazowa_N]
{
// nowe składowe
// funkcje odziedziczone nadpisane (przedefiniowane)
};
tzw. dziedziczenie wielobazowe
Dziedziczenie
sekcja docelowa dla składowych
dziedziczonych
32
Programowanie obiektowe
Dziedziczenie
Je
ż
eli w klasie bazowej i w klasie pochodnej s
ą
składniki o tej samej
nazwie, wówczas w zakresie klasy pochodnej składnik
z tej klasy zasłania odziedziczony składnik z klasy bazowej
Je
ś
li składnik klasy bazowej jest zasłoni
ę
ty to odwołanie si
ę
do niego
jest mo
ż
liwe z u
ż
yciem operatora zakresu (::)
33
Programowanie obiektowe
Przykład – klasa osoba
class osoba
{
int wiek;
char imi
ę
[20], nazwisko[30];
public:
void wczytaj();
void ustaw(int wiek, char *p_imi
ę
, char *p_nazwisko);
void wypisz();
};
34
Programowanie obiektowe
Zało
ż
enia rozszerzaj
ą
ce dla klasy „dorosly”:
numer dowodu:
char *nr_dowodu;
prywatny dla klasy „dorosly”;
metody wczytaj, wypisz, ustaw:
dost
ę
pne publicznie;
odziedziczone z klasy bazowej;
Przykład – klasa pochodna dorosly
35
Programowanie obiektowe
Klasa „dorosly”
class dorosly: public osoba
{
char * nr_dowodu;
public:
void wczytaj ();
void wypisz ();
void ustaw(int wiek, char *p_imie, char *p_nazwisko,
char *nr_dow);
};
klasa pochodna
klasa bazowa
sekcja docelowa dla składowych
dziedziczonych
nowa składowa
metody odziedziczone ale przedefiniowane
Dziedziczenie
36
Programowanie obiektowe
sekcja docelowa dla składowych dziedziczonych:
class Klasa_pochodna :
public
Klasa_bazowa;
// sekcja
// private
// sekcja
// protected
// sekcja
// public
Klasa_bazowa
// sekcja
// private
// sekcja
// protected
// sekcja
// public
Klasa_pochodna
Dziedziczenie
dziedziczone ale niedostępne w klasie
pochodnej; dostępne poprzez
dziedziczone funkcje nieprywatne
37
Programowanie obiektowe
sekcja docelowa dla składowych dziedziczonych:
class Klasa_pochodna :
protected
Klasa_bazowa;
// sekcja
// pivate
// sekcja
// protected
// sekcja
// public
Klasa_bazowa
// sekcja
// pivate
// sekcja
// protected
// sekcja
// public
Klasa_pochodna
Dziedziczenie
dziedziczone ale niedostępne w klasie
pochodnej; dostępne poprzez
dziedziczone funkcje nieprywatne
38
Programowanie obiektowe
sekcja docelowa dla składowych dziedziczonych:
class Klasa_pochodna :
private
Klasa_bazowa;
// sekcja
// private
// sekcja
// protected
// sekcja
// public
Klasa_bazowa
// sekcja
// private
// sekcja
// protected
// sekcja
// public
Klasa_pochodna
Dziedziczenie
dziedziczone ale niedostępne w klasie
pochodnej; dostępne poprzez
dziedziczone funkcje nieprywatne
39
Programowanie obiektowe
Z zakresu klasy pochodnej do prywatnych składników klasy
bazowej mo
ż
na si
ę
ga
ć
tylko poprzez funkcje składowe klasy
bazowej
Do składników protected i public klasy bazowej mamy dost
ę
p
bezpo
ś
redni;
Dziedziczenie prywatne stosujemy wtedy, gdy chcemy aby nie było
publicznego dost
ę
pu do odziedziczonych składników klasy
bazowej;
Nie podlegaj
ą
dziedziczeniu:
konstruktory
destruktory
Dziedziczenie
trzeba je zdefiniować w klasie pochodnej
40
Programowanie obiektowe
Dziedziczenie jest technik
ą
definiowania nowych klas;
Dziedziczenie jest jedn
ą
z najwspanialszych cech j
ę
zyków
programowania obiektowego;
Umo
ż
liwia:
oszcz
ę
dno
ść
pracy,
tworzenie hierarchii klas (hierarchia wprowadza naturalne
relacje mi
ę
dzy klasami),
tworzenie klas ogólnych (klas przeznaczonych do
dziedziczenia np. ogólna klasa „kolejka”)
Przykład programowy
Dziedziczenie - podsumowanie
Program 3.1
41
Programowanie obiektowe
Przykład hierarchii klas
Dziedziczenie
samochód
osobowy
ciężarowy
autobus
Fiat
VW
opel
„wywodzi się”
42
Programowanie obiektowe
Polimorfizm nazw funkcji
mo
ż
liwo
ść
istnienia wielu funkcji o tej samej nazwie, powi
ą
zana
z mo
ż
liwo
ś
ci
ą
wyboru konkretnej funkcji podczas wykonania
programu;
uto
ż
samiany jest z przeci
ąż
aniem funkcji lub operatorów
(overloading);
np. metoda Jed
ź
inaczej b
ę
dzie si
ę
zachowywała dla
Samochodu a inaczej dla Roweru;
zasi
ę
g polimorfizmu ograniczony jest do poddrzewa hierarchii
dziedziczenia;
Polimorfizm
43
Programowanie obiektowe
Opisane postępowanie nazywa się przeciążaniem nazwy.
Funkcje noszące takie same nazwy nazywamy funkcjami przeciążonymi
Tworzenie funkcji przeciążonych nazywamy przeciążaniem funkcji
Wielokrotne stosowanie nazw - polimorfizm
44
Programowanie obiektowe
Konstruktory
pierwsza (najcz
ęś
ciej publiczna) funkcja składowa obiektu, o nazwie
takiej samej jak nazwa klasy;
słu
ż
y do inicjowania obiektów danej klasy, tzn. do nadawania warto
ś
ci
pocz
ą
tkowych składnikom definiowanego (wła
ś
nie) obiektu (w trakcie
deklaracji obiektu przydziela mu si
ę
miejsce w PAO);
metoda bezzwrotna (nie mo
ż
na u
ż
y
ć
nawet typu „void”!);
definiowany tak jak funkcja składowa:
wewn
ą
trz deklaracji klasy – domy
ś
lnie „inline”;
poza deklaracj
ą
klasy:
•
jak zwykła metoda;
•
jak metoda „inline”;
wywoływany automatycznie w momencie tworzenia (deklaracji)
konkretnego obiektu;
konstruktor cz
ę
sto bywa przeci
ąż
any;
w przypadku braku konstruktora w definicji klasy doł
ą
czany jest
konstruktor pusty (bez instrukcji)
45
Programowanie obiektowe
Konstruktor domy
ś
lny
funkcja składowa, któr
ą
mo
ż
na wywoła
ć
bez argumentów lub z
domy
ś
lnymi warto
ś
ciami;
je
ż
eli nie został zadeklarowany
ż
aden konstruktor to kompilator
doł
ą
cza pusty konstruktor domy
ś
lny:
Klasa :: Klasa() { };
je
ż
eli zadeklarujemy konstruktor przeci
ąż
ony (z parametrami) to
kompilator nie doł
ą
czy domy
ś
lnego bezparametrowego;
kolejno
ść
wywoła
ń
konstruktorów:
klasy bazowe w kolejno
ś
ci deklaracji,
obiektowe składowe klasy w kolejno
ś
ci deklaracji,
ciało konstruktora;
Konstruktory
46
Programowanie obiektowe
Lista inicjalizacyjna konstruktora
słu
ż
y do inicjowania składników klasy b
ę
d
ą
cych stałymi lub
zmiennymi;
stanowi obej
ś
cie ograniczenia,
ż
e w definicji klasy zmienne i
stałe nie mog
ą
by
ć
inicjalizowane (nie mo
ż
na im nadawa
ć
warto
ś
ci pocz
ą
tkowych);
pojawia si
ę
tylko przy definicji konstruktora, a nie przy jego
deklaracji;
klasa::klasa(argumenty) : nazwa_stałej(warto
ść
pocz
ą
tkowa)
[ , nazwa_stałej(warto
ść
pocz
ą
tkowa)]
{
// ciało konstruktora
};
Konstruktory
47
Programowanie obiektowe
Lista inicjalizacyjna konstruktora – przykład 1
class Punkt
{
double x, y;
public:
// …
Punkt(): x(0.0), y(0.0) { };
Punkt(double a, double b) : x(a), y(b) { };
};
Konstruktory
48
Programowanie obiektowe
Lista inicjalizacyjna konstruktora – przykład 2
class abc
{
const double stala;
float x;
char c;
public:
abc(float pp, double dd, char znak);
};
...
abc::abc(float pp, double dd, char znak) : stala(dd), c(znak)
{
x=pp;
}
deklaracja konstruktora
Konstruktory
definicja konstruktora
49
Programowanie obiektowe
Lista inicjalizacyjna konstruktora
umo
ż
liwia inicjalizowanie zmiennych – tak jak w kodzie
konstruktora;
ponadto umo
ż
liwia inicjalizowanie pól: referencji oraz stałych;
kolejno
ść
inicjalizacji:
składowe w kolejno
ś
ci deklaracji,
ciało konstruktora;
Konstruktory
50
Programowanie obiektowe
Lista inicjalizacyjna konstruktora – przykład 3
class Odcinek
{
Punkt p1;
Punkt p2;
Odcinek(double x1, double y1, double x2, double y2);
};
...
Odcinek::Odcinek(double x1, double y1, double x2, double y2): p1(x1, y1)
{
p2 = Punkt(2.0, 2.0);
};
Konstruktory
• obiekt p1 – inicjowanie listą
• obiekt p2 – inicjowanie konstruktorem (zadziałają dwa konstruktory!)
51
Programowanie obiektowe
ostatnia funkcja wykonywana przed usuni
ę
ciem obiektu;
nazwa taka, jak nazwa klasy, ale poprzedzona tyld
ą
„~”;
bez parametrów wej
ś
ciowych;
bez mo
ż
liwo
ś
ci przeci
ąż
ania (jeden w klasie);
wywoływany automatycznie w momencie niszczenia obiektu
(wychodzenia z bloku)
kolejno
ść
wywoływania:
ciało destruktora;
destruktory obiektów składowych (kolejno
ść
odwrotna do deklaracji
w klasie);
destruktor klasy (klas) bazowych (kolejno
ść
odwrotna do deklaracji
w klasie);
to, kiedy dokładnie likwidowane s
ą
obiekty zale
ż
y od konkretnego
kompilatora
Destruktory
52
Programowanie obiektowe
Destruktor klasy „Klasa”:
~Klasa() { };
lub
~Klasa();
…
Klasa::~Klasa() { };
Przykład:
~Punkt()
{cout << "Destruktor punktu x= " <<x << ", y= " << y <<
"\n"; }
~Odcinek()
{ cout << "Destruktor odcinka \n"; }
Destruktory
53
Programowanie obiektowe
Przykłady programowe
Konstruktory
Program 3.2a
Program 3.2b
C:\
C:\
54
Programowanie obiektowe
Konstruktor klasy pochodnej
Lista inicjalizacyjna konstruktora
class KlasaA {
public:
KlasaA (int t)
{ ...};
};
class KlasaB : public KlasaA
//deklaracja klasy pochodnej
{
public:
int x;
KlasaB (int par1, int par2) : KlasaA(par1), x(par2)
{ ...
};
};
Konstruktory
55
Programowanie obiektowe
Konstruktor klasy pochodnej
Lista inicjalizacyjna konstruktora
Na li
ś
cie musz
ą
znale
źć
si
ę
konstruktory wszystkich klas
bazowych;
•
Ich brak oznacza dla kompilatora konieczno
ść
wywołania
konstruktorów domy
ś
lnych z klas bazowych;
• Je
ż
eli w klasie bazowej brak jest domy
ś
lnego konstruktora a s
ą
inne konstruktory, to zostanie wygenerowany bł
ą
d;
Kolejno
ść
inicjalizacji:
• klasy bazowe (bezpo
ś
redni przodkowie w kolejno
ś
ci deklaracji),
• składowe w kolejno
ś
ci deklaracji,
• ciało konstruktora;
Konstruktory
56
Programowanie obiektowe
Konstruktor klasy pochodnej - Przykład
class dorosly: public osoba
{
char * nr_dowodu;
public:
void wczytaj ();
void wypisz ();
void ustaw(int wiek, char *p_imie, char *p_nazwisko, char *nr_dow);
dorosly(int k_wiek, char *p_imie, char *p_nazwisko, char *nr_dow) :
osoba (wiek, p_imie, p_nazwisko),
nr_dowodu(copy_string(nr_dow)) { };
};
Konstruktory
Program 3.3
57
Programowanie obiektowe
Konstruktor jest zwykle deklarowany jako publiczny, bo przecież
wprowadzane nim obiekty mogą być używane przez klasy zewnętrzne
Możemy jednak dla konstruktora przewidzieć ochronę tak, jak dla klas za
pomocą etykiet private lub protected
Wówczas jednak także konstruowane obiekty będą dostępne tylko w obrębie
klasy z tym konstruktorem jako private albo jako protected tylko w zakresie
klas dziedziczących.
Konstruktor może zamiast definiować obiekty podawać kopie obiektów
zawartych w innej klasie. Wtedy jest to tak zwany
konstruktor kopiujący
.
Konstruktor może dokonywać konwersji typu obiektu z jednego w drugi.
Nazywamy go wtedy
konstruktorem konwertującym
.
Konstruktory
58
Programowanie obiektowe
Konstruktor i destruktor
dla obiektów zdefiniowanych w blokach programowych:
konstruktor jest wywoływany, gdy sterowanie napotyka kod definicji
zmiennej – obiektu;
destruktory wywoływane po opuszczeniu bloku w kolejno
ś
ci
odwrotnej do konstruktorów;
dla obiektów globalnych (statycznych):
konstruktory s
ą
uaktywniane przed wywołaniem funkcji main(),
w kolejno
ś
ci definicji;
destruktory s
ą
uaktywniane po zako
ń
czeniu bloku main(),
w kolejno
ś
ci odwrotnej;
dla obiektów dynamicznych:
po zastosowaniu operatora „new”: alokacja pami
ę
ci a potem
wywołanie konstruktora;
po zastosowaniu „delete”: wywołanie destruktora i potem dealokacja
pami
ę
ci;
Destruktory
59
Programowanie obiektowe
Przykłady programowe
Konstruktory i destruktory
Program 3.4
Program 3.5
C:\
C:\
60
Programowanie obiektowe
Są to takie funkcje, które mimo, że nie są częścią klasy mają dostęp do jej
składników czyli innych funkcji, zmiennych i obiektów
Mają dostęp także do tych składników klasy, które są hermetyzowane
etykietą private
Funkcja zaprzyjaźniona jest wprowadzana słowem kluczowym friend
Sposób stosowania:
class figura{
int x,y;
…….
friend void goniec(figura f)
};
Funkcje zaprzyjaźnione
61
Programowanie obiektowe
Funkcja goniec(figura f) jest zdefiniowana gdzieś w programie w całkowicie
innym miejscu i nie jest funkcją składową klasy figura
W klasie figura {} chcemy z niej skorzystać nawet, jeśli przynależy ona do
innej klasy (wtedy poprawnie jest taką funkcję umieścić w sekcji public w jej
klasie).
Cechy funkcji zaprzyjaźnionych:
Funkcja może być zaprzyjaźniona z kilkoma klasami
Na argumentach jej wywołania może wykonywać operacje zgodnie ze
swoją definicją
Może być napisana w zupełnie innym języku niż C++ i dlatego może
nie być funkcją składową klasy.
Funkcje zaprzyjaźnione
62
Programowanie obiektowe
Ponieważ funkcja typu friend nie jest składnikiem klasy to nie ma wskaźnika
this czyli musi się posłużyć operatorem jawnego wskaźnika lub przypisania,
aby wykonać działania (także te
na składniku klasy, z którą jest
zaprzyjaźniona).
Jest deklarowana w klasie ze słowem kluczowym friend i nie podlega
etykietom hermetyzacji (public, private, protected)
Może być cała zdefiniowana w klasie i wtedy jest typu inline, ale nadal jest
funkcją zaprzyjaźnioną.
Nie musi być funkcją składową żadnej klasy, ale może nią być
Funkcje zaprzyjaźnione
63
Programowanie obiektowe
Klasa może się przyjaźnić z wieloma funkcjami, które są lub nie są
składnikami innych klas;
Funkcje zaprzyjaźnione nie są przechodnie, czyli zaprzyjaźnienie nie
przenosi się
z
klasy do klasy, tzn. zaprzyjaźnienie nie podlega
mechanizmowi dziedziczenia (w tym przypadku „przyjaciel mojego
przyjaciela nie jest moim przyjacielem” );
Z zasady umieszcza się funkcje zaprzyjaźnione na początku wszystkich
deklaracji w klasie;
Przykład programowy
Funkcje zaprzyjaźnione
Program 3.6
64
Programowanie obiektowe
Dopuszcza się stosowanie słowa kluczowego friend do definiowania klas
zaprzyjaźnionych; w takim przypadku wszystkie funkcje składowe klasy
zaprzyjaźnionej mają dostęp do prywatnych składników drugiej klasy.
Przykład programowy
Klasy zaprzyjaźnione
Program 3.7
65
Programowanie obiektowe
Referencje
Język C++ posiada dodatkową cechę związana ze wskaźnikami - referencję;
Zasadniczo referencja to niejawny wskaźnik;
Można ja wykorzystywać na trzy sposoby:
1)
jako parametr funkcji,
2)
jako zwracaną wartość,
3)
jako zmienną referencyjną.
66
Programowanie obiektowe
Referencje jako parametry
W momencie wywołania funkcji jej parametry mogą być przekazywane na
dwa sposoby: przez wartość i przez referencję;
Podczas przekazywania parametru przez wartość do funkcji przekazywana
jest kopia argumentu;
Przykład:
Program 3.8
67
Programowanie obiektowe
Referencje jako parametry
Ważnym zastosowaniem referencji jest możliwość definiowania funkcji,
wykorzystujących mechanizm przekazywania parametrów przez referencję;
Przekazywanie przez referencję polega na przekazaniu do funkcji wskaźnika
do argumentu; można to realizować na dwa sposoby:
jawne przekazanie wskaźnika do parametru;
posłużenie się się tzw. parametrem referencyjnym;
68
Programowanie obiektowe
Referencje jako parametry
Przykład jawnego przekazania wskaźnika do parametru
Program 3.10
Przykład użycia parametru referencyjnego
Program 3.9
69
Programowanie obiektowe
Przekazywanie obiektów przez referencję
Przekazywanie obiektu jako argumentu funkcji polega na przekazaniu jego
kopii;
Po zakończeniu funkcji kopia jest niszczona i wywoływany jest destruktor
tej kopii;
Jeśli nie chcemy, aby destruktor był uaktywniany, możemy przekazać
obiekt do funkcji przez referencję;
Podczas przekazywania obiektu przez referencję kopia obiektu nie jest
tworzona (w konsekwencji nie ma jej niszczenia i nie jest wywoływany
destruktor obiektu);
Przykład
Program 3.11
c:
70
Programowanie obiektowe
Zwracanie referencji
Funkcja może zwracać referencję;
W konsekwencji funkcja może występować z lewej strony instrukcji
przypisania!
Przykład
Program 3.12
71
Programowanie obiektowe
Zmienne referencyjne
Referencję można zastosować jako samodzielną zmienną;
Zmienna referencyjna jest tworzona jako nowa nazwa dla istniejącej
zmiennej (przezwisko);
Podczas tworzenia zmiennej referencyjnej obowiązkowa jest jej inicjacja;
Przykład
Program 3.13
72
Programowanie obiektowe