You are on page 1of 25

Programarea in C++.

Programare orientate obiect(POO)


1. Scurt istoric
In anul 1970, doi programatori, Brian Kerninghan si Dennis Ritchie, au creat limbajul C. Principalul scop pentru care a fost realizat acest limbaj este rescrierea sistemului de operare UNIX, pentru a-l face portabil pe toate platformele existente. Marele a antaj al limbajului ! este acela de a fi extrem de flexibil si de a permite atat programarea la ni el inalt cat si la ni el scazut. !-ul este un limbaj procedural, asadar un program scris in ! incepe de obicei cu definirea structurilor de date, apoi definirea functiilor pentru lucrul cu aceste structuri. !resterea complexitatii programelor a dus la necesitatea elaborarii unor alte tipuri de limbaje. "stfel, destinate inteligentei artificiale, au aparut limbajele care au la baza notiunea de #cadru# si cele care pleaca de la ideea de # actor#. Primele implementeaza operatii asupra unor modele de entitati$ celelalte presupun faptul ca obiectele nu sunt simple elemente pasi e asupra carora se fac anumite prelucrari, ci, dimpotri a, ca menirea acestor obiecte consta in a realiza prelucrarile asupra lor insile. %e aici a pornit ideea de a grupa structurile de date cu operatiile care prelucreaza respecti ele date. "stfel s-a nascut notiunea de obiect sau clasa. Proiectarea de programe utilizand clase se numeste programare orientata pe obiecte (OOP). Primele limbaje orientate pe obiecte au fost I!U"# &19'() si I!U"#$% &19'7). In anii *70 a aparut si celebrul limbaj !#""&#"K. !el mai mare deza antaj al lor a fost faptul ca au aparut ca limbaje de sine statatoare, a and o raspandire relati redusa. %in acest moti , putin programatori erau dispusi in acea reme sa renunte la limbajele consacrate doar pentru a lucra obiectual. In anul 19+0, ,jarne -troustrup a conceput limbajul # C 'ith Classes#. "cest limbaj a dus la imbunatatirea !-ului prin adaugarea unor noi facilitati, printre care si lucrul cu clase. In ara 19+., !-/it0-classes a patruns si in lumea academica si a institutiilor de cercetare. "stfel, acest limbaj a putut sa e olueze datorita experientei acumulate de catre utilizatorii sai. %enumirea finala a acestui limbaj a fost C((. -uccesul extraordinar pe care il are limbajul !11 a fost asigurat de faptul ca a extins cel mai popular limbaj al momentului, !. Programele scrise in ! functioneaza si in !11, si ele pot fi transformate in !11 cu eforturi minime. !ea mai recenta etapa in e olutia acestui limbaj o reprezinta limbajul )#*#, realizat de firma UN, care nu este altce a decat un limbaj !11 putin modificat si extins. Interesanta este urmatoare afirmatie a lui -troupstrup2 # utili+atorii au inceput sa ,oloseasca C(( inainte ca specialistii sa aiba timpul necesar sa$i instruiasca pentru a$l ,olosi cu randament ma-im#. Intr-ade ar, s-a constatat ca mare parte dintre compilatoarele de !11 existente nu sunt folosite decat pentru dez oltarea de soft/are structurat, si nu orientat pe obiecte &altfel spus, se lucreaza in ! pe un compilator de !1 1). Programatorii au descoperit ulterior ca aplicatiile orientate pe obiecte sunt mai usor si mai rapid de scris, si nu in ultimul rand mai usor de inteles. %e ce este asa, eti afla in capitolul urmator.

2. Notiunile de baza ale programarii orientate obiect


2.1. Premisele limbajelor orientate obiect
In ultimii ani, programarea orientata pe obiecte a de enit foarte populara, mai ales datorita a antajelor sale care ajuta dez oltarii proiectelor actuale, ce de in din ce in ce mai complexe. "cest stil de programare duce la impartirea aplicatiilor in mai multe module, astfel incat cel ce dez olta un modul nu trebuie sa cunoasca detaliile de implementare a altor module. 3u in ultimul rand, trebuie sa amintim ca programarea orientata pe obiecte este un concept foarte natural. In lumea inconjuratoare, zi de zi, in orice moment, a em de-a face cu Obiecte. Imprejurul nostru sunt o multitudine de obiecte, interconectate intre ele, comunicand unele cu altele intr-un fel sau altul. %omeniul in care acest stil de programare s-a do edit cel mai util este dez oltarea interfetelor utilizator si a aplicatiilor bazate pe acestea. Programarea structurata este bazata pe ecuatia enuntata de 3i4laus 5irt02 tructuri de date ( #lgoritmi . Program Programarea structurata a fost o etapa ce a trebuit sa fie depasita, deoarece este deficitara in ceea ce pri este posibilitatea reutilizarii programelor, scalabilitatii si extinderii unor module de program, atribute de neinlocuit in realizarea aplicatiilor complexe. Principala deficienta a programarii structurate consta in tratarea separata a algoritmilor si a structurilor de date ce se prelucreaza. %e obicei, in natura, o entitate este caracterizata atat printr-o structura, cat si printr-un anume comportament. In mod normal, obiectele e olueaza in timp, adeseori modificandu-si structura si functionalitatea.

2.2. Concepte fundamentale


Ideea de baza de la care pleaca programarea orientata obiect este de a grupa structurile de date cu operatiile care prelucreaza respecti ele date. 6n asemenea ansamblu poarta denumirea de obiect sau clasa. Proiectarea de programe utilizand clase se numeste programare orientata pe obiecte (OOP). In mod frec ent, pentru structurile de date se utilizeaza denumirea de date membre sau campuri, iar pentru procedurile ce prelucreaza aceste date, termenul de ,unctii membre sau metode. In analogie cu ecuatia programarii structurate, se poate considera ca alabila urmatoarea relatie2 Date ( !etode . Obiect "cest ansamblu este bazat pe principiul fundamental al incapsularii datelor, conform caruia accesul la datele membre se poate face numai prin intermediul setului de metode asociat. "cest principiu determina o abstractizare a datelor in sensul ca un obiect este caracterizat complet de specificatiile metodelor sale, detaliile de implementare fiind

transparente pentru utilizator. "cest aspect este 0otarator in cazul proiectelor complexe, de dimensiuni mari, care nu pot fi realizate decat cu ajutorul unor ec0ipe de programatori. "plicatiile pot fi impartite cu usurinta in module, astfel ca cel ce dez olta un modul nu trebuie sa cunoasca detaliile de implementare a celorlalte module. !onsecintele imediate sunt scaderea timpului de dez oltare a aplicatiilor, simplificarea acti itatii de intretinere a modulelor, si cresterea calitatii programelor. Pri ind limbajele orientate obiect ca o e olutie a limbajelor structurate, constatam ca notiunea de clasa este o generalizare a notiunii de structura de date. 7 clasa descrie un ansamblu de obiecte similare. 6n obiect este asadar o ariabila de un anumit tip clasa. In mod uzual, se foloseste exprimarea ca un obiect este instantierea unei clase. 6n alt concept important in cadrul programarii orientate obiect este cel de polimor,ism, care se refera la posibilitatea de a opera cu mai multe ariante ale unei functii, care efectueaza o anumita operatie in mod specific pentru anume obiecte. 8 olutia si ierar0izarea claselor de obiecte se bazeaza pe conceptul de mostenire. "stfel, procedeul numit deri/are permite definirea unei noi clase &clasa deri/ata) pornind de la o clasa existenta &clasa de ba+a), prin adaugarea de noi date si metode, e entual redefinirea unor metode. !lasa deri ata mosteneste de la clasa de baza structura de date si metodele aferente. 8ste posibila totodata si deri area unei clase din mai multe clase de baza, aceasta operatie fiind denumita mostenire multipla. "sadar, dintr-o clasa de baza pot fi deri ate mai multe clase si fiecare clasa deri ata poate de eni la randul ei o clasa de baza pentru alte clase deri ate. -e poate astfel realiza o ierarhie de clase, care sa modeleze sisteme complexe. !onstruirea ierar0iei de clase constituie acti itatea fundamentala de realizare a unei aplicatii orientate obiect, reprezentand in fapt faza de proiectare a respecti ului sistem.

. Clase
.1. !eclararea claselor
7 sintaxa simplificata a declararii unei clase este urmatoarea2 class 3ume!lasa 9 ... declaratii ariabile member ... declaratii functii member ... : %upa cum se poate obser a din aceasta alcatuire a declaratiei, clasa este asemanatoare cu o structura din limbajul !, dar care poate a ea in componenta sa membri atat de tip ariabila cat si de tip functie. "sa cum spuneam si in capitolul precedent, pentru datele din interiorul clasei se utilizeaza de obicei termenul de date membre, iar

pentru functii denumirea de ,unctii membre sau metode. 7 clasa permite incapsularea in interiorul sau a datelor si a codului. Intocmai ca in limbajul !, pentru a putea utiliza efecti un tip de date &in cazul de fata o clasa), trebuie sa definim o ariabila de acel tip. Intr-un mod similar declaratiei int i0 putem scrie2 NumeClasa /ariabila ;om considera de acum incolo ca /ariabila poarta numele de obiect. 8xprimarea uzuala este ca un obiect este instantierea unei clase.

.2. "embrii unei clase


"ccesarea membrilor unei clase se face ca in cazul structurilor din limbajul !2 obiect1*ariabila!embra . /aloare pentru accesul la o ariabila membra, si obiect12unctie!embra() pentru apelarea unei functii membre. Pentru exemplificare sa consideram o implementare a notiunii de punct. !a ariabile membre a em ne oie doar de coordonatele x si < care definesc pozitia in spatiu a unui punct. "m mai declarat o functie care calculeaza aria dreptung0iului a and colturile &0, 0) si &x, <). class Point 3 unsigned -4 50 unsigned long #rie() 3 return - 6 50 70 unsigned 8etX()0 unsigned 8et9()0 /oid etX(unsigned X)0 /oid et9(unsigned 9)0

70 unsigned Point::8etX() 3 return -0 7 unsigned Point::8et9() 3 return 50 7 /oid Point:: etX(unsigned X) 3 - . X0 7 /oid Point:: et9(unsigned 9) 3 5 . 90 0 7 "m folosit un operator nou, specific !11, ::, numit operator de re+olutie, numit si operator de acces sau de domeniu. 8l permite accesul la un identificator, dintr-un bloc in care acesta nu este izibil datorita unei alte declaratii locale. 6n exemplu de folosire este urmatorul2 c0ar =sir > # ariabila globala#$ oid functie&) 9 c0ar =sir > # ariabila locala#$ printf&#?s@n#, 22sir)$ AA afiseaza ariabila globala printf&#?s@n#, sir)$ AA afiseaza ariabila locala : Pentru definitiile functiilor membre aflate in afara declaratiei clasei este necesara specificarea numelui clasei urmat de acest operator, indicand faptul ca functia are acelasi domeniu cu declaratia clasei respecti e si este membra a ei, desi este definita in afara declaratiei.

. . Crearea si distrugerea obiectelor


-a consideram urmatorul program !112 /oid main() 3 Point p0 7 In momentul definirii ariabilei p, a fi alocat automat spatiul de memorie necesar, acesta fiind eliberat la terminarea programului. In exemplul de mai sus, ariabila p este de tip static. In continuare om modifica acest program pentru a folosi o ariabila dinamica &pointer). /oid main() 3 Point 6p0 p . ne' Point0 p$;- . <0 p$;5 . =>0 print,(?#ria . @dAn?4 p$;#ria())0 delete p0 7 "ti obser at utilizarea unor operatori pe care nu ii cunoasteti din limbajul !2 ne' si delete. !11 introduce o metoda noua pentru gestiunea dinamica a memoriei, similara celei utilizate in ! &malloc&) si free&)), dar superioara si special construita pentru programarea orientata pe obiecte. 7peratorul ne' este folosit pentru alocarea memoriei, iar sintaxa acestuia este2 /ariabila . new tip0 /ariabila . new tip(/aloareBinitiala)0 /ariabila . new tipCnD0 8ste usor de intuit ca prima arianta aloca spatiu pentru /ariabila dar nu o initializeaza, a doua arianta ii aloca spatiu si o initializeaza cu aloarea specificata, iar a treia aloca un tablou de dimensiune n. "cest operator furnizeaza ca rezultat un pointer continand adresa zonei de memorie alocate, in caz de succes, sau un pointer cu aloarea NU"" &practic 0) atunci cand alocarea nu a reusit. 8liminarea unei ariabile dinamice si eliberarea zonei de memorie aferente se realizeaza cu ajutorul operatorului delete. -intaxa acestuia este2 delete /ariabila0

%esi acesti doi operatori ofera metode flexibile de gestionare a obiectelor, exista situatii in care aceasta nu rezol a toate problemele &de exemplu obiectele care necesita alocarea unor ariabile dinamice in momentul crearii lor). %e aceea pentru crearea si distrugerea obiectelor in !11 se folosesc niste functii membre speciale, numite constructori si destructori. Constructorul este apelat automat la instantierea unei clase, fie ea statica sau dinamica. Destructorul este apelat automat la eliminarea unui obiect, la inc0eierea timpului de iata in cazul static, sau la apelul unui delete in cazul dinamic. %in punct de edere cronologic, constructorul este apelat dupa alocarea memoriei necesare, deci in faza finala a crearii obiectului, iar destructorul inaintea eliberarii memoriei aferente, deci in faza initiala a distrugerii sale. !onstructorii si destructorii se declara si se definesc similar cu celelalte functii membre, dar prezinta o serie de caracteristici specifice2 - numele lor coincide cu numele clasei careia ii apartin$ destructorii se disting de constructori prin faptul ca numele lor este precedat de caracterul E - nu pot returna nici un rezultat - nu se pot utiliza pointeri catre constructori sau destructori - constructorii pot a ea parametri, destructorii insa nu. 6n constructor fara parametri poarta denumirea de constructor implicit. %e remarcat este faptul ca in cazul in care o clasa nu dispune de constructori sau destructori, compilatorul de !11 genereaza automat un constructor respecti destructor implicit. -a completam in continuare clasa Point cu un constructor si un destructor2 Point::Point() FF constructor implicit 3 - . >0 5 . >0 7 Point::Point(unsigned X4 unsigned 9) 3 - . X0 5 . 90 7 Point::EPoint() 3 7 "ti remarcat cu aceasta ocazie modul de marcare a comentariilor in !112 tot ce se afla dupa caracterul FF este considerat comentariu. %e notat este faptul ca definitii de forma Point p0

sau Point 6p . ne' Point()0 duc la apelarea constructorului implicit. 7 intrebare care poate apare este moti ul pentru care am realizat functiile 8etX()4 8et9()4 etX()4 et9(), cand puteam utiliza direct ariabilele membru - si 5. %eoarece una din regulile programarii !11, adoptata in general de catre specialisti, este de a proteja ariabilele membru & eti afla in capitolul urmator cum), acestea neputand fi accesate decat prin intermediul unor functii, care au rolul de metode de prelucrare a datelor incapsulate in interiorul clasei.

.#. Conceptul de mostenire


%aca intrebam un zoolog ce este un caine, ne a raspunde ca este un reprezentant al speciei canine domesticus. 6n caine este un tip de carni or, un carni or este un tip de mamifer, si asa mai departe. Boologul imparte animalele in regn, clasa, ordin, familie, gen si specie. "ceasta ierar0ie stabileste o relatie de genul # este unFeste o#. Putem remarca acest tip de relatie oriunde in aceasta lume2 Mercedes este un tip de masina, care la randul sau este un tip de auto e0icul, si exemplele pot continua. "stfel, cand spunem ca ce a este un tip de altce a diferit, spunem ca este o specializare a acelui lucru, asa cum o masina este un tip mai special de auto e0icul. !onceptul de caine mosteneste, deci primeste in mod automat, toate caracteristicile unui mamifer. %eoarece este un mamifer, cunoastem faptul ca se misca si respira aer - toate mamiferele se misca si respira aer prin definitie. !onceptul de caine aduce in plus ideea de a latra, de a misca coada, si asa mai departe. Putem clasifica mai departe cainii in caini de paza si caine de anatoare, iar cainii de anatoare in coc4er spanioli si dobermani, etc. "sa cum am azut mai sus, conceptul de mostenire este o notiune foarte naturala si pe care o intalnim in iata de zi cu zi. In !11 intalnim notiunea de deri/are, care este in fapt o abstractizare a notiunii de mostenire. 7 clasa care adauga proprietati noi la o clasa deja existenta om spune ca este deri/ata din clasa originala. !lasa originala poarta denumirea de clasa de ba+a. !lasa deri ata mosteneste toate datele si functiile membre ale clasei de baza$ ea poate adauga noi date la cele existente si poate suprascrie sau adauga functii membre. !lasa de baza nu este afectata in nici un fel in urma acestui proces de deri are si ca urmare nu trebuie recompilata. %eclaratia si codul obiect sunt suficiente pentru crearea clasei deri ate, ceea ce permite reutilizarea si adaptarea usoara a codului deja existent, c0iar daca fisierul sursa nu este disponibil. "stfel, nu este necesar ca programatorul unei clase deri ate sa cunoasca modul de implementare a functiilor membre din componenta clasei de baza. 7 notiune noua legata de deri are este cea de supraincarcare sau suprascriere a functiilor membre. "ceasta se refera, in mod e ident, la redefinirea unor functii a clasei de baza in clasa deri ata. %e notat este faptul ca functiile originale din clasa parinte sunt

in continuare accesibile in clasa deri ata, deci caracteristicile clasei de baza nu sunt pierdute. %intr-o clasa de baza pot fi deri ate mai multe clase si fiecare clasa deri ata poate ser i mai departe ca baza pentru alte clase deri ate. -e poate astfel realiza o ierarhie de clase, care sa modeleze adec at sisteme complexe. Pornind de la clase simple si generale, fiecare ni el al ierar0iei acumuleaza caracteristicile claselor #parinte# si le adauga un anumit grad de specializare. Mai mult decat atat, in !11 este posibil ca o clasa sa mosteneasca simultan proprietatile mai multor clase, procedura numita mostenire multipla. !onstruirea ierar0iei de clase reprezinta acti itatea fundamentala de realizare a unei aplicatii orientate obiect, reprezentand in fapt faza de proiectare a respecti ului sistem. -intaxa simplificata a deri arii este2 class NumeClasaDeri/ata : NumeClasaDeBa+a In continuare om deri a din clasa Point o clasa specializata, Crap0icPoint, care a #sti# sa deseneze efecti punctul pe ecran2 class 8raphicPoint : Point 3 unsigned color0 8raphicPoint(unsigned X4 unsigned 94 unsigned Color)0 E8raphicPoint()0 /oid Dra'()0 /oid etX(unsigned X)0 /oid et9(unsigned 9)0 70 8raphicPoint::8raphicPoint(unsigned X4 unsigned 94 unsigned Color) : Point(X4 9) 3 color . Color0 7 8raphicPoint::E8raphicPoint() 3 7 8raphicPoint::Dra'() 3 FF 111 FF apelare primiti/e 7

gra,ice

pentru

desenarea

e,ecti/a

punctului

8raphicPoint:: etX(unsigned X 3 Point:: etX()0 FF apelul ,unctiei etX() apartinand clasei de ba+a Dra'()0 7 8raphicPoint:: et9(unsigned 9) 3 Point:: et9()0 Dra'()0 7 -e obser a din exemplul de mai sus ca am adaugat o ariabila noua fata de clasa Point, color, pentru a putea memora culoarea cu care se face desenarea punctului. %e asemenea, am suprascris constructorul si destructorul clasei parinte. In constructorul deri at, am apelat constructorul original folosind constructia2 ClasaDeri/ata::ClasaDeri/ata() : ClasaDeBa+a() In clasa 8raphicPoint am adaugat o functie membra noua, Dra'(), care deseneaza efecti punctul pe ecran. "m suprascris functiile -etD&) si -etE&), apeland in ambele functiile originale, utilizand sintaxa2 ClasaDeBa+a::2unctie!embra() apeland apoi functia de desenare, Dra'(). Fegulile de functionare ale constructorilor si destructorilor, descrise in paragraful precedent, raman alabile si in cazul claselor deri ate, cu doua obser atii pri ind ordinea de apelare a acestora2 - la instantierea clasei deri ate, se apeleaza mai intai constructorul clasei de baza, apoi se apeleaza propriul constructor. - la distrugerea unui obiect al unei clase deri ate, este apelat mai intai propriul constructor, si apoi destructorul clasei de baza &deci in ordine in ersa crearii obiectului).

#. Programare a$ansata utilizand clase #.1. Controlul accesului la clase


-pre deosebire de limbajele orientate obiect pure, !11 permite controlul accesului la membrii claselor. In acest scop, s-au creat trei specificatori de cotrol al accesului2 - public, membrul poate fi accesat de orice functie din domeniul declaratiei clasei$ - pri/ate, membrul este accesibil numai functiilor membre si prietene ale clasei$ - protected, similar cu pri/ate, insa accesul se extinde si la functiile membre si prietene ale claselor deri ate. %e remarcat este faptul ca o functie membra a unei clase are acces la toti membrii clasei, indiferent de specificatorul de acces.

"sadar, sintaxa declaratiei unei clase deri ate incluzand controlul accesului este2 class NumeClasaDeri/ata : peci,icator#cces NumeClasaDeBa+a unde -pecificator"cces poate fi public sau pri/ate. -e obser a ca pentru a oferi clasei deri ate acces la un membru al clasei de baza, acesta trebuie declarat protected sau public. Pentru respectarea principiului incapsularii datelor, datele membre pentru care se ofera acces claselor deri ate se declara in clasa de baza cu atributul protected. %e asemenea, pentru a conser a dreptul de acces in urma deri arii, se utilizeaza deri area public. "ccesul poate fi stopat pe orice ni el ar ierar0iei de clase printr-o deri are pri ate. -tabilirea atributelor de acces ale membrilor unei clase, precum si ale deri arilor, trebuie sa se faca astfel incat dez oltarea ierar0iei de clase fara a afecta incapsularea datelor. -a reluam in continuare exemplul din capitolul precedent, completat cu specificatori de acces2 class Point 3 protected: unsigned -4 50 public: Point()0 Point(unsigned X4 unsigned 9)0 EPoint()0 unsigned long #rie()0 unsigned 8etX()0 unsigned 8et9()0 /oid etX(unsigned X)0 /oid et9(unsigned 9)0 70 class 8raphicPoint : public Point 3 unsigned color0 public: 8raphicPoint(unsigned X4 unsigned 94 unsigned Color)0 E8raphicPoint()0 /oid Dra'()0 /oid etX(unsigned X)0 /oid et9(unsigned 9)0 70 -e obser a ca ariabilele membru x si < sunt declarate protected, asa incat or fi izibile si or a ea acelasi atribut in clasa Crap0icPoint &desi nu sunt utilizate). In mod

normal, x si < ar trebui sa fie declarati pri ate, intrucat nu sunt utilizati decat in interiorul clasei Point. Gunctiile din Crap0icPoint nu acceseaza acesti doi membri direct, ci prin intermediul metodelor publice de accesare a lor oferite de clasa Point. %e notat este faptul ca implicit, daca nu este utilizat nici un specificator de acces, membrii sunt considerati pri ate. /oid main() 3 Point 6p0 p . ne' Point0 p$;- . <0 FF operatie imposibila: - este membru pri/at p$;5 . G0 FF operatie imposibila: 5 este membru pri/at p$; etX(<)0 FF corect: acces la /ariabila - prin intermediul ,unctiei etX() p$; et9(G)0 print,(?#ria . @dAn?4 p$;#ria())0 delete p0 7 "m demonstrat prin acest exemplu de program ca din exteriorul unei clase nu pot fi accesate datele membre pri ate sau protected.

#.2. %unctii si clase prietene


In paragraful precedent, am afirmat ca principiul incapsularii datelor este bine sa fie respectat in cadrul elaborarii ierar0iei de clase. !u toate acestea, exista situatii in care este greu sa se respecte acest principiu. %e aceea, ,jarne -troustrup a introdus un concept menit sa rezol e si aceste situatii particulare, pentru a oferi solutii elegante in ederea rezol arii tuturor situatiilor posibile. "cest concept este cel de ,riend, care permite practic abateri controlate de la ideea protectiei datelor prin incapsulare. Mecanismul de ,riend este bine sa fie folosit numai in cazul in care nu exista alta solutieH Mecanismul de ,riend &sau prietenie) a aparut datorita imposibilitatii ca o metoda sa fie membru a mai multor clase. Functiile prietene sunt functii care nu sunt metode ale unei clase, dar care au totusi acces la membrii pri ati ai acesteia. 7rice functie poate fi prietena a unei clase, indiferent de natura acesteia. -intaxa declararii unei functii prietene in cadrul declaratiei unei clase este urmatoarea2 ,riend Nume2unctie

Iata si un exemplu2

class Point 3 ,riend unsigned long Calcul(unsigned X4 unsigned 9)0 public: ,riend unsigned long #ltaClasa::Calcul(unsigned X4 unsigned 9)0 111 70 unsigned long Calcul(unsigned X4 unsigned 9) 3 return X 6 9 F %0 7 unsigned long #ltaClasa::Calcul(unsigned X4 unsigned 9) 3 111 7 %upa cum se ede din exemplul de mai sus, nu are nici o importanta in cadrul carei sectiuni este declarata functia prietena. Clasele prietene sunt clase care au acces la membrii pri ati ai unei clase. -intaxa declararii unei clase prietene este2 ,riend class NumeClasaPrietena Iata si un exemplu2 class PrimaClasa 3 111 70 class #DouaClasa 3 111 ,riend class PrimaClasa0 70 In exemplul de mai sus, clasa Prima!lasa are acces la membrii pri ati ai clasei "%oua!lasa. Important este sa remarcam ca relatia de prietenie nu este tran+iti/a. %aca o clasa " este prietena a clasei ,, si clasa , este prietena a unei clase !, aceasta nu inseamna ca

" este prietena a clasei !. %e asemenea, proprietatea de prietenie nu se mosteneste in clasele deri/ate.

#. . Cu$antul c&eie this


Ioate functiile membre ale unei clase primesc un parametru ascuns, pointer-ul this, care reprezinta adresa obiectului in cauza. "cesta poate fi utilizat in cadrul functiilor membre. Iata si un exemplu2 unsigned long Point::#rie() 3 return this$;- 6 this$;50 7

#.#. 'edefinirea operatorilor


%upa cum stiti, !A!11 are definite mai multe tipuri de date2 int, char, etc. Pentru utilizarea acestor tipuri de date exista definiti mai multi operatori2 adunare&(), inmultire &6), etc. !11 permite programatorilor sa isi defineasca acesti operatori pentru a lucru cu propriile clase. -intaxa supraincarcarii unui operator este2 operator imbol unde imbol este simbolul oricarui operator !11, exceptand2 1, 16, ::, H:. "ceasta definire se face in cadrul clasei, intocmai ca o functie membra. Iipul operatorului
,inar 6nar 6nar 6nar ,inar ,inar ,inar ,inar

-imbolul operatorului
&) JK -L 1 - M = N &tip) 11 -ne/ delete -L = A ? 1 - N P NN PP OO LL O O> L L> >> H> > 1> -> => A> ?> N> Q> P> OO> LL> ,

"sociati itate 7bser atii


-L OOO-L -L O-L -e definesc ca functii membre -e definesc ca functii membre 3u se poate distinge intre pre si post Poate fi supradefinit si pentru o clasa

%upa cum om edea in continuare, exista doua ariante de definire a operatorilor2 R ca functie membra a clasei$ R ca functie prietena a clasei. Pentru exemplificare, ne propunem sa extindem clasa Point cu utilizarea unor operatori. class Point 3 FF 111 PointI operator (. (Point BBp)0 PointI operator $. (Point BBp)0 Point operator ( (Point BBp)0 Point operator $ (Point BBp)0 PointI operator . (Point BBp)0 int operator .. (Point BBp)0 int operator J. (Point BBp)0 int operator K (Point BBp)0 int operator ; (Point BBp)0 int operator K. (Point BBp)0 int operator ;. (Point BBp)0 70 PointI Point::operator (. (Point BBp) 3 - (. BBp1-0 5 (. BBp150 return 6this0 7 PointI Point::operator $. (Point BBp) 3 - $. BBp1-0 5 $. BBp150 return 6this0 7 Point Point::operator ( (Point BBp) 3 return Point(- ( BBp1-4 5 ( BBp15)0 7 Point Point::operator $ (Point BBp) 3 return Point(- $ BBp1-4 5 $ BBp15)0 7

int Point::operator .. (Point BBp) 3 return - .. BBp1- II 5 .. BBp150 7 int Point::operator J. (Point BBp) 3 return J(6this .. BBp)0 7 int Point::operator K (Point BBp) 3 return - K BBp1- II 5 K BBp150 7 int Point::operator ; (Point BBp) 3 return - ; BBp1- II 5 ; BBp150 7 int Point::operator K. (Point BBp) 3 return - K. BBp1- II 5 K. BBp150 7 int Point::operator ;. (Point BBp) 3 return - ;. BBp1- II 5 ;. BBp150 7 "m utilizat mai sus arianta cu functii membre. In continuare implementarea operatorului ( folosind cea de-a doua arianta. class Point 3 FF 111 ,riend Point operator ( (Point BBp=4 Point BBp%)0 7 Point operator ( (Point BBp=4 Point BBp%) 3 return Point(BBp=1- ( BBp%1-4 BBp=15 ( BBp%15)0 7 om descrie

%efinirea operatorilor ca functii membre a unei clase prezinta o restrictie majora2 primul operand este obligatoriu de tipul clasa respecti . -upradefinirea operatorilor este supusa in !11 unui set de restrictii2 - nu este permisa introducerea de noi simboluri de operatori$ - patru operatori nu pot fi redefiniti & ezi mai sus)$ - caracteristicile operatorilor nu pot fi sc0imbate2 pluralitatea &nu se poate supradefini un operator unar ca operator binar sau in ers), precedenta si asociati itatea$ - functia operator trebuie sa aiba cel putin un parametru de tipul clasa caruia ii este asociat operatorul supradefinit. Programatorul are libertatea de a alege natura operatiei realizate de un operator, insa este recomandat ca noua operatie sa fie apropiata de semnificatia initiala.

#.#.1. 'edefinirea operatorului =


7peratorul . este deja predefinit in !11, pentru operanzi de tip clasa. %aca nu este supradefinit, atribuirea se face membru cu membru, in mod similar cu initializarea obiectului efectuata de catre compilator. Pot exista situatii in care se doreste o atribuire specifica clasei, ca atare poate fi supradefinit. PointI Point::operator . (Point BBp) 3 - . BBp1-0 5 . BBp150 return 6this0 7

#.#.2. 'edefinirea operatorului []


7peratorul de indexare CD se defineste astfel2 int IoperatorCD(int)

#.#. . 'edefinirea operatorilor new si delete


"cesti doi operatori pot fi supradefiniti pentru a realiza operatii specializate de alocareAeliberare dinamica a memoriei. Gunctia operator ne' trebuie sa primeasca un argument de tipul si+eBt care sa precizeze dimensiunea in octeti a obiectului alocat si sa returneze un pointer de tip /oid continand adresa zonei alocate2

/oid 6operator ne'(si+eBt) cu mentiunea ca si+eBt este definit in stdlib1h. !0iar daca parametrul de tip si+eBt este obligatoriu, calculul dimensiunii obiectului in cauza si generarea sa se face de catre compilator. Gunctia operator delete trebuie sa primeasca ca prim parametru un pointer de tipul clasei in cauza sau /oid, continand adresa obiectului de distrus, si un al doilea parametru, optional, de tip si+eBt. Gunctia nu intoarce nici un rezultat. /oid operator delete(/oid 64 si+eBt) Irebuie sa mentionam aici ca operatorii ne' si delete supradefiniti pastreaza toate proprietatile operatorilor ne' si delete standard.

#.#.#. 'edefinirea operatorilor unari


7peratorii unari pot fi supradefiniti utilizand o functie membra fara parametri sau o functie prietena cu un parametru de tipul clasa respecti . Irebuie subliniat ca pentru operatorii (( si $$ dispare distinctia intre utilizarea ca prefix si cea ca postfix, de exemplu intre -(( si ((-, respecti -$$ si $$-, dupa cum mentionam si in tabela cu operatori de mai sus.

#.(. "ostenirea multipla


Simbajul !11 permite crearea de clase care mostenesc proprietatile mai multor clase de baza. Mostenirea multipla creste astfel flexibilitatea dez oltarii ierar0iei de clase. %aca deri area normala duce la construirea unei ierar0ii de tip arbore, deri area multipla a genera ierar0ii de tip graf. -intaxa completa pentru operatia de deri are este urmatoarea2 class NumeClasaDeri/ata : "istaClaseDeBa+a unde "istaClaseDeBa+a este2 peci,icator#cces NumeClasaDeBa+a4 111

#.(.1. Clase $irtuale


6tilizarea mostenirii multiple se poate complica odata cu cresterea dimensiunii ierar0iei de clase. 7 situatie care poate apare este deri area din doua clase de baza, Clasa= si Clasa%, care la randul lor sunt deri ate dintr-o clasa comuna, ClasaDeBa+a. In acest caz, noua clasa, ClasaNoua, a contine datele membre ale clasei ClasaDeBa+a duplicate. %aca prezenta acestor date duplicate este utila, ele pot fi distinse e ident cu ajutorul operatorului de rezolutie, ::. Iotusi, in cele mai multe cazuri, aceasta duplicare nu este necesara si duce la consum inutil de memorie. %e aceea, in !11 a fost creat un mecanism care sa e ite aceasta situatie, prin intermediul conceptului de clasa /irtuala. -intaxa este2

class NumeClasaDeri/ata : peci,icator#cces /irtual NumeClasaDeBa+a "ceasta declaratie nu afecteaza clasa in cauza, ci numai clasele deri ate din aceasta. "stfel, clasele Clasa= si Clasa% considerate or fi declarate irtuale. Irebuie mentionat faptul ca declararea /irtual a acestor clase a afecta definirea constructorului clasei ClasaNoua, deoarece compilatorul nu poate 0otari care date or fi transferate catre constructorul ClasaDeBa+a, specificate de constructorii Clasa= si Clasa%. !onstructorul ClasaNoua a trebui modificat astfel incat sa trimita datele pentru constructorul ClasaDeBa+a. %e asemenea, trebuie precizat ca intr-o ierar0ie de clase deri ate, constructorul clasei irtuale este intotdeauna apelat primul.

#.). Con$ersii de tip definite de programator


%upa cum stiti, in !A!11 exista definit un set de reguli de con ersie pentru tipurile fundamentale de date. !11 permite definirea de reguli de con ersie pentru clasele create de programator. Fegulile astfel definite sunt supuse unor restrictii2 - intr-un sir de con ersii nu este admisa decat o singura con ersie definita de programator$ - se recurge la aceste con ersii numai dupa ce se erifica existenta altor solutii &de exemplu, pentru o atribuire, se erifica mai intai supraincarcarea operatorului de atribuire si in lipsa acestuia se face con ersia). 8xista doua metode de a realiza con ersii de tip, prezentate mai jos.

#.).1. Supraincarcarea operatorului unar *cast*


-intaxa este2 operator &ipData() respecti 2 operator (&ipData) 7peratorul #cast# este unar, asadar are un singur parametru, adresa obiectului in cauza, si intoarce un rezultat de tipul operatorului. !a urmare, prin aceasta metoda se pot defini numai con ersii dintr-un tip clasa intr-un tip de baza sau un alt tip clasa. %e remarcat este faptul ca, in cazul con ersiei dintr-un tip clasa intr-un alt tip clasa, functia operator trebuie sa aiba acces la datele membre ale clasei de la care se face con ersia, deci trebuie declarata prietena a clasei respecti e.

#.).2. Con$ersii de tip folosind constructori


"ceasta metoda consta in definirea unui constructor ce primeste ca parametru tipul de la care se face con ersia. !onstructorul intoarce intotdeauna ca rezultat un obiect de tipul clasei de care apartine, ca urmare folosind aceasta metoda se pot realiza numai con ersii dintr-un tip de baza sau un tip clasa intr-un tip clasa.

Irebuie mentionat faptul ca, in cazul con ersiei dintr-un tip clasa intr-un alt tip clasa, constructorul trebuie sa aiba acces la datele membre ale clasei de la care se face con ersia, deci trebuie declarata prietena a clasei respecti e.

#.+. Constructorul de copiere


7 situatie care poate aparea deseori este initializarea unui obiect cu datele membre ale unui obiect de acelasi tip. In L1L1= am descris supraincarcarea oparatorului de atribuire. 8xista totusi situatii in care acest operator nu poate fi utilizat, cum ar fi la transferul unui obiect ca parametru sau la crearea unui instante temporare a unei clase, atunci cand copierea membru cu membru nu este adec ata. Pentru a rezol a aceste situatii, !11 a introdus un constructor special, numit constructorul de copiere. -intaxa este2 NumeClasa::NumeClasa (NumeClasa INumeObiect ursa) In continuare Point::Point(Point Ip) 3 p1- . -0 p15 . 50 7 In cazul in care clasa nu dispune de constructor de copiere, compilatorul genereaza automat un constructor de copiere care realizeaza copierea membru cu membru. om completa clasa Point cu un constructor de copiere2

#.,. Clase abstracte


In !11 exista posibilitatea de a defini clase generale, care sunt destinate crearii de noi clase prin deri are, ele neputand fi instantiate si utilizate ca atare. "cest gen de clase se numesc clase abstracte. 8le se constituie ca baza in cadrul elaborarii de ierar0ii de clase, putand fi folosite, spre exemplu, pentru a impune anumite restrictii in realizarea claselor deri ate. In ederea construirii unor astfel de clase, s-a introdus conceptul de ,unctie /irtuala pura. 7 astfel de functie este declarata in cadrul clasei, dar nu este definita. 7 clasa care contine o functie irtuala pura este considerata abstracta. -intaxa definirii acestor functii este2 /irtual &ipData Nume2unctie!embra() . > -e impune aici obser atia ca functiile irtuale pure trebuie definite in clasele deri ate, altfel si acestea or fi considerate abstracte.

#.-. "embri statici ai unei clase


In mod normal, datele membre ale unei clase sunt alocate in cadrul fiecarui obiect. In !11, se pot defini date membre cu o comportare speciala, numite date statice. "cestea sunt alocate o singura data, existand sub forma unei singuri copii, comuna tuturor obiectelor de tipul clasa respecti , iar crearea, initializarea si accesul la aceste date sunt independente de obiectele clasei. -intaxa este2 static Declarare!embru Gunctiile membre statice efectueaza de asemenea operatii care nu sunt asociate obiectelor indi iduale, ci intregii clase. Gunctiile exterioare clasei pot accesa membrii statici ale acesteia astfel2 NumeClasa::Nume!embru Obiect::Nume!embru Gunctiile membre statice nu primesc ca parametru implicit adresa unui obiect, asadar in cadrul lor cu antul c0eie this nu poate fi utilizat. %e asemenea, membrii normali ai clasei nu pot fi referiti decat specificand numele unui obiect.

(. Proiectarea si dez$oltarea de aplicatii orientate obiect


%ez oltarea de sisteme orientate obiect pare a fi, la prima edere, mai complicata si de durata mai mare decat dez oltarea aplicatiilor traditionale. In realitate, durata si costurile dez oltarii de aplicatii orientate obiect sunt mult mai mici. 8tapa fundamentala in cadrul acestui proces o constituie cea de proiectare a sistemului, c0iar daca este e ident ca structura interna a acestuia este irele anta pentru utilizatori. --a constatat de asemenea ca succesul aplicatiilor orientate obiect depinde in principal de doi factori2 (.1. ./istenta unei $iziuni ar&itecturale coerente si bine definite "r0itectura unui sistem orientat pe obiecte cuprinde atat structura claselor si interactiunea dintre obiecte, cat si impartirea aplicatiei in module si ni ele de abstractizare. !ate a conditii in ederea realizarii unei ar0itecturi corecte2 - ni ele de abstractizare bine definite - clase a and interfete bine definite, a caror modificare pro oaca sc0imbari minime asupra celorlalte clase - modificarea modului de implementare a unei clase nu are repercursiuni asupra interfetei sau implementarii celorlalte clase - ar0itectura sistemului este simpla, realizata prin abstractii si mecanisme obisnuite

(.2. 0rmarea unui ciclu de dez$oltare atat iterati$ cat si incremental bine administrat 8xista in principal doua tipuri de cicluri de dez oltare2 - ciclu de dez oltare nedefinit. In acest caz, este imposibil de stiut iteza dez oltarii sistemului, momentul la care a fi finalizat, calitatea sistemului ramanand permanent sub semnul intrebarii. 8ste posibila ca o parte din eforturile depuse sa fie ineficiente, asadar costurile dez oltarii sa fie foarte mari. - reguli clare care stabilesc fiecare aspect al ciclului. In acest de-al doilea caz, este impiedicata creati itatea si experimentul, care ar putea produce o aplicatie a and calitate sporita. !erintele utilizatorilor ajung cu dificultate la ni elul programatorilor ce realizeaza aplicatia, ingreunand procesul de dez oltare si marindu-i costurile. In realitate, nu om intalni nicaieri reunul dintre aceste cazuri distinct. In cadrul dez oltarii de sisteme soft/are, aceste doua tipuri de cicluri de dez oltare se intrepatrund, inclinand mai mult sau mai putin spre una dintre extreme, functie de deciziile luate de conducatorii acestor proiecte. --a tras in multe locuri concluzia ca un ciclu de dez oltare ideal este atat de tip iterati cat si de tip incremental. !e inseamna ca un ciclu este iterati T 6n proces iterati presupune inbunatatirea succesi a a ar0itecturii orientata pe obiecte, utilizand experienta si rezultatele obtinute in fiecare etapa sau ersiune in etapa urmatoare de analiza si dez oltare. !e reprezinta un ciclu incrementalT In cadrul unui proces incremental, fiecare trecere printr-un astfel de ciclu de analizaAdez oltare conduce la inbunatatirea deciziilor, rezultand astfel in final o solutie care intruneste ade aratele cerinte ale utilizatorilor, si are o ar0itectura clara, este eficienta si usor de intretinut. %e obicei, sistemele comerciale sunt realizate urmand un ciclu mai clar definit, deoarece sunt realizate in cadrul unor companii cu numar mare de programatori si trebuie executate intr-un inter al predefinit de timp. -pre deosebire de acestea, sistemele open source &realizate in lumea free soft/are) sunt construite dupa un ciclu mai ag definit, dar care de cele mai multe ori conduce la sisteme mai extensibile, mai flexibile, si de calitate superioara celor comerciale. -intetizat, etapele dez oltarii unui sistem orientat pe obiecte sunt2 1. 2naliza 1. Identificarea obiectelor din cadrul sistemului$ 2. Identificarea actiunilor efectuate de fiecare obiect$ . Identificare interactiunilor dintre aceste obiecte &mesajele prin care comunica obiectele). 11. 2bstractizarea 1. -tabilirea claselor ale caror instantiere sunt aceste obiecte$ 2. 8laborarea ierar0iei de clase. 111. 1mplementarea 1. Impartirea pe module &clase) a ierar0iei de clase$ 2. 8laborarea claselor de baza &fundamentale)$

. 8laborarea celorlalte clase din ierar0ie &in aceasta etapa se determina si disfunctiile in proiectareAimplementare a claselor de baza si este posibila re enirea la pct. U). #. "samblarea intr-un tot unitar a modulelor &claselor) 13. 4estarea &se realizeaza si pe parcursul etapelor III2 U-V) 3. Scrierea de documentatie &e entual in timpul etapelor III si e entual I;). Perioada de iata a unui sistem nu se rezuma insa la proiectarea si dez oltarea sa$ ea continua cu lansarea de noi ersiuni, corectarea erorilor ce nu au fost detectate in cadrul etapei de testare, adaptarea sa functie de cerintele utilizatorilor, etc. In cadrul etapei de proiectare a sistemului orientat pe obiecte, nu trebuie sa uitam ca un sistem complex bine construit este alcatuit din mai multe componente simple &atomice) care interactioneaza intre ele. -istemele monolitice au costurile de proiectare, implementare si mai ales de intretinere mult mai mari decat sistemele modulare. Programarea orientata pe obiecte ofera toate a antajele in ederea crearii de sisteme modulare. In ceea ce pri este ierar0iile de clase, exista doua categorii2 in prima, toate sau aproape toate clasele sunt deri ate dintr-o clasa de baza, radacina$ intr-a doua, pot exista mai multe ierar0ii de clase distincte. " antajul de a a ea o singura clasa de baza este acela ca se poate e ita cu usurinta mostenirea multipla$ deza antajul este ca de multe ori in cadrul procesului de implementare a claselor deri ate poate aparea necesitatea modificarii clasei de baza. In cadrul etapei de implementare a aplicatiei, este important sa se stabileasca o con entie unitara pri ind stilul de programare utilizat. %e cele mai multe ori nu are importanta stilul adoptat, insa un stil unitar poate usura foarte mult interconectarea dintre modulele componente si micsora costurile de intretinere a sistemului. In continuare oi face cate a sugestii2 R 1ndentarea - dimensiunea tabularii sa fie de U-V caractere R 2coladele -acoladele corespunzatoare sa fie aliniate ertical -pe liniile continand o acolada sa nu apara si cod R 5iniile lungi -dimensiunea unei linii de cod sa fie mai mica decat latimea ecranului -daca o linie este impartita pe mai multe randuri, cel de-al doilea rand cat si urmatoarele sa fie indentate R Codul sursa -sa nu existe spatii inainte si dupa operatorii unari -sa existe spatiu inainte si dupa operatorii binari -sa existe un spatiu dupa irgule si punct si irgula, dar nu intainte -sa nu existe spatii inainte si dupa paranteze

-sa existe spatiu inainte si dupa cu intele c0eie -sa fie utilizate linii libere pentru a separa di erse module de cod sursa si a mari lizibilitatea programului R Comentariile -textul unui comentariu sa fie separat de #AA# cu un spatiu -pe cat posibil, sa fie utilizate comentariile stil !11, #AA#, in loc de cele in stil !, #A= =A# -sa fie la obiect si de ni el cat mai inalt -sa indice operatia realizata de catre functie, efectele secundare, tipul parametrilor, alorile pe care le poate returna R !enumirile identificatorilor -denumirile sa fie cat mai descripti e posibil -sa fie e itate abre ierile criptice -sa nu fie utilizata notatia #ungureasca# &care pre ede includerea tipului unei ariabile in denumirea sa) R !repturile de acces la membri -sa se declare mai intai membrii public, apoi cei protected, iar apoi cei pri/ate -datele membre sa apara dupa declararea metodelor -prima metoda declarata sa fie constructorul, apoi destructorul R !efinirea claselor -ordinea definirii metodelor sa fie aceeasi cu a declararii acestora

,I,SI7CF"GI8 0ttp2AA///.arbornet.orgAMdragos

You might also like