PO W3 IV ZIN id 364242 Nieznany

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

ż

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.

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

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 wczytaj, wypisz, ustaw:



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

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


Wyszukiwarka

Podobne podstrony:
PO W1 IV ZIN id 364236 Nieznany
PO W2 IV ZIN id 364240 Nieznany
PO W1 2 II ZIN id 364239 Nieznany
PO W3 IV ZIN
PO W 5 6 II ZIN id 364233 Nieznany
Fotogrametria IV 007 id 180190 Nieznany
AnFinP W3 2014 stud id 63620 Nieznany (2)
PO W4 IV ZIN
IV WYZN id 221018 Nieznany
Fotogrametria IV 007 id 180190 Nieznany
PO W2 IV ZIN
po w3 id 557613 Nieznany
PO W3 id 364241 Nieznany
PO lab 5 id 364195 Nieznany
Zestaw IV id 588409 Nieznany
IV CR 216 77 id 220956 Nieznany

więcej podobnych podstron