0% au considerat acest document util (0 voturi)
99 vizualizări

Programarea Avansata

Documentul prezintă concepte de programare orientată pe obiecte în C++, inclusiv clase, obiecte, moștenire, polimorfism, encapsulare și alte concepte POO. De asemenea, prezintă diferențele dintre C și C++ și diferențele dintre programarea procedurală și cea orientată pe obiecte.

Încărcat de

ciresv
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
99 vizualizări

Programarea Avansata

Documentul prezintă concepte de programare orientată pe obiecte în C++, inclusiv clase, obiecte, moștenire, polimorfism, encapsulare și alte concepte POO. De asemenea, prezintă diferențele dintre C și C++ și diferențele dintre programarea procedurală și cea orientată pe obiecte.

Încărcat de

ciresv
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 11

ExamenProgramareaavansata(C++) 1. Programareaorientatpeobiecte(POO)concepiiprincipale 2. DiferenedintrelimbajeledeprogramareCiC++carenusereferdirectlaPOO 3. Programareaorientatpeobiecteiprogramareaprocedural 4. Suprancrcareafunciilorifunciicuparametriimplicii 5. Claseiobiecte.Variabilemembrisifunciimembri.Specificatorideacces 6. Constructoriidestructor.Constructorimpliciticonstructorcuparametri 7. Funciiiclasefriend(prietene).Diferenedintrefunciiprieteneifunciimembri 8. Formageneralpentrudefinireauneifunciimembruaclasei.Funciiinline 9. Motenire.Clasadebaziclasaderivat.Specificatoridemotenire 10. Motenireasimplimotenireamultipl.Clasadebazvirtual 11. Obiectecaparametriivalorireturnabilealefunctiei.Iniializareaobiectuluicuunaltobiect 12.

Atribuireaobiectelor.Suprancrcareaoperatoruluideatribuire 13. ReferinenlimbajuldeprogramareC++.Referinecavalorireturnabileafunciei 14. Suprascrierea(redefenirea)funciilorinclasederivate.Polimorfizmuldetipstatic 15. Pointericlaseiderivateidebaz.Funciivirtuale.Polimorfizmuldetipdinamic 16. Funciivirtualepureiclaseabstracte 17. Suprancrcareaoperatorilor.Funciioperatorimembruaclaseipentruoperatoribinari 18. Suprancrcareaoperatorilor.Funciioperatorimembruaclaseipentruoperatoriunari 19. Suprancrcareaoperatorilor.Funciioperatoriprieteneaclaseipentruoperatoribinari 20. Suprancrcareaoperatorilor.Funciioperatoriprieteneaclaseipentruoperatoriunari 21. Fluxurile(clasestream)pentruoperaiunicitirescrierestandardsicufiiere. 22. Funciiiclasegenerice(template).Formegeneralepentrudefinireauneifunciiiclase 23. Tratareaexceptiilor 1. Programareaorientatpeobiecte(POO)concepiiprincipale Programarea Orientat Obiect (POO) este o metod de proiectareiimplementarencareprogramele sunt reprezentate sub forma unor colecii de obiecte care interacioneaz ntre ele prin intermediul mesajelor. Ea a aprut din necesitatea exprimriiproblemeintrunmodmainaturalfiineiumane.Astfel unitaile care alctuiesc un program se apropie mai mult de modul nostru de a gndi dect modul de lucru al calculatorului. Pn la apariia programrii orientate pe obiect programele erauimplementaten limbaje de programare procedurale (C, Pascal) sau n limbaje care nici mcar nu ofereau o modalitate de grupare a instruciunilor n uniti logice (funcii, proceduri) cum este cazul limbajului de asamblare (assembler). Programareaorientatpeobiect(OOP)reflectatprin: grupareadedateioperaiintrunacelaitipdedatenumitclas unaccesselectivlaelementeleinternealeuneiclase reutilizareasaumotenireaunor claseprinclasederivate utilizarea funciilor virtuale, care dau un mijloc mai puternic de apelare al funciilor, n timpul execuiei programuluiinuntimpulcompilriilui utilizarea funciilor friend, care permit accesul din exteriorul unei clase, la elemente protejatedinaceaclas utilizareaunorfunciispecialentroclasnumiteconstructorirespectivdestructori, necesarepentruainiializa,respectivadistruge,obiectealeaceleiclase.

Incapsularea este un mecanism care combina codul si datele pe care le manipuleaza, mentinand integritateaacestorafatadeinterferentaculumeaexterioara. Polimorfismulestecalitateacarepermiteuneiinterfetesaaibaacceslaungrup genericdeactiuni.Termenulestederivatdintruncuvantgrecescavandsemnificatiacu maimulteforme. Mostenireaesteprocesulprincareunobiectpoatedobandicaracteristicilealtui obiect. 2. DiferenedintrelimbajeledeprogramareCiC++carenusereferdirectlaPOO In C avem posibilitatea de a scri unctii si proceduri doar, pe cind in C++ putem crea clase.In C obiectele (datele) fundamentale sunt caracterele, intregii de diferite dimensiuni si numerele flotante. In plus,existaoierarhiedetipuridedatederivatecreatecupointeri,tablouri,structuri,uniunisifunctii. C++ este un limbaj de programare general, compilat. Este un limbaj multiparadigma, cu verificarea statica a tipului variabilelor ce suporta programare procedurala, abstractizare a datelor, programare orientata pe obiecte.O data cu evolutia limbajului C++, a evoluat si o biblioteca standard. Prima adaugire a fost biblioteca de intrri/iesiri (I/O stream), care oferea facilitti pentru a nlocui functiile traditionale C cum ar fi printf si scanf. Mai trziu, printre cele mai semnificative adugari la biblioteca standardafostSTL(StandardTemplateLibrary)(Bibliotecadeformatestandard). 3. Programareaorientatpeobiecteiprogramareaprocedural Programarea Orientat Obiect (POO) este o metod de proiectareiimplementarencareprogramele sunt reprezentate sub forma unor colecii de obiecte care interacioneaz ntre ele prin intermediul mesajelor. Ea a aprut din necesitatea exprimriiproblemeintrunmodmainaturalfiineiumane.Astfel unitaile care alctuiesc un program se apropie mai mult de modul nostru de a gndi dect modul de lucru al calculatorului. Pn la apariia programrii orientate pe obiect programele erauimplementaten limbaje de programare procedurale (C, Pascal) sau n limbaje care nici mcar nu ofereau o modalitate de grupare a instruciunilor n uniti logice (funcii, proceduri) cum este cazul limbajului de asamblare (assembler). Programarea procedural specific paii care trebuie urmai de program pentru a se ajunge la starea dorit, dar se poate referi ilaoparadigmdeprogramarebazatpeconceptuldeapeldeprocedur. Procedurile, numite i rutine, subrutine, metode sau funcii ce conin o serie de pai care trebuie executai. Orice procedur poate fi apelat la orice moment din execuia unui program, inclusiv dealte procedurisauchiardeeansi. 4. Suprancrcareafunciilorifunciicuparametriimplicii Supraincarcarea functiilor si a operatorilor reprezinta un mecanism esential al programarii in C++ intrucat acesta face posibil polimorfismul in timpul compilarii, conferind limbajului flexibilitate si extensibilitate.Utilizarea aceluiasi nume pentru mai multe functii, in acelasi domeniu de vizibilitate, se numeste supraincarcarea numelor de functii sau, pe scurt, supraincarcare.Compilatorul poate selecta functiaadecvataincazulunuiapel,bazandusepecomponentalistelordeparametri.Deexemplu, sepot defini2functiideridicarelaputere,unapentrunumereintregisialtapentrunumerereale. ntrofunciesepotdeclaravaloriimplicitepentruunulsaumaimuliparametri.Atuncicndesteapelat funcia, se poate omite specificarea valorii pentru acei parametri formali care au declarate valori implicite. Valorile implicite se specific osingurdatndefiniie(deobiceinprototip).Argumentelecu valoriimplicitetrebuiesfieamplasatelasfritullistei.

Exemplu: voidadunare(inta=5,doubleb=10){}... adunare()//<=>adunare(5,10) adunare(1)//<=>adunare(1,10) adunare(1,4)//<=>adunare(1,4) 5. Claseiobiecte.Variabilemembrisifunciimembri.Specificatorideacces. O clasa este un tip de data definit de utilizator. O declarare a unei clase definete un tip nou care reunete date i funcii. Acest tip nou poate fi folosit pentru a declara obiecte de acest tip. Deci, un obiectesteunexemplar(instana)auneiclase. Formageneraladedeclaraieaclasei: classnume_clasa{ dateifunciimembreprivate specificatori_de_acces dateifunciimembre specificatori_de_acces dateifunciimembre ......................... specificatori_de_acces dateifunciimembre }lista_obiecte Clasa, intrun anumit limbaj de programare, reprezinta definirea unui tip de obiecte abstracte sau concrete, adica descrierea proprietatilor, a datelor si a metodelor, a prelucrarilor, posibile asupra datelor. Clasa este, defapt,onotiuneabstracta,caredefinesteunanumit tipdeobiecte,sau,altfelspus, oclasareprezintamultimeaposibilaamaimultorobiectedeacelasitip. Obiect, reprezinta o multime de date care descrie un anumit obiect concret sau abstract, numite si proprietati, impreuna cu procedurile, functiile, de prelucrare a cestora, numite metode.Crearea unui obiect presupune specificarea clasei din care faceparte,astfelidentificanduseproprietatileobiectuluisi modulincareacesteapotfifolositesiprelucrate Functiile membru ale unei clase sunt functiile descrise sau declarate in interiorul unei clase. Deci, descrierea efectiva a functiilor membru ale unei clase se poate face, fie in interiorul clasei, fie in afara clasei, daca in interiorul clasei sau declarat ca prototipuri. Ele pot fi accesatedininteriorulclaseisidin afara clasei, prin intermediul obiectelor declarate, daca au fost declarate publice, sau numai direct din interiorulclaseidecatrealtefunctiimembrualeaceleiasiclase,dacaaufostdeclarateprivate. Pentru a implementamecanismuldeascundereainformatiei(incapsulareadatelor)aufostintrodusiin limbajul C++ un numar de specificatori de acces prin care se stabilesc in mod diferentiat drepturile de acces asupra membrilor unei clase. Acesti specificatori de accessuntinnumardetreisianume:private, public si protected. Aparitia unuia dintre aceste cuvintecheie urmat de simbolul douapuncte (":") determina graduldeprotectiepentrutotimembriicaresuntdeclaratiincontinuare,panalasfarsitulclasei sau pana la intalnirea urmatorului specificator de acces. Aceste atribute de protectie au urmatoarea semantica: Membrii public ai unui obiect sunt accesibili oricarei functii care are acces la declaratia clasei acelui obiect,sicareseaflaintrundomeniudincareareacceslaobiectulinsusi. Membrii private ai unui obiect sunt accesibili doar functiilor membru (metodelor) definite in clasa

aceluiobiect. Membrii protected ai unui obiect sunt accesibili doar functiilor membru (metodelor) definite in clasa aceluiobiectsauinclaselederivatedinea. 6. Constructoriidestructor.Constructorimpliciticonstructorcuparametri Constructorul este o metod special a unei clase, care este membru al clasei respective i are acelai nume ca i clasa. Constructorii sunt apelai atunci cnd se instaniaz obiecte din clasa respectiv, ei asigurnd iniializarea corect a tuturor variabilelor membru ale unui obiect i garantnd c iniializarea unui obiect se efectueaz osingurdat. Constructoriisedeclar,definesciutilizeazca orice metod uzual,avndurmtoareleproprietidistinctive: poartnumeleclaseicreiaiaparin nu pot returna valori nici la definirea, nici la declararea lor nu poate fi specificat void ca tip returnat adresa constructorilor nu este accesibil utilizatorului expresii de genul &X :: X() nu sunt disponibile suntapelaiimplicitoridecteoriseinstaniazunobiectdinclasarespectiv ncazcoclasanuareniciunconstructordeclaratdectreprogramator,compilatorul vadeclaraimplicitunul.Acestavafipublic,frniciunparametru,ivaaveaolist viddeinstruciuni ncadrulconstructorilorsepotutilizaoperatorii"new"si"delete", constructoriipotaveaparametrii. Oclaspoateaveaoriciconstructori,eidifereniindusedoarprintipulinumrul parametrilor.Compilatorulapeleazconstructorulpotrivitnfunciedenumrulitipul parametrilorpecareiconineinstaniereaobiectului. Tipurideconstructori: constructorimplicit(defaultconstructor) constructordecopiere(copyconstructor) Constructoriiimpliciisepoatedefinindoumoduri: definindunconstructorfrniciunparametru pringenerareasaimplicitdectrecompilator. Constructorul decopieregeneratimplicit copiazmembrucumembrutoatevariabileleargumentuluin cele ale obiectului care apelaz metoda. Compilatorul genereaz implicit un constructor de copiere n fiecareclasncareprogramatorulnuadeclaratunulnmodexplicit. Exemplu: classX{ X(X&)//constructordecopiere X(void)//constructorimplicit} Apelareaconstructoruluisecopieresepoatefacenurmtoarelemoduri: Xobiect2=obiect1 Destructorul complementar constructorului. Este o metodcareareacelainumecaiclasacreiai aparine, dar este precedat de ~. Dac constructorii sunt folosii n special pentru aalocamemoriei pentru a efectua anumite operaii (de exemplu: incrementarea unui contor al numrului de obiecte), destructorii se utilizeaz pentru eliberarea memoriei alocate de constructori i pentru efectuarea unor operaiiinverse(deexemplu:decrementareacontorului). Exemplu:

classexemplu{public:exemplu()//constructor~exemplu()//destructor} 7. Funciiiclasefriend(prietene).Diferenedintrefunciiprieteneifunciimembri O funcie friend este o funcie care nuemembruauneiclase,darareacceslamembriidetipprivate i protected ai clasei respective. Orice funcie poate fi friend unei clase, indiferent dac este o funcie obinuitsauestemembrualuneialteclase. Exemplu: classexemplu{ inta intf(void) friendintf1(exemplu&) public: friendintM::f2(exemplu&,int)} intf1(exemplu&ex){ returnex.f()} intM::f2(exemplu&ex,intj=0){ if(ex.a>7)returnj++ elsereturnj} Utilizarea funciilor friend i a claselor friend ofer programatoruluimaimultflexibilitatendezvoltarea unui program, dndui posibilitatea s acceseze variabilele membru ale unei clase. Astfel, dac ntrun program este necesar accesarea variabilelor membru ale unei clase se poate utiliza o funcie friend n loculuneifunciimembre. Functiile membru ale unei clase sunt functiile descrise sau declarate in interiorul unei clase. Iar functiile friendsuntfunctiiledescrisesaudeclarateinafaraclaseidarcareauaccesladateleacesteiclase. 8. Formageneralpentrudefinireauneifunciimembruaclasei.Funciiinline Variabileledeclaratencadruluneiclasesenumescvariabilemembru,iarfunciiledeclarate n cadrul unei clase s e numesc metode sau functii membru. Metodele pot accesa toate variabilele declaratencadrulclasei,privatesaupublice. Membriiuneiclasereprezinttotalitateametodeloriavariabilelormembrealeclasei. Sintaxadeclarriiuneiclaseesteurmtoarea: specificator_clasaNume_clasa{ [[private:]lista_membri_1] [[public:]lista_membri_2]} Funciileinlinesunteficientencazurilencaretransmitereaparametrilorprinstiv (operaielent)estemaicostisitoare(caitimpdeexecuie)dectefectuareaoperaiilordin corpulfunciei. Exemplu: classcoordonate_3D{intX,Y,Z //ATENTIE: //prindefinireametodeiininterioruldeclarariiclasei, //functiamembrudevineimplicit"inline"!! voidtranslateaza(intTX,intTY,intTZ){X+=TXY+=TYZ+=TZ} voidtipareste(void)//declarareauneimetodecarenueste //implicitinline}

//Prefixareadefinitieimetodeicucuvintulcheie"inline"este //echivalentacudefinireafunctieimembruincadruldeclaratiei //clasei inlinevoidcoordonate_3D::tipareste(void){ cout<<"\n\tX="<<X<<"\tY="<<Y<<"\tZ="<<Z<<"\n"} Deoareceprocedura"translateaz"estedetipinline,eanuesteapelat,ciexpandat atunci cnd este apelat. Definirea unei funcii n cadrul unei clase se mai numete i declarare inline implicit. Metoda tipareste este declarat explicit, ea fiind doar declarat n cadrul clasei, iar n locul unde este definit este prefixat de cuvntul cheie inline. Metodelecarenusuntmembrualuneiclase nu pot fi declarate inline dect explicit. Este interzis folosirea n cadrul funciilor inline a structurilor repetitive(for,while,dowhile),iafunciilorrecursive. 9. Motenire.Clasadebaziclasaderivat.Specificatoridemotenire Motenirea este un mecanism care permite unei clase A s moteneasc atribute i metode ale unei claseB.nacestcazobiecteleclaseiAauacceslamembriiclaseiBfrafinevoiesleredefinim Clasdebaz>Clasacareestemotenit Clasderivat>Oclasspecializataclaseidebaz Relaiakindofniveldeclas Triunghiulesteuntip(kindof)Poligon Relaiaisaniveldeobiect Obiectultriungiesteun(isa)Poligon 10. Motenirea simpl i motenirea multipl. Clasadebazvirtual Moteniresimplclasaderivatpreiacaracteristicileimetodeleuneisingureclasedebaz Moteniremultiplclasaderivatpreiacaracteristicileimetodeledelamaimulteclasedebaz Motenireasimpl:Sintax classNumeleClaseiDerivate:modificatorDeAccessNumeleClaseiDeBaz Motenireaestemultipldacoclasaredousaumaimulteclasedebaz Mosteniremultipl:Sintax classClasaDerivat:[modificatorDeAcces]ClasaDeBaza1, [modificatorDeAcces]ClasaDeBaza2, [modificatorDeAcces]ClasaDeBazaN{} Dac o clas ca i clas de baz virtual, atunci ntro ierarhie de tip diamant clasa de baz este instaniatosingurdat Exemplu: classMamifer{} classAnimalInaripat{} classLiliac:publicMamifer,protectedAnimalInaripat{ Liliac():AnimalInaripat(),Mamifer(){}} 11. Obiecte ca parametri i valori returnabile ale functiei. Iniializarea obiectului cuunalt obiect intsuma(inta,intb){

intc=a+b returnc}//cestevaloareareturnatacutipuldedateint(acelcarestainfatalasuma) Parametrilaobiectesuntdeexemplu:virsta,greutatea,etcaunuiobiectCartofidetipLegume. 12. Atribuireaobiectelor.Suprancrcareaoperatoruluideatribuire Operaia de atribuire simpl, dac nu este suprancrcat, realizeaz o copiere membru cu membru.Pentru o biectele care nu conin date alocate dinamic la iniializare, atribuirea prin copiere membru cu membru funcioneaz corect, motiv pentru care nu se suprancarc operatorul de atribuire. Pentru clasele ce conin datealocatedinamic,copiereamembrucumembru,executatnmodimplicitla atribuire conduce la copierea pointerilor la datele alocate dinamic, n loc de a copiadatele.Operatorul de atribuire poate fi redefinit numai ca funcie membr, el fiind legat de obiectuldinstngaoperatorului =, o Lvaloare, motiv pentru care va ntoarce o referin la obiect. O prim cerin la scrierea funciei operator= este evitarea autoatribuirii a=a. n acest scop se efectueaz testul this != &d (unde d este parametrulfuncieiobiectuldindreaptaoperatorului= 13. ReferinenlimbajuldeprogramareC++.Referinecavalorireturnabileafunciei Referintele, ca si pointerii, sunt variabile care contin adresa unei zone de memorie. Semantic, ele reprezinta aliasuri ale unor variabileexistente.Referintelesuntlegatedevariabileladeclaratiesinupotfi modificate pentru a referi alte zone de memorie. Sintaxa folosita pentru declararea unei referinte este: Tip&referinta=valoare 14. Suprascrierea(redefenirea)funciilorinclasederivate.Polimorfizmuldetipstatic Funciile membre, motenite de la clasadebaz,lucrulcroranuestesatisfctorpentruclasaderivat, trebuie s fie suprascrise n clasa derivat. Totodat, funciilemembremotenitepotfiisuprancrcate n clasa derivat. Att suprascrierea,ctisuprancrcareafunciilormembrenclasaderivatsefacela fel ca i definirea funciilor membre: n declararea clasei derivate descriem numai antetul funciei, iar definireafuncieioscriemdupdeclarareaclaseisauscriemtoatdefinireafuncieindeclarareaclasei. Polimorfismulpermitecalaexecuiessedecidcemetodsfieapelat,oferind ofacilitateametodelordinclaseaflatenrelaiedederivare.Prinpolimorfismseexecut aciunidiferiteprinmesajecusemnturiidenticeasupraobiectelordetipdiferit(obiecte dinclasediferiterspunddiferitlaacelaimesaj). Legturastatic(earlybinding)Versiuneafuncieiapelatesestabiletenmomentulcompilrii 15. Pointericlaseiderivateidebaz.Funciivirtuale.Polimorfizmuldetipdinamic Accesul la membrii clasei de baz i a clasei derivate se poate faceprinpointerilaobiectedinclasade baz i din clasa derivat. Folosind pointeri dinclasadebaz.putemaccesaobiecte dinaceaclas,ct i dintro clas derivat, deoarece conversia unui pointer din clasa derivat ntrun pointer dinclasade bazsefaceimplicit Declararea unei funcii virtuale se face prin adugarea cuvntului cheie virtual naintea prototipului n clasadebaz Legaturadinamic(latebinding)Versiuneafuncieiapelatesestabiletentimpulexecuieiprogramului 16. Funciivirtualepureiclaseabstracte FUNCTIIVIRTUALE n limbajul C++ a fost introdus suplimentaroformspecialdefunciimembrevirtuale,pentrucarenu

seindiccorpulfunciei.Aafunciivirtualeaucptatdenumireadefunciivirtualepure. Funciavirtualpuresteofuncievirtualspecialdeformavirtual [tip][nume_clas::]nume_funcie([list_parametri])=0 sautipvirtual [nume_clas::]nume_funcie([list_parametri])=0 Ea nu are corp i nu poate fi executat. Funcii virtuale pure se declar n clase cu scopul de a fi suprascrisenclasederivaterespective. Motivedeutilizareafunciilorvirtualepure: Clasa de baz nu are suficiente informaii i nu este n stare s descrie complet funcionalitatea unei funcii membre virtuale. Pentru a impune suprascrierea forat de ctreprogramatoriafunciilorvirtuale purenpropriilesaleclase. Exemplu #include<iostream> usingnamespacestd class Animal { public: virtual void eat() { cout << "Eu mnnc aa cum o poate face orice Animal.\n"}} classWolf:publicAnimal{public:voideat(){cout<<"Eunfuleccaunlup!\n"}} classFish:publicAnimal{public:voideat(){cout<<"Eumhrnesccaunpete!\n"}} classOtherAnimal:publicAnimal{} intmain(){ Animal*anAnimal[4] anAnimal[0]=newAnimal() anAnimal[1]=newWolf() anAnimal[2]=newFish() anAnimal[3]=newOtherAnimal() for(inti=0i<4i++)anAnimal[i]>eat() } CLASEABSTRACTE Clas care conine sau motenete fr suprascriere mcar o funcie virtual pur se numete clas abstract. Nu se admite crearea exemplarelor de obiecte ale clasei abstracte. Clasa abstractservete numaicabazpentrudeclarareaaltorclase(derivate). Ometodsauoclasabstractsedeclarfolosindcuvntulcheieabstract. Deexemplu:publicabstractdoublecalcPay(doublehours) Dintroclasabstractnusepoateinstantianiciunobiect Fiecare subclas a unei clase abstracte care va fi folosit pentru a instania obiecte trebuie s ofereimplementripentrutoatemetodeleabstractedinsuperclas. Clasele abstracte economisesc timp, deoarece nu trebuie s scriem cod inutil care nar fi executatniciodat. Oclasaabstractpoatemotenimetodeabstractedintrointerfatsaudintroclas. 17. Suprancrcarea operatorilor. Funcii operatorimembru a clasei pentru operatori binari Un operator binar va fi reprezentat printro funcie membr cu dou argumente.Operatorii folosii n mod uzual pot fi unari sau binari. Utilizarea unui operator binar sub forma a#b este interpretat ca operator#(a,b)

Aadar, un operator binar va fi reprezentat printro funcie nemembr cu dou argumente, iar un operatorunar,printrofuncienemembrcuunsingurargument. Argumentele se iau clase sau referine constante la clase (pentru o preluare economic, asigurnd proteciadatelor) 18. Suprancrcareaoperatorilor.Funciioperatorimembruaclaseipentruoperatoriunari Unoperatorunarfireprezentatprintrofunciemembrcuunsingurargument. Funciilor membru li se transmite un argument implicit (ascuns) this (adresa obiectului, care poate reprezenta primul termen), motiv pentru care un operator binar poate fi implementat printro funcie membru nestatic cu un singur argument (termenul din dreapta operatorului). a#b este interpretat ca a.operator#(b) O funcie membru operator unar ca o funcie membru nestatic frargumente(#aseinterpreteazca a.operator#()pentruoperatorulpostfixata#conveniaestea.operator#(int)). 19. Suprancrcareaoperatorilor.Funciioperatoriprieteneaclaseipentruoperatoribinari Nu se poate modifica aritatea (numarul de operanzi) operatorilor limbajului (operatorii unari nu pot fi supraincarcaticaoperatoribinari,siinvers). Fie clasapunctdefinitaanterior.Reamintindfaptulcafunctiileprieteneauacceslamembriiprivatiaiunei clase, insa nu primesc ca argument implicit pointerul catre obiectul curent (this), sa supraincarcam operatorul+printrofunctieprietenaaclaseipunct: classpunct{doublex,ypublic://...... friendpunctoperator+(punct,punct)}//Metodeleclaseipunct. punctoperator+(puncta,punctb){punctpp.x=a.x+b.xp.y=a.y+b.yreturnp} voidmain(){punctA(1.1,2.2)A.afisare() punctB(5.5,6.6)B.afisare()punctCC=A+BC.afisare()C=A+B+CC.afisare()} ExpresiaC=A+BesteinterpretatadecompilatorcaC=operator+(A,B). Expresia C=A+B+C este evaluata tiinanduse cont de regulile de prioritate si de asociativitate a operatorului:(A+B)+C,ceeaceconducelaunapeldeforma:operator+(operator+(A,B),C). Observatie: In exemplul anterior, transmiterea parametrilor catre functia prietena de supraincarcare a operatorului + se realizeaza prin valoare. Parametrii pot fi transmisi si prin referinta, pentru a evita crearea (in momentul apelului functiei) unor copii locale ale parametrilor efectivi in cei formali. La transmiterea parametrilor prin referinta, functia operator + are prototipul: punct operator+(punct&, punct&) Pentru a proteja argumentele transmise prin referinta la eventualele modificari, se poate folosi modificatoruldeaccesconst:punctoperator+(constpunct&,constpunct&) 20. Suprancrcareaoperatorilor.Funciioperatoriprieteneaclaseipentruoperatoriunari Nu se poate modifica aritatea (numarul de operanzi) operatorilor limbajului (operatorii unari nu pot fi supraincarcaticaoperatoribinari,siinvers).Exemplu: Sintaxaeste:operatorTipData() respectiv:operator(TipData) Operatorul "cast" este unar, asadar are un singur parametru, adresa obiectului in cauza, si intoarce un rezultat de tipul operatorului. Ca urmare, prin aceasta metoda se pot defini numai conversiidintruntip clasaintruntipdebazasauunalttipclasa. De remarcat este faptul ca, in cazul conversiei dintrun tip clasa intrun alt tip clasa, functia operator

trebuie sa aiba acces la datele membre ale clasei de la care se face conversia, deci trebuie declarata prietenaaclaseirespective. 21. Fluxurile(clasestream)pentruoperaiunicitirescrierestandardsicufiiere. Streamurileauin principalroluldeaabstractizaoperatiiledeintrareiesire.Eleoferametodedescriere si citire a datelor independente de dispozitivul I/O si chiar independente de platforma. Streamurile incapsuleaza (ascund) problemele specifice dispozitivului cu care se lucreaza, sub libraria standard iostream. Alt avantaj al folosirii streamurilor se datoreaza implementarii librariei iostream, care utilizeaza un sistem de buffere. Se stie ca in general operatiile de intrare/iesire cudispozitiveleperifericesuntrelativ mari consumatoare de timp, astfel incat aplicatiile sunt uneori nevoite sa astepte terminarea acestor operatiuni. Informatiile trimise catre un stream nu sunt scrise imediat in dispozitivul in cauza, ci sunt transferate intro zona de memorie tampon, din care sunt descarcate catre dispozitiv abia in momentul umpleriiacesteizonedememorie. InC++streamurileaufostimplementateutilizandclase: clasastreambufgestioneazabufferele. clasa ios esteclasa debazapentruclaseledestreamurideintraresideiesire.Clasaiosarecavariabila membruunobiectdetipstreambuf. claseleistreamsiostreamsuntderivatedinios. clasaiostreamestederivatadinistreamsiostreamsioferametodepentrulucrulcuterminalul. clasafstreamoferametodepentruoperatiicufisiere. 22. Funcii i clase generice (template). Forme generale pentru definirea unei funcii i clase Templateul reprezinta o familie de tipuri sau functii,cualtecuvinte,unsablon saumodel.De exemplu, pentru a implementa o lista de numere intregiestenecesarainmodnormalrealizareauneiclasespeciale (sa spunem ListOfIntegers), iar pentruolistadesiruri altaclasa(saspunemListOfStrings).Conceptul de template permite realizarea unei clase generale (sa spunem List), care sa accepte orice tip de element, inclusivtipurinecunoscutelamomentulimplementariiacesteia.Tipul templateuluiestestabilitin momentul instantierii sale. Templateurile sunt foarte utile pentru realizarea de biblioteci care trebuie sa oferemetodegenericedeprelucrareadatelor. Sintaxageneraladedeclarareaunuitemplateesteurmatoarea: template<ListaDeParametri>Declaratie unde Declaratiereprezintadeclarareasau definireauneiclasesaufunctii,definireaunuimembrustatical unei clase template, definirea unei clase sau functii membre al unei clase template, sau definirea unui membrutemplatealuneiclase. Claseleparametrizate(sauclaseletemplate)sedeclaraastfel: template<classNumeParametru> classNumeClasa{//...//definireaclasei} Particularizarea(=stabilireatipului)claseitemplatesefaceprinintermediuluneiconstructiidegenul: NumeClasa<NumeParametru> undeNumeParametrureprezintatipulobiectului. Functiiletemplatesedeclaraastfel: template<classNumeParametru>//...//declaratiafunctiei

23. Tratareaexceptiilor In C++ sa realizat un mecanism facil de tratare a exceptiilor. Astfel, o exceptie este un obiect a carui adresa este trimisa dinspre zona de cod unde a aparut problema catre ozonadecodcaretrebuiesao rezolve. Pasiicaretrebuiescurmatipentrutratareaexceptiilor: 1. se identifica acele zone din program in care se efectueaza o operatie despre care se cunoaste ca ar putea genera o exceptie, si se marcheaza in cadrul unui bloc de tip try. In cadrul acestui bloc, se testeaza conditia deaparitieaexceptiei,siincaz pozitivsesemnaleazaaparitiaexceptieiprinintermediul cuvantuluicheiethrow 2.serealizeazablocuridetipcatchpentruacaptaexceptiileatuncicandacesteasuntintalnite. Datorita faptului ca exceptia este instantierea unei clase, prin derivare pot fi realizate adevarate ierarhii de tratare a exceptiilor. Trebuie avuta in vedere posibilitatea de aparitie a unor exceptii chiar in cadrul coduluidetratareauneiexceptii,situatiicaretrebuieevitate.

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