PO W3 IV ZIN


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 zaprzyjaznione
Programowanie obiektowe
1
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.
Programowanie obiektowe
2
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;
Programowanie obiektowe
3
Ewolucja języków programowania
1950 1960 1970 1980 1990
2000
PL/I(66)
Ada(95)
Ada(83)
Cobol(58)
Eiffel (86)
Pascal(70)
Java(96)
Algol(60)
C(72)
C++(89)
Fortran(54)
Simula(67) Smalltalk(80)
Basic(66)
Programowanie obiektowe
4
A S S E M B L Y
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.
Programowanie obiektowe
5
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.
Programowanie obiektowe
6
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;
Programowanie obiektowe
7
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ózniej)
Programowanie obiektowe
8
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
Programowanie obiektowe
9
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
Programowanie obiektowe
10
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
Programowanie obiektowe
11
Deklaracja klasy - przykład
#define SIZE 100
class stack
{
int stck[SIZE];
int tos;
public:
void init();
void push(int i);
int pop();
};
Programowanie obiektowe
12
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++;
}
Programowanie obiektowe
13
Deklaracja klasy - przykład
int stack::pop()
{
if (tos==0) {
cout <<  Stos jest pusty.\n ;
return 0;
}
tos--;
return stck[tos];
}
Programowanie obiektowe
14
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;
Program 3.0
}
Wynik działania programu: 3 1 4 2
Programowanie obiektowe
15
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:
wskazników;
np. wsk_na_obiekt -> metoda();
operator zakresu  :: 
klasa::pole;
klasa::metoda();
Programowanie obiektowe
16
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;
Programowanie obiektowe
17
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)
{
operator zakresu w nagłówku
osoba::wiek = wiek;
strcpy(imie, p_imie);
strcpy(nazwisko, p_nazwisko);
};
tu te\ operator zakresu,
bo  wiek jest przysłonięty
Programowanie obiektowe
18
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();
Programowanie obiektowe
19
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
Programowanie obiektowe
20
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: "<" nazwisko: "<}
Programowanie obiektowe
21
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?
Programowanie obiektowe
22
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();
};
Programowanie obiektowe
23
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
Programowanie obiektowe
24
Paradygmat programowania obiektowego
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
Programowanie obiektowe
25
Paradygmaty programowania obiektowego
Hermetyzacja
Dziedziczenie
Polimorfizm
Programowanie obiektowe
26
Hermetyzacja
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.
Programowanie obiektowe
27
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;
Programowanie obiektowe
28
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:
klasa bazowa
osoba
klasy pochodne
dziecko
dorosły
ka\dy dorosły i ka\de dziecko jest osobą (generalizacja);
dorosły jest przypadkiem szczególnym osoby, podobnie jak dziecko
(specjalizacja);
Programowanie obiektowe
29
Dziedziczenie
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);
Programowanie obiektowe
30
Dziedziczenie
sekcja docelowa dla składowych
dziedziczonych
Postać ogólna dziedziczenia:
class Klasa_pochodna: sekcja Klasa_bazowa_1 [, Klasa_bazowa_N]
{
// nowe składowe
// funkcje odziedziczone nadpisane (przedefiniowane)
};
tzw. dziedziczenie wielobazowe
Programowanie obiektowe
31
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 (::)
Programowanie obiektowe
32
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();
};
Programowanie obiektowe
33
Przykład  klasa pochodna dorosly
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;
Programowanie obiektowe
34
Dziedziczenie
klasa pochodna
Klasa  dorosly
klasa bazowa
class dorosly: public osoba
{
sekcja docelowa dla składowych
dziedziczonych
char * nr_dowodu;
nowa składowa
public:
void wczytaj ();
void wypisz ();
void ustaw(int wiek, char *p_imie, char *p_nazwisko,
char *nr_dow);
};
metody odziedziczone ale przedefiniowane
Programowanie obiektowe
35
Dziedziczenie
sekcja docelowa dla składowych dziedziczonych:
class Klasa_pochodna : public Klasa_bazowa;
Klasa_bazowa Klasa_pochodna
// sekcja // sekcja
// public // public
// sekcja // sekcja
// protected // protected
// sekcja // sekcja
// private // private
dziedziczone ale niedostępne w klasie
pochodnej; dostępne poprzez
dziedziczone funkcje nieprywatne
Programowanie obiektowe
36
Dziedziczenie
sekcja docelowa dla składowych dziedziczonych:
class Klasa_pochodna : protected Klasa_bazowa;
Klasa_bazowa Klasa_pochodna
// sekcja // sekcja
// public // public
// sekcja // sekcja
// protected // protected
// sekcja // sekcja
// pivate // pivate
dziedziczone ale niedostępne w klasie
pochodnej; dostępne poprzez
dziedziczone funkcje nieprywatne
Programowanie obiektowe
37
Dziedziczenie
sekcja docelowa dla składowych dziedziczonych:
class Klasa_pochodna : private Klasa_bazowa;
Klasa_bazowa Klasa_pochodna
// sekcja // sekcja
// public // public
// sekcja // sekcja
// protected // protected
// sekcja // sekcja
// private // private
dziedziczone ale niedostępne w klasie
pochodnej; dostępne poprzez
dziedziczone funkcje nieprywatne
Programowanie obiektowe
38
Dziedziczenie
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
trzeba je zdefiniować w klasie pochodnej
destruktory
Programowanie obiektowe
39
Dziedziczenie - podsumowanie
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
Program 3.1
Programowanie obiektowe
40
Dziedziczenie
Przykład hierarchii klas
samochód  wywodzi się
autobus
osobowy
cię\arowy
Fiat VW opel
Programowanie obiektowe
41
Polimorfizm
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 Jedz inaczej będzie się zachowywała dla
Samochodu a inaczej dla Roweru;
zasięg polimorfizmu ograniczony jest do poddrzewa hierarchii
dziedziczenia;
Programowanie obiektowe
42
Wielokrotne stosowanie nazw - polimorfizm
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
Programowanie obiektowe
43
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)
Programowanie obiektowe
44
Konstruktory
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;
Programowanie obiektowe
45
Konstruktory
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
};
Programowanie obiektowe
46
Konstruktory
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) { };
};
Programowanie obiektowe
47
Konstruktory
Lista inicjalizacyjna konstruktora  przykład 2
class abc
{
const double stala;
deklaracja konstruktora
float x;
char c;
public:
abc(float pp, double dd, char znak);
};
...
abc::abc(float pp, double dd, char znak) : stala(dd), c(znak)
{
definicja konstruktora
x=pp;
}
Programowanie obiektowe
48
Konstruktory
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;
Programowanie obiektowe
49
Konstruktory
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);
};
" obiekt p1  inicjowanie listą
" obiekt p2  inicjowanie konstruktorem (zadziałają dwa konstruktory!)
Programowanie obiektowe
50
Destruktory
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
Programowanie obiektowe
51
Destruktory
Destruktor klasy  Klasa :
~Klasa() { };
lub
~Klasa();
&
Klasa::~Klasa() { };
Przykład:
~Punkt()
{cout << "Destruktor punktu x= " <~Odcinek()
{ cout << "Destruktor odcinka \n"; }
Programowanie obiektowe
52
Konstruktory
Przykłady programowe
Program 3.2a
C:\
C:\ Program 3.2b
Programowanie obiektowe
53
Konstruktory
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)
{ ...
};
};
Programowanie obiektowe
54
Konstruktory
Konstruktor klasy pochodnej
Lista inicjalizacyjna konstruktora
Na liście muszą znalezć 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;
Programowanie obiektowe
55
Konstruktory
Konstruktor klasy pochodnej - Przykład
class dorosly: public osoba
{
char * nr_dowodu;
public:
Program 3.3
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)) { };
};
Programowanie obiektowe
56
Konstruktory
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.
Programowanie obiektowe
57
Destruktory
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;
Programowanie obiektowe
58
Konstruktory i destruktory
Przykłady programowe
Program 3.4
C:\
Program 3.5
C:\
Programowanie obiektowe
59
Funkcje zaprzyjaznione
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 zaprzyjazniona jest wprowadzana słowem kluczowym friend
Sposób stosowania:
class figura{
int x,y;
& & .
friend void goniec(figura f)
};
Programowanie obiektowe
60
Funkcje zaprzyjaznione
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 zaprzyjaznionych:
Funkcja mo\e być zaprzyjazniona 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.
Programowanie obiektowe
61
Funkcje zaprzyjaznione
Poniewa\ funkcja typu friend nie jest składnikiem klasy to nie ma wskaznika
this czyli musi się posłu\yć operatorem jawnego wskaznika lub przypisania,
aby wykonać działania (tak\e te na składniku klasy, z którą jest
zaprzyjazniona).
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ą zaprzyjaznioną.
Nie musi być funkcją składową \adnej klasy, ale mo\e nią być
Programowanie obiektowe
62
Funkcje zaprzyjaznione
Klasa mo\e się przyjaznić z wieloma funkcjami, które są lub nie są
składnikami innych klas;
Funkcje zaprzyjaznione nie są przechodnie, czyli zaprzyjaznienie nie
przenosi się z klasy do klasy, tzn. zaprzyjaznienie nie podlega
mechanizmowi dziedziczenia (w tym przypadku  przyjaciel mojego
przyjaciela nie jest moim przyjacielem );
Z zasady umieszcza się funkcje zaprzyjaznione na początku wszystkich
deklaracji w klasie;
Przykład programowy
Program 3.6
Programowanie obiektowe
63
Klasy zaprzyjaznione
Dopuszcza się stosowanie słowa kluczowego friend do definiowania klas
zaprzyjaznionych; w takim przypadku wszystkie funkcje składowe klasy
zaprzyjaznionej mają dostęp do prywatnych składników drugiej klasy.
Przykład programowy
Program 3.7
Programowanie obiektowe
64
Referencje
Język C++ posiada dodatkową cechę związana ze wskaznikami - referencję;
Zasadniczo referencja to niejawny wskaznik;
Mo\na ja wykorzystywać na trzy sposoby:
1) jako parametr funkcji,
2) jako zwracaną wartość,
3) jako zmienną referencyjną.
Programowanie obiektowe
65
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
Programowanie obiektowe
66
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 wskaznika
do argumentu; mo\na to realizować na dwa sposoby:
jawne przekazanie wskaznika do parametru;
posłu\enie się się tzw. parametrem referencyjnym;
Programowanie obiektowe
67
Referencje jako parametry
Przykład jawnego przekazania wskaznika do parametru
Program 3.9
Przykład u\ycia parametru referencyjnego
Program 3.10
Programowanie obiektowe
68
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
c:
Program 3.11
Programowanie obiektowe
69
Zwracanie referencji
Funkcja mo\e zwracać referencję;
W konsekwencji funkcja mo\e występować z lewej strony instrukcji
przypisania!
Przykład
Program 3.12
Programowanie obiektowe
70
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
Programowanie obiektowe
71
Programowanie obiektowe
72


Wyszukiwarka

Podobne podstrony:
PO W4 IV ZIN
PO W3 II ZIN
PO W3 II ZIN
PO W2 IV ZIN
PO W1 2 II ZIN
sprawdzian wiadomosci z jezyka angielskiego po klasie iv
PO W7 8 II ZIN
PO W4 II ZIN
Wędrówka po Helladzie ( księgi IV V ) Pauzaniasz
Learning Italian Ebook cz IV (po angielsku)
W3 Akustyka 2012 po 3
PO W 5 6 II ZIN
Ilustrowany przewodnik po zabytkach kultury na Ukrainie T IV
Rozgrzewka po kwadracie – cz 2

więcej podobnych podstron