background image

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

background image

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.

background image

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;

background image

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)

background image

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.

background image

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

Ŝ

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.

background image

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;

background image

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)

background image

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

background image

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

background image

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

background image

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();

};

background image

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++;

}

background image

14

Programowanie obiektowe

Deklaracja klasy - przykład

int stack::pop()
{

if (tos==0) {

cout << „Stos jest pusty.\n”;
return 0;
}

tos--;
return stck[tos];

}

background image

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

background image

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();

background image

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

ą

;

Ŝ

ne klasy mog

ą

 mie

ć

 metody o tej samej nazwie;

background image

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

background image

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();

background image

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

background image

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";

}

background image

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?

background image

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();

};

background image

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

background image

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

background image

26

Programowanie obiektowe

Hermetyzacja

Dziedziczenie

Polimorfizm

Paradygmaty programowania obiektowego

background image

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 
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

background image

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;

background image

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

background image

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

background image

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

background image

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 (::)

background image

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();

}; 

background image

34

Programowanie obiektowe

Zało

Ŝ

enia rozszerzaj

ą

ce dla klasy „dorosly”:

numer dowodu:

char *nr_dowodu;

prywatny dla klasy „dorosly”;

metody wczytajwypiszustaw:

dost

ę

pne publicznie;

odziedziczone z klasy bazowej;

Przykład – klasa pochodna dorosly

background image

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

background image

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

background image

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

background image

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

background image

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 public klasy bazowej mamy dost

ę

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

background image

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

background image

41

Programowanie obiektowe

Przykład hierarchii klas

Dziedziczenie

samochód

osobowy

cięŜarowy

autobus

Fiat

VW

opel

„wywodzi się”

background image

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

background image

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

background image

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)

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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!)

background image

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

background image

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

background image

53

Programowanie obiektowe

Przykłady programowe

Konstruktory

Program 3.2a

Program 3.2b

C:\

C:\

background image

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

background image

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

background image

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

background image

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

background image

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

background image

59

Programowanie obiektowe

Przykłady programowe

Konstruktory i destruktory

Program 3.4

Program 3.5

C:\

C:\

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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ą.

background image

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

background image

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;

background image

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

background image

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:

background image

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

background image

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

background image

72

Programowanie obiektowe