Sunteți pe pagina 1din 9

Notiuni generale despre POO.

Conceptele de baza
Programarea orientat obiect (POO) este o metod de proiectare i
implementare n care programele sunt reprezentate sub forma unor
colecii de obiecte care interacioneaz ntre ele. n practic trebuie s
se decid ce clase sunt necesare, trebuie proiectat cate un set complet
de operaii pentru acestea, trebuie explicitate prile comune ale lor
prin relaia de motenire (derivare, generalizare) i trebuie folosit
polimorfismul.
Concepte de baz n POO
Abstractizarea - capacitatea de a reprezenta concepte direct ntr-un
program i de a ascunde detaliile din spate (se ofer clase i obiecte).
ncapsulare - capacitatea de a oferi garanii c o abstractizare este
utilizat numai n conformitate cu specificaiile sale.
Modularitatea- Modalitate de a grupa abstractizri legate logic ntre
ele.
Polimorfism - capacitatea de a oferi aceeai interfa pentru obiecte
cu implementari diferite. Conduce la simplificarea codului folosind
abstraciuni.
Motenirea - posibilitatea de a construi noi abstractizri pornind de
la una deja existent. Este una dintre cele mai puternice moduri de
construcie de abstraciuni utile
Genericele- capacitatea de parametrizare a tipurilor i funciilor prin
tipuri i valori, fiind un instrument puternic pentru a scrie algoritmi
generali.

Structura unei clase . Date. Metode. Proprietati.


O clas descrie unul sau mai multe obiecte ce pot fi precizate printr-un set uniform de
atribute(date) i metode(funcionalitate).
Orice obiect are memoria sa proprie unde se pstreaz valorile tuturor atributelor sale
Orice obiect are un tip
Un obiect este o instan a unei clase
Clasa definete caracteristicile i comportarea obiectelor
Definirea unei clase presupune:
combinarea datelor cu operaiile ce se aplic acestora
ascunderea informaiei
Sintaxa definirii unei clase
Definirea unei clase const din dou pri distincte:
declararea clasei
implementarea clasei
Sintaxa
class IdNumeClasa{ declaratii de date membru;
declaratii/definiii de functii membru; };
Protecia datelor i funciilor membre
Funciile i datele unei clase pot fi grupate din punct de vedere al dreptului de acces n:
private conine date i funcii membre care pot fi folosite doar de ctre celelalte funcii
aparinnd clasei respective;
protected similar cu private dar care d drepturi de acces i funciilor membre ale claselor
derivate din clasa respective
public drept de acces tuturor
Declararea datelor
class IdNumeClasa{ tip idNumeData1[=exp1],idNumeData2[=exp2],
,idNumeDataN[=expN]; };
unde tip reprezint un tip de date, IdNumeData1, IdNumeData2, ..., IdNumeDataN reprezint
denumiri valabile de variabile iar exp1, exp2, ...,expN reprezint expresii ce se evalueaz i a
cror valoare este atribuit la declarare variabilelor corespunztoare.
Declararea/definirea unei metode
Declarare
class IdNumeClasa{
tip idNumeMetoda(tip1 p1, , tip pn); };
Definire
tip IdNumeClasa:: tip idNumeMetoda(tip1 p1, , tip pn){
//instructiuni }

Constructori si distructori
Caracteristicile constructorilor
au acelai nume cu cel al clasei din care fac parte
nu returneaz nimic (nici macar tipul void)
o clas poate avea mai muli constructori
nu pot primi ca parametri instane ale clasei ce se definete, ci doar pointeri sau
referine la instanele clasei respective
constructorii nu sunt apelai explicit (in general)
constructorii nu se motenesc
constructori nu pot fi funcii virtuale

Tipuri de constructori
Constructori implicii
definit de utilizator constructor ce nu are niciun parametru
generat de compilator daca o clas nu are niciun constructor definit atunci
compilatorul genereazunul automat, far parametri al crui corp nuconine nicio
instruciune
constructor cu toi parametri implicii
Constructori cu parameteri
cu parametri ce nu iau valori implicite
cu parametri ce iau valori implicite (la apel, acetia pot sa lipseasc, caz n care ei au
valorile implicite specificate la declarare).
Constructori de copiere
Permit iniializarea obiectelor din altele deja existente
Sunt definii de utilizator i generai de compilator

Destructori
Destructorul este o funcie membr special a unei clase ce apeleaz n mod automat
distrugerea unui obiect. Este definit de utilizator si generat de compilator, avand rolul de
a elibera zonele alocate dinamic.
class IdNumeClasa { ...
~IdNumeClasa ();...};
IdNumeClasa::~IdNumeClasa (){
//instructiuni}
Caracteristici
Are acelai nume cu numele clasei si este precedat de ~
Nu are parametric
Nu returneaza nimic (nici macar void)
O clasa poate avea un singur destructor

Pot fi functii virtuale

Functii si clase de tipul friend


Funciile friend (prieten) sunt funcii associate unor clase care au acces la datele i metodele
protejate ale acelor clase dei nu sunt funcii membre ale acelei clase.
Tipuri de funcii prieten
funcii globale
funcii membre ale altor clase
Funcii friend globale
Declararea unei funcii friend se face incluznd prototipul ei, precedat de cuvntul cheie
friend, n acea clas
class IdClasa {
friend tip_ret id_functie_prieten(lista_de_parametri);};
Definiia funciei se face n afara clasei
tip_ret id_functie_prieten(lista_de_parametri) {
//corpul de instructiuni n care avem acces la datele protejate ale obiectelor clasei IdClasa}
Funcii friend membre ale altor clase
Sunt funcii membre ale unei clase ce au acces la datele membru protejate ale
unei alte clase.
Declararea unei funcii friend se face incluznd prototipul ei, precedat de cuvntul
cheie friend, n clasa n care se dorete accesul
class IdClasaA; //declarare a clasei IdClasaA naintea definirii clasei IdClasaB
class IdClasaB {
tip_ret id_functie_prieten(lista_de_parametri); //declararea funciei};
class IdClasaA {
friend tip_ret IdClasaB::id_functie_prieten(lista_de_parametri);};
tip_ret IdClasaB::id_functie_prieten(lista_de_parametri) {
//corpul de instructiuni n care avem acces la datele protejate ale obiectelor clasei IdClasaA}
Clase friend
Dac dorim ca toate metodele dintr-o clas IdClasaB s aibe acces asupra tuturor datelor
membre protejate ale unei alte clase IdClasaA atunci declarm clasa IdClasaB ca fiind
clas friend (prieten) pentru clasa IdClasaA
Sintaxa declarrii claselor prietene este urmtoarea:
class IdClasaB; //declarare a clasei IdClasaB inaintea definirii clasei IdClasaA
class IdClasaA {
friend class IdClasaB;};
Relaia de prietenie dintre dou clase nu este reflexiv:Dac clasa IdClasaA este clas prieten a
clasei IdClasaB,atunci nu i reciproca este valabil
Relaia de prietenie nu este tranzitiv: dac clasa IdClasaA este clas prieten clasei IdClasaB,
iar IdClasaB este clas prieten clasei IdClasaC, asta nu implic faptul c IdClasaA este clas
prieten a clasei IdClasaC.
Relaia de prietenie nu se motenete n clasele derivate.

Mostenirea simpla si multipla


Mostenirea este o caracteristica a limbajelor de programare orientate obiect,
care permite refolosirea codului si extinderea functionalitatii claselor existente.
Mecanismul mostenirii permite crearea unei ierarhii de clase si trecerea de la
clasele generale la cele particulare. (Un concept poate fi implementat printr-o
clasa). Aceasta proprietate se manifesta prin faptul ca din orice clasa putem
deriva alte clase. Procesul implica la inceput definirea clasei de baza care
stabileste calitatile comune ale tuturor obiectelor ce vor deriva din baza
(ierarhic superioara). Prin mostenire, un obiect poate prelua proprietatile
obiectelor din clasa de baza.
Mostenirea poate fi:
Simpla (o clasa are doar o superclasa, rezultand o structura arborescenta);
Multipla (o clasa are mai multe superclase, rezultand o structura de retea).
Informatia comuna apare in clasa de baza, iar informatia specifica - in clasa
derivata. Clasa derivata reprezinta o specializare a clasei de baza. Orice clasa
derivata mosteneste datele membru si metodele clasei de baza. Deci acestea nu
trebuie redeclarate in clasa derivata.
La modul general, la declararea unei clase derivate, se specifica o lista a
claselor de baza, precedate de modificatorul de acces care precizeaza tipul
mostenirii.
class <nume_cls_deriv>: <modificator_de_acces> <nume_clasa_de_baza>
{ //corpul clasei derivate - elemente specifice clasei derivate
};
Daca A si B sunt doua clase, spunem ca B mosteneste pe A (B este
derivata din A ori B este o specializare a lui A) daca:
clasa B are toate atributele si metodele clasei A
clasa B poate redefini metode ale clasei A
clasa B poate adauga noi membrii in afara celor mostenisti de la A

Functii virtuale. Clase abstracte. Polimorfizm.


Cu ajutorul funciilor virtuale i al polimorfismului este posibil
proiectarea i implementarea sistemelor software care sunt mult mai
uor extensibile. Programele pot fi concepute s proceseze n mod
generic, sub forma obiectelor din clasele de baz, a obiectelor tuturor
claselor dintr-o ierarhie. Clasele care nu exist n timpul dezvoltrii
iniiale a programului pot fi adugate ulterior cu modificri minore sau
chiar fr a face modificri prii generice a programului, atta timp
ct clasele sunt pri ale ierarhiei procesate generic. Singurele pri
din program care trebuie modificate sunt cele care folosesc informaii
specifice despre o clas adugat n ierarhie.
- Funciile virtuale
S presupunem c avem mai multe clase care reprezint forme
geometrice: Point, Circle, Triangle, Rectangle, Square derivate din clasa
de baz Shape. Fiecare dintre aceste clase trebuie s permit afiarea
numelui formei pe care o reprezint. Dei fiecare clas are o funcie
printShapeName, implementarea funciei printShapeName pentru
fiecare form este diferit. Ar fi de dorit ca toate formele s poat fi
tratate generic, fiind derivate din clasa de baz Shape. Prin acest
mecanism, pentru oricare dintre forme s-ar apela funcia
printShapeName din clasa de baz Shape, urmnd ca, dup tipul de
dat al obiectului, programul s determine dinamic (n timpul
execuiei) care dintre funciile printShapeName din clasele derivate se
folosete. Pentru a permite acest lucru, funcia printShapeName
trebuie declarat virtual n clasa de baz, iar fiecare clas din ierarhia
de derivare trebuie s o suprascrie pentru ca s implementeze un
comportament particular. Declararea unei funcii virtuale se face prin
adugarea cuvntului cheie virtual naintea prototipului n clasa de
baz:

virtual void printShapeName() const;


Clase de baz abstracte i clase de baz concrete
Cnd ne gndim la o clas ca la un tip de dat, ne ateptm ca n
aplicaiile care folosesc acea clas s fie instaniate obiecte ale sale.
Exist, totui, cazuri n care este util s se declare clase pentru care
programatorul nu are intenia s instanieze obiecte. Acestea sunt
clase abstracte. Deoarece acestea sunt folosite drept clase de baz n
ierarhii de motenire, obinuim s le numim clase de baz abstracte.
Aadar, nu pot fi instaniate obiecte din clasele de baz abstracte.
Rolul unei clase abstracte este acela de a crea o clas de baz din care
alte clase pot moteni interfaa sau implementarea. Clasele din care

pot fi instantiate obiecte sunt clase concrete. Clasele de baz


abstracte sunt de regul prea generice pentru a defini obiecte reale.
Este nevoie de clase mai specifice pentru a putea justifica posiblitatea
de a instania obiecte. O clas devine abstract dac una sau mai
multe funcii virtuale este declarat pur. O funcie virtual devine
pur dac declaraia sa este urmat de =0: virtual void earnings()
const = 0; //functie virtuala pura Dac o clas este derivat dintr-o
clas de baz care conine o funcie virtual pur i nu definete acea
funcie, atunci funcia este pur i n clasa derivat, iar clasa derivat
este i ea abstract. O ierarhie de clase nu trebuie s conin neaprat
clase abstracte. Atunci cnd se ntmpl, ns, acest lucru, clasele
abstracte se gsesc n vrful ierarhiei, iar la baza ierarhiei sunt clase
concrete.
Polimorfismul
Limbajul C++ ofer suport pentru polimorfism care nseamn
posibilitatea ca obiecte din diverse clase care sunt legate prin relaii de
motenire s rspund diferit la acelai mesaj, adic la acelai apel de
funcie. Polimorfismul este implementat prin funciile virtuale. Atunci
cnd programul cere folosirea unei funcii printr-un pointer sau o
referin la o clasa de baz, C++ alege suprascrierea corect din clasa
derivat corespunztoare obiectului care o apeleaz. Uneori, o funcie
non-virtual este definit n clasa de baz i suprascris ntr-o clas
derivat. Dac o astfel de funcie membr este apelat printr-un
pointer la clasa de baz iniializat cu adresa unui obiect al unei clase
derivate, este apelat versiunea din clasa de baz. Dac funcia
membr este apelat printr-un pointer la clasa derivat, este folosit
versiunea funciei din clasa derivat. Acesta este un comportament
non-polimorfic.
Polimorfismul promoveaz extensibilitatea. Aplicaiile software scrie n
manier polimorfic sunt independente de tipurile obiectelor ctre care
se trimit mesaje. Astfel, noile tipuri de obiecte care rspund la
mesajele existente pot fi adugate ntrun astfel de sistem fr a
modifica sistemul de baz. Atunci cnd codul client intaniaz, ns,
obiecte noi, programul trebuie recompilat. Cu toate c nu se pot
instania obiecte din clasele de baz abstracte, se pot declara pointeri
sau referine la aceste clase. Aceti pointeri sau referine pot fi utilizai
pentru a permite manipulrile polimorfice ale obiectelor din clasele
derivate cnd se instaniaz astfel de obiecte din clase concrete.
Polimorfismul i funciile virtuale sunt utile i atunci cnd, ntr-o faz

intermediar a proiectrii i implementrii unei aplicaii software, nu


sunt cunoscute toate clasele care vor fi folosite n versiunea final.
Noile clase care sunt adugate sistemului sunt integrate prin legarea
dinamic (dynamic binding, numit uneori i late binding). Tipul unui
obiect care apeleaz o funcie virtual nu este nevoie s fie cunoscut
la compilare. La rulare, funcia apelat virtual este identificat cu
funcia membr din clasa creia i aparine obiectul.

Supraincarcarea operatorilor
Operatorii sunt notaii concise, infixate, pentru operaii
matematice uzuale. Limbajul C++, ca orice limbaj de
programare asigur un set de operatori pentru tipurile
primitive. n plus, fa de limbajul C, C++ ofer posibilitatea
asocierii operatorilor existeni cu tipurile definite de utilizator.
Astfel, prezint interes extinderea operatorilor:
n aritmetic complex
n algebra matricial
n lucrul cu iruri de caractere, etc
Un operator poate fi privit ca o funcie, n care termenii sunt
argumentele funciei:
n lipsa operatorului + expresia a+b s-ar calcula apelnd
funcia aduna(a,b)
Procedeul const n definirea unei funcii cu numele:
operator symbol
unde:
operator este cuvntul cheie dedicat
simbol este simbolul oricrui operator C++, mai puin
urmtoriii: ., *, ::, ?:, sizeof.
Reguli pentru suprancrcare:
Setul de operatori ai limbajul C++ nu poate fi extins prin
asocierea de semnificaii noi unor caractere, care nu sunt
operatori (de exemplu nu putem defini operatorul **).
Prin suprancrcarea unui operator nu i se poate modifica
aritatea (astfel operatorul ! este unar i poate fi
supraincarcat numai ca operator unar). De asemeni
asociativitatea i precedena operatorului se menin.
La suprancrcarea unui operator nu se pot specifica
argumente cu valori implicite.
Operatorii suprancrcai ntr-o clas sunt motenii n
clasele derivate (excepie face operatorul de atribuire=).

S-ar putea să vă placă și