30
ELEMENTE FUNDAMENTALE ALE POO Conceptele fundamentale ale POO sunt noţiunile de clasă şi obiect precum şi relaţiile dintre clase, obiecte şi dintre clase şi obiecte. Obiectul este o entitate dinamică, caracterizată prin:-stare - comportament -identitate Starea unui obiect semnifică temporalitatea lui. El poate fi creat şi distrus în timp de alt obiect sau de utilizator. Starea obiectului este caracterizată de atribute care au –nume asociat -valori asociate Comportarea unui obiect exprimă metoda (modalitatea) de răspuns a sa la mesaje (acţiuni) provenite din exterior, care determină schimbarea stării sale. Identitatea este proprietatea care distinge un obiect de alte obiecte. Ea se păstrează şi după ce obiectul a fost supus unor transformări sau şi-a modificat starea iniţială. Obiectele cu stari şi comportari asemanatoare se grupează în clase. O clasă abstractizează proprietăţile comune ale unui set de obiecte, asfel ca fiecare obiect este o instanţă (reprezentant sau individ) a unei clase. O clasă poate avea nici unul, unul sau mai multe obiecte instanţă. Clasa este o entitate statică şi nu dinamică precum obiectul, deoarece după specificare şi implementare se modifică foarte greu. Relaţiile stabilesc conexiunile logice dintre diferite entităţi. Relaţiile obiect-obiect sunt de utilizare-între obiecte ce schimba mesaje între ele de conţinere-obiecte complexe care conţin alte obiecte Relatia obiect –clasă este cea de instanţiere. Relaţiile clasă –clasă pot fi mostenite de asociere în utilizari 1

Elemente Fundamentale Ale Poo-2

Embed Size (px)

DESCRIPTION

Elemente Fundamentale Ale Poo-2

Citation preview

ELEMENTE FUNDAMENTALE ALE POOConceptele fundamentale ale POO sunt noiunile de clas i obiect precum i relaiile dintre clase, obiecte i dintre clase i obiecte.Obiectul este o entitate dinamic, caracterizat prin: -stare -comportament-identitateStarea unui obiect semnific temporalitatea lui. El poate fi creat i distrus n timp de alt obiectsau de utilizator. Starea obiectului este caracterizat de atribute care au nume asociat-!alori asociateComportarea unui obiect e"prim metoda #modalitatea$ de rspuns a sa la mesa%e #aciuni$ pro!enite din e"terior, care determin sc&imbarea strii sale.Identitatea este proprietatea care distin'e un obiect de alteobiecte. Ea se pstreaz i dup ceobiectul a fost supus unor transformri sau i-a modificat starea iniial.Obiectele cu stari i comportari asemanatoare se 'rupeaz n clase.O clas abstractizeaz proprietile comune ale unui set de obiecte, asfel ca fiecare obiect esteo instan #reprezentant sau indi!id$ a unei clase. O clas poate a!ea nici unul, unul sau mai multe obiecte instan. Clasa este o entitate static i nu dinamic precum obiectul, deoarece dup specificare i implementare se modific foarte 'reu.Relaiile stabilesc cone"iunile lo'ice dintrediferite entiti.(elaiile obiect-obiect sunt deutilizare-ntre obiecte ce sc&imba mesa%e ntre ele de coninere-obiecte comple"e care conin alte obiecte(elatia obiect clas este cea de instaniere.(elaiile clas clas pot fimostenite de asociere n utilizari deconinere #a're'are$Paradi'mele POO sunt: abstractizareaincapsularea motenirea polimorfismul

Abstractizarea reprezint procesul de i'norare intentionata a detaliilor nesemnificati!e i retinerea proprietilor definitorii ale unei entiti. Ea poate fi:-procedural -a datelorAbstractizarea procedural i'nor detaliile pri!itoare la desfasurare proceselor. Este specificpro'ramarii procedurale n care datele de )*E i funciile sunt distincte i folosite separat #e"emplu C++permite pro'ramare procedural$.Abstractizarea datelor i'nor detalii pri!ind reprezentarea unui tip de date . ,n POO pentru entiti de ni!el inalt cele - abstractizari sunt combinate n cadrul claselor.Incapsularea #ascunderea informaiilor$ implementeaz abstraciile prin clase. Ea separ informaiile de manipulare a unei entiti de informaiile de implementare.)ncapsularea informaiei la ni!el de tip se face prin mprirea unei clase n - seciuni distincte: interfa i implementare.Interfaa unei clase, transmisa tuturor obiectelor instan ale clasei respecti!e, permite accesulla clasa din e"terior al potenialilor utilizatori..Implementarea clasei, care cuprinde reprezentarea abstraciei i al'oritmii metodelor de interfa, nu este cunoscut i accesibil utilizatorilor. Motenirea permite clasificarea tipurilor prin or'anizarea lor n ierarhii. ,n funcie de poziia ocupata n ierar&ie, un tip poate fi:-'eneralizarea altor tipuri , sau-specificarea altor tipuri. /stfel, o clas este clas de baz sau superclas sau supertip pentru toate clasele care o specializeaz i clas derivat sau subclas sau subtip pentru toate clasele pe care le specializeaz. O clas deri!at preia de la clasa de baz toate caracteristicile acesteia, la care se mai pot adu'a i altele noi.Polimorfismul permite unei !alori de a a!ea mai multe tipuri. ,n C + + polimorfismul este: - parametric- ad-&oc- de motenirePolimorfismul parametric apare c0nd aplicam o funcie pe ar'umente de tipuri diferite. Polimorfismul ad-&oc permite suprancarcarea funciilor #implementrii diferite$, redefinirea metodelor unei clase de baz prin redefinirea i suprancarcarea lor n clase deri!ate. Polimorfismul de motenire permite manipularea obiectelor de un anumit tip n situaii ce necesit tipuri diferite de cele ale obiectelor. Declararea claselorClasa este un tip de date abstracte definit de utilizator, care se comport ca un tip predefinit. O clas C + + incapsuleaz datele membre, ce reprezint atributele clasei precum i funcii membre #sau metode$ care efectueaz operaii asupra datelor clasei. Clasa are un nume ce poate fi orice identificator, unic n domeniul respecti! de e"isten. 1eclararea unei clase folosete cu!0ntul c&eie classi are sinta"a:class nume2clasa3 4pri!ate: 5date membre pri!ate6 5constructori pri!ai6 5funcii membre pri!ate67 4protected: 5date membre prote%ate6 5constructori prote%ai6 5funcii membre prote%ate67

4public: 5date membre publice6 5constructori publici6 5destructor public6 5funcii membre publice6789C + + asi'ur o limitare a accesului la membrii unei clase i de aceea n declararea unei clase folosim specificatori de control ai accesului: pri!ate, protected i public. -Specificatorul private precizeaz membrii proprii ai clasei. Ei pot fi accesai de orice funcie, membr a clasei. )nstanele clasei nu au acces la membrii pri!ai. Specificatorul protected precizeaz membrii prote%ai care pot fi accesai nu numai de funcii membre ale clasei, ci i de funcii membre ale claselor deri!ate din clasa respecti!. Specificatorul public precizeaz membrii publici care pot fi accesai de orice funcie din domeniul declaraiei clasei #funcii membre i instane$. )mplicit membrii unei clase au atributul de acces pri!at. 1ac sunt prezeni, specificatorii de acces pot fi n orice ordine i se pot c&iar repeta. O funcie membru a unei clase are acces la toate datele membre ale oricrui obiect din clasa respecti!, indiferent de specificatorul de acces. Se recomand plasarea datelor membre n seciunea prote%at pentru a facilita accesul la ele de catre toate funciile membre ale claselor deri!ate. ,n declaraia unei clase pot aprea numai prototipurile funciilor membre. 1efinirea lor poate fi inclus n acelai fiier sau n fiiere separate n cadrul bibliotecilor de pro'rame. :unciile definite n cadrul clasei fac implicit parte din cate'oria inline. Pentru a defini o funcie membru aflat n afara declaraiei clasei folosim operatorul de rezoluie :: conform sinta"ei: nume2clasa :: nume2funcie unde nume2clasa este numele clasei din care face parte funcia. Operatorul de rezoluie :: spune ca funcia are acelai domeniu cu declararea clasei i este membr a clasei. 1up declararea unei clase, numele ei poate fi folosit ca identificator de tip pentru a declara instane ale clasei, cu o sinta" asemanatoare cu cea de la declararea !ariabilelor. Exemplu: Clasa coordonate incapsuleaz - date membre ",; i - funcii membre#translatare i tiprire$.Cele - date membre sunt coordonatele unui punct din plan. :uncia translatare # $ translateaz coordonatele punctului considerat cu a respecti! b, iar funcia tiprire#$ afieaz coordonatele punctului.< include5iostream.&6class coordonate3pri!ate:float ",;9public :!oid translatare #float a, float b$9!oid tiprire #$989!oid coordonate :: traslatare#float a, float b$3" + = a9; + = b98!oid coordonate :: tiprire #$3cout 55 >Coordonatele punctului sunt: "= > 55 " 55 ? i ; = > 55 ; 55 endl 93class coordonate @ , A 9aici se declar dou obiecte de tip coordonate.1efinirea funciilor membre translatare #$ i tiprire #$ este fcut n afara declararii clasei coordonate creia i aparin.Putem opera cu obiectele dintr-o clas ca i cu orice tipuri de date predefinite.BExemplu:coordonate pct., pct-9 declar - obiectecoordonate Cp9declar un pointer la obiectcoordonate ir 4.D7 9 declar un ir de .D obiectepct. = pct- 9Cp =ir 9 atribuiriPutem accesa orice membru public prin operatorul >.?. @embrii pri!ai nu pot fi accesai dec0t de funcii membre ale clasei. Putem atribui o !aloare unei date membre pri!ate numai printr-o funcie membr a clasei, care poate testa !aliditatea respecti!ei !alori.Exemplu : Pro'ram ce declar clasa ana!at care include - funcii membre publice i E date membre pri!ate. :uncia valori "# iniializeaz datele pri!ate ale clasei i folosete instruciunea ifpentru a asi'ura lui salariu o !aloare corect. :uncia de afisare "# afieaz datele membre pri!ate. :unciile sunt accesate prin operatorul ?.FF.< include 5iostream.&655"55 >i ; = >55;55 endl 9$Obseraie : Este interzis folosirea n funciile inline a instruciunilor repetiti!eforJ&ile do-J&ileG1eoarece compilatorul are ne!oie de ntrea'a definiie a unei funcii inline, funcia nu poate fifolosit dec0t n fiierul n care a fost definit.%onstructoriConstructorul este o funcie membru special a unei clase, care are acelai nume cu clasa creia i aparine. El ser!ete la crearea i iniializarea obiectelor i de aceea este apelat implicit de fiecare dat c0nd se creaz noi instanieri ale clasei.Declarare &i caracteristici ,ntr-o clas pot e"ista nici unul, unul sau mai multi constructori. 1ac nu este nici un constructor, compilatorul 'enereaz automat unul care este public, fr ar'umente i cu o list!id de instruciuni.O funcie constructor nu ntoarce un tip de date, deci n corpul ei nu trebuie folosit return$ Se declar un constructor prin :class nume2clasa3public: nume2clasa #$9 constructor prestabilit fr ar'umente nume2clasa #nume2clasa K c$9 constructor de copiere nume2clasa # ar'umente$9constructorii cu ar'umente8 9

LMa declararea i la definirea unei funcii constructor tipul !oid nu poate fi specificat ca tipreturnat.Constructorii pot a!ea ar'umente #inclusi! din cei implicii$ i pot fi supradefinii. Pointericatre constructori nu se pot folosi, deci adresa lor nu ne este accesibi.,ntr-un constructor putem folosi operatorii neJ i delete.Nn constructor prestabilit nu are ar'umente sau are o list de ar'umente n care toi ar'umentefolosesc ar'umente prestabilite.Ex.!: clasa coor'onate3protected:float ",;9public:coordonate# $9coordonate#coordonateKc$9coordonate#float a, float b$9........ alte funcii...... 89E".-:Pro'ram care creeaz clasaan(a)atce conine funcia constructor an'a%at. /cesta sedefinete ca orice funcie membr a clasei i atribuie !alori iniiale la trei obiecte lucr., lucr-i lucrB fr a ntoarce !reo !aloare.< include5iostream.&6< include 5conio.&6< include 5strin'.&6class an'a%at3public: declararea funciei constructor &ana!at'an'a%at#c&arC, int, lon', float$9!oid afisare #!oid$9pri!ate :c&ar nume 4GD79int !arsta9lon' marca9float salariu989 definirea funciei constructor Oan'a%at?an'a%at :: an'a%at#c&arCnume, int !arsta, lon' marca, float salariu$93strcp; #an'a%at::nume,nume$9an'a%at :: !arsta = !arsta9an'a%at :: marca = marca9if #salariu 5BDDDDDD.D$an'a%at :: salariu =salariu9else an'a%at :: salariu = D.D98

P definirea funciei membru &afiare'!oid an'a%at :: afisare #!oid$3cout 55 endl9cout 55 >Aume:? 55 nume 55endl9cout 55 >Iarsta:? 55 !arsta 55endl9cout 55 >@arca? 55 marca 55endl9cout 55 >Salariu:? 55salariu 55endl98!oidmain#!oid $3clrscr# $9an'a%at lucr. #>@. Pop?,GD, .B.B, -DDDDDD.D$9an'a%at lucr- #>/. Pop?,.P, .P.B, BDDDDDD.D$9an'a%at lucrB #>@arian P.?, EB, .B.P, B-DDDDD.D$9cout 55>1ate an'a%ati:? 55 endl9lucr..afisare# $9lucr-.afisare# $9lucrB.afisare# $981up compilare i rulare pe ecran se !or afia datele: 1ate an'a%ati:Aume: @.PopIarsta: GD@arca: .B.BSalariu: -DDDDDD.DAume: /. PopIarsta: .P@arca:.P.BSalariu: BDDDDDD.DAume : @arian P.Iarsta: EB@arca .B.PSalariu B-DDDDD.D1acnuprecizm!alori pentrutoate ar'umentele,funcia constructor, ca orice funcie,folosete !alori implicite.Supradefinirea constructorilorOfuncieconstructorsesupradefinetecaoricealtfuncieprinspecificareaunorfuncii alternati!e care corespund unor tipuri diferite de ar'umente.Spree"emplunpro'ramul demai susputemdaoadouadefinireafunciei constructoran(a)atnaintea definirii funciei membra*i&arecare solicit utilizatorului s introduc o!aloare a ar'umentuluisalariudac aceasta nu este precizat n pro'ram, n timp ce primadefinire implic specificarea n pro'ram a !alorilor celor E ar'umente: nume, !arsta, marca,salariu.Q/ doua definire are forma:an'a%at :: an'a%at #c&arC nume, int !arsta, lon' marca$3strcp; #an'a%at :: nume,nume$an'a%at :: !arsta = !arsta9an'a%at :: marca=marca9do3cout 55?)ntrodu un salariu pt.? 55 nume 55 >mai mic dec0t BDDDDDD.D?9cin 66 an'a%at :: salariu98J&ile #salariu6= BDDDDDD.D$8,n pro'ramul principal totul este identic ca mai sus, afar delucrB, unde instruciunea este:an'a%at lucrB #>@arian P.?, EB, .B.P$9Ma compilare i rulare se cere introducerea unei !alori pentru salariul lucrtorului B dup care e"ecuia continua cu afiarea datelor pentru cei trei an'a%ai.Constructor de copiere/cest constructor se folosete n C + + pentru a declara un obiect de tip clas i pentru a transfera un obiect ca ar'ument sau ca rezultat al unei funcii nsoite de o atribuire respecti! de iniializareaobiectului cu datele altui obiect de acelai tip. 1ac un astfel de constructor de copiere nu este declarat ntr-o anumit clas, compilatorul'enereaz automat unul care iniializeaz datele unui nou obiect cu !alorile corespunztoare dintr-un obiect specificat prin copiere membru cu membru ca la atribuirea standard.Pentru a declara un constructor de copiere pentru clasanume2clasatrebuie s specificm un ar'umentunicde tip referin la un obiect de acelai tip nume2clasa sub forma:nume2clasa #const nume2clasa K nume2obiect$9unde modificatorul const asi'ur c obiectul de intrare nu poate fi modificat.Constructorul de copiere acioneaz ca orice apel de funcie obinuit.E"emplu: /ici clasa dublet conine declaraiile unui constructor prestabilit i a unuia de copiere care este apelat de trei ori:Nn constructor de copiere poate promo!a mai multe ar'umente, dar cele suplimentaretrebuie s fie cu !aloare implicit pentru a permite copierea automata a obiectelor la apelulfunciei sau la ntoarcerea din funcie.Constructorul de copiere 'enerat implicit de compilator copiaz doar datele membre n cazulunor structuri dinamice i de aceea se recomand declararea de utilizator a constructorului decopiere pentru clasele care se refer la acest tip de structuri de date.DestructoriR1estructorii sunt funcii speciale ale unei clase cu efect complementar constructorului. Ele sunt automat aplelate pentru distru'erea obiectelor unei clase la sf0ritul pro'ramului.1estructorii au acelai nume cu cel al clasei de care aparin, precedati ns de caracterul ?S?.:iecare clas are cel mult un destructor. 1ac acesta lipsete, compilatorul 'enereaz automatunul cu efect nul.:unciile destructor nu primesc ar'umente. Se declar sub forma:class nume2clasa3public:nume2clasa# $ constructor prestabilit. . . . . . . . . . . . . . . . ali constructoriS nume2clasa# $ destructor. . . . . . . . . .. . . . . .alte funcii membre89:uncia destructor nu ntoarce nici un tip de date, nici c&iar tipul !oid. 1estructorii sunt utilimai ales pentru obiectele create prin alocarea dinamic a memoriei.E"emplu : Nn pro'ram ce are clasa an(a)at n care este definit destructorul San'a%at.< include 5iostream.&6< include 5conio.&6< include 5strin'.&6class an'a%at3public: declararea funciei constructoran'a%at#c&arC, int, lon', float$San'a%at# $9 declararea funciei destructor!oid afisare #!oid$9 fct$ membrupri!ate:c&ar nume 4GD79int !arsta9lon' marca9float salariu9 definireafuncieiconstructoran'a%at :: an'a%at #c&arC nume, int !arsta, lon' marca, float salariu$3strcp;#an'a%at :: nume,nume$9an'a%at :: !arsta = !arsta9an'a%at :: marca = marca9an'a%at :: salariu =salariu98an'a%at :: San'a%at# $ definire funciei 3destructorcout55?Se distru'e obiectul pentru an'a%atul? 55nume55endl98!oid an'a%at :: afisare#!oid$ definirea funciei3 membrucout55?Aume:?55nume55endl9cout55?Iarsta:?55!arsta55endl9cout55?@arca:?55marca55endl9cout55?Salariu?55salariu55endl98!oid main # $3clrscr# $9an'a%at lucr#?T.Pop?,RD,-DG.,-DDDDDD.D$9cout55?1ate an'a%at:?55endl9lucr.afisare# $981up compilare i rulare pe ecran apare: 1ate an'a%at:Aume: T. PopIarsta: RD.D@arca: -DG.Salariu: -DDDDDD.DSe distru'e obiectul pentru an'a%atul T.PopMembri statici ai unei clase1atele i funciile unei clase declarate cu cu!0ntul c&eie static se numesc membri statici.(ate membre statice:iecare obiect dintr-o clas are o mulime de date membre.Cele nestatice e"ist ncopii distincte n fiecare obiect ce le conine. Cele statice e"ist ntr-o sin'ura copie comuntuturor obiectelor ce le conin, deci uneidate membre staticei se rezer! o sin'ur zon dememorie comun tuturor instanelor clasei. /cestea se declar n cadrul clasei sub forma:pri!ate 9public9static tip nume2data91updeclarareaclasei oricedatmembrustatictrebuiedeclaratca!ariabil'lobalne"teriorul clasei sub forma:tip+'atanume+clasa::nume+'ata+membru9Obli'atoriu datele membre statice trebuie iniializaten afara declaraiei clasei.1atelemembrestaticee"istseparat deobiecteleclasei, daroricemodificareaunei datemembre este sesizat de toate obiectele clasei ce o conin.1atele membere statice pot fi accesate nainte de crearea obiectelor clasei. /ccesarealordininteriorul funciilormembrealeclasei respecti!esefacelafel cai pentrudatelemembre nestatice.E"emplu : Pro'ramceareclasastocncaremembrulpretestedeclarat static. El esteacelai pentru cele dou obiecte ale clasei prim i secund. @odificarea !alorii membrului pretafecteaz instanele celor dou obiecte. Ialorile celorlalte date membre ale obiectelor nu semodific.< include 5iostream.&6< include 5strin'.&6< include 5conio.&6class stoc3 pri!ate :declararea membruluistatic int pret9staticpretc&ar denumire4GD79c&ar producator4GD79int cantitate9public:stoc#c&arC, c&arC, int$9!oid afisare # $9!oid !al #int$989declararea membrului static pret ca int stoc :: pret9 variabil lobal!oid stoc :: !al #int prt$3pret = prt9iniializarea membrului static8stoc :: stoc #c&arC den, c&arC prod, int cant$93strcp; #stoc :: den, denumire$9strcp; #stoc :: prod, producator$9stoc :: cant = cantitate98!oid stoc :: afisare # $3cout55?1enumire:?55denumire55endl9cout55?Producator:?55producator55endl9..cout55?Cantitate:?55cantitate55?buc?55endl9cout55?Pret unitar:?55pret55?u.m.?55endl98!oid main # $3clrscr # $9stoc prim #>Produs.?, >:irma /?, -DD$9stoc secund #>Produs-?, >:irma T?, BDD$9prim.!al#.DD$9cout55?Oferta iniial:?55endl9prim.afisare# $9secund.afisare# $9cout55endl55?Oferta finala:?55endl9prim.!al#RD$9prim.afisare# $9secund.afisare# $98 1up rulare pe ecran apar afiate: Oferta iniial:1enumire: Produs.Producator: :irma /Cantitate: -DD buc.Pret unitar: .DD u.m.1enumire: Produs-Producator: :irma TCantitate: BDD buc.Pret unitar: .DD u.m.Oferta finala:1enumire: Produs.Producator: :irma /Cantitate: -DD buc.Pret unitar: RD u.m.1enumire: Produs-Producator: :irma TCantitate: BDD buc.Pret unitar: RD u.m.Orice dat membru declarat ca public i static se poate folosi n pro'ram c&iar dacn pro'ram nu e"ist nici un obiect al clasei.Pentru accesarea unui astfel de membru se folosete operatorul de rezoluie 'lobalsub forma: nume+clasa :: nume+membruE": < include5iostream.&6< include5conio.&6class stoc3public:static int pret9pri!ate:c&ar denumire 4GD79c&ar producator 4GD79int cantitate989int stoc :: pret9declararea membrului stoc pret ca!oid main # $variabil lobal3clrscr # $9stoc :: pret = .DD9cout55?Pretul unitar iniial a fost:?55stoc :: pret 55?u.m.?55endl9stoc :: pret = RD9cout55>Pret unitar final este:?55stoc :: pret55?u.m?98 /ici se acceseaz membrul pret al clasei stoc fr s e"iste un obiect al clasei stoc.Obser!aie:Prin folosirea datelor membre statice:- reducem numarul !ariabilelor 'lobale din pro'ram9- urmrim numarul instanelor unei clase9- controlm accesul9- alocm un bloc de memorie special pentru diferite obiecte ale unei clase..-Funcii membre staticePutem defini funcii membre statice ca i date membre statice. Ele fac operaii care nu suntasociate unor obiecte indi!iduale, ci asociate ntre'ii clase care le conin.O funcie membru static i public poate fi apelat i c0nd nu e"ist nici un obiect alclasei respecti!e.Pentru apelare folosim operatorul de rezoluie 'lobal >::?./ceste funcii nu primesc implicit adresa unui obiect.Spre deosebire de funciile membre nestatice ale unei clase, cele statice nu au pointerult&is, deci elenupotaccesadirect dec0talteelementestaticealeclasei respecti!e#nupotaccesa elementele nestatice ale claseiU$.Se definesc ca funcii membre statice ntr-o clas acele funcii de uz 'eneral care suntfolosite de mai multe clase, e!it0nd definirea lor ca funcii de sine statatoare.E"..: class clasa3pri!ate: static int i9 . . . . . . . . . . public: declararea funciei membre statice static !oid f#int$9 . . . . . . . . . . 89definirea datei membre staticeint clasa :: i=G9!oid clasa :: f#int i$3 definirea funciei membre staticeii9accesarea direct a unui membru static. . . . . . . . . . . 8E".-:class cls3public: int !ect 4.G79 static int prim # $989int cls :: prim # $3return !ect 4D798,nacestcazcompilatorul !asemnalaeroarelancercareafunciei membrstaticprim dea accesa membrul nestatic !ect.Funcii prieteneC + + permite accesul la datele membre pri!ate ale unei clase nu numai funciilor membre aleclasei respecti!e, ci i altor funcii membre clasei numitefuncii prietene. Ele pot fiindependente sau membre altei clase.1eclarareauneifuncii prieteneindependentesefaceninteriorul clasei preced0ndprototipul funciei de cu!0ntul c&eie friend astfel:class nume2clasa3public:friend tip2reznume2fct #5ar'umente6$9)ndiferent de poziia prototipului, funciile prietene sunt publice . O astfel de funcie nu poatentoarce o referin la clasa prieten.O funcie prieten poate accesa membri pri!ai ai clasei direct prin operatorul > .?..BE".: Pro'ramul declarcalsacompi neafunciaprietenindependent:coincid#$, carentoarceo!aloarenenuldacpuncteleprimitecaar'umentesunt identicei nulncazcontrar.< include 5iostream.&6< include 5conio.&6class comp3int ",;9public: declararea constructorluicomp #int,int$9S comp # $9 declarareadestructorului!oid afisare # $9 decl$ funciei membrufriend int coincid #compK, compK$989declararea funciei prietene independentecomp::comp#int a,int b$ 3"=a9 ;=b9afisare# $9definireaVV.constructorului8comp::Scomp# $ definirea destructorului3VV8!oid comp::afisare # $definirea funciei3 membrucout 55?"=?55"55?9;=?55;55endl98 definirea funciei prieteneint coincid #comp K p.,comp K p-$3if #p.." == p-." KK p..; == p-.;$return .9elsereturn D98!oid main # $3clrscr # $9cout 55?coordonatele punctului p. sunt:?9comp p.#-,B$9cout 55?coordonatele punctului p- sunt:?9comp p-#-,E$9cout 55?rezultat:?55endl9if #coincid#p.,p-$$ cout 55?Punctele p. i p- coincid:?55endl9 else cout55?Punctele p. i p- sunt diferite?98 1up rulare pe ecarn apare:coordonatele punctului p. sunt: "=-9 ;=Bcoordonatele punctului p- sunt: "=-9 ;=E(ezultat:Punctele p. i p- sunt diferite.O funcie prieten poate opera asupra unui obiect transferat ca ar'ument. Ea folosetenumeleobiectului i unoperatorderezoluiepentruareferi datesaufuncii membrealeclasei.1acunpro'ramconineofunciemembraunei clasecareesteprietenaltei claseseimpun:- declararea corespunztoare a funciilor prietene- o anumit ordine n definiia claselor.1eclararea funciilor prietene ce aparin unei clase se face sub forma:class nume2cls-3public:. . . . . . . . . .Efriend nume2cls. :: nume2fct #5ar'umente6$98undenume2cls.= numele clasei n care este funcianume2cls- = numele clasei cu care funcia este prieten.1efiniiilacelordouclasetrebuiesrespecteoordineprestabilit. Pentruaceastatrebuie specificat un identificatornume2cls.sub forma:class nume 2cls.. Se definete apoiclasa nume2cls-. ,ntre acestea se d compilatorului indicaia pri!ind o re!enire ulterioar ladefinirea claseinume2clas.. /ltfel definiia clasei nume2cls- ar face referire la clasanume2cls., nerecunoscut pentru compilator i aceasta ar da eroare.E"emplu: /ici funcia f# $clasei / i este prietenclasei Tclass /9 definirea incompleta a clasei Aclass Tdefinirea clasei )3. . . . . . . . . . !oid f#/, . . . . $. . . . . . . . . . .89class /3 definirea clasei A. . . . . . . . . . friend !oid T :: f#/, . . . . $989!oid T :: f#/ obiect-/, . . . . $3. . . . . . . . . . . definirea funciei prietene8:olosirea funciilor prietene:- reprezint o metod de control a accesului la membrii unei clase- ofer o metod simpla de acces limitat din anumite funcii la datele unei clase- funcia care n lista de ar'umente are cel puin dou ar'umente din aceeai clas icare acceseazar'umente pri!ai nu poate fi dec0t prieten.Clase prieteneClasa T este prieten clasei / dac toate funciile membre clasei T pot accesa directmembri pri!ai ai clasei /.Pentruadefini clasaTprietenclasei/ seintroducentremembri publici ai clasei/ oinstruciune care s conin cu!0ntul *rien' urmat de numele clasei T sub forma:(elatia*rien'nuestenici refle"i!, nicitranziti!. 1ere'ulclaseleprietenenC++suntindependente, n sensul ca nici o clas numostenete membrii celeilalte clase.class T9class / 3 public: . . . . . . . . . . friend class T9 . . . . . . . . . . 89class T 3. . . . . . . . 89E"emplu:/ici clasaspecificareesteprietenclaseimaterial. Pro'ramul modificunadincaracteristicileunui material i anumefunciemodif# $aclaseispecificaremodificdatamembr cant carereprezint cantitatea disponibila amaterialului. Obiectulmaterialeste.Gtransmis funciei modif# $ prin adres. Pentru a accesa membrul respecti! funcia folosete unpointer.< include 5iostream.&6< include 5strin'.&6< include 5conio.&6class specificare9class material3public: material#c&arC, c&arC, c&arC$9 !oid afisare#!oid$9 friend specificare9pri!ate: c&ar den 4BD79 c&ar prod 4BD79 c&ar cant 4-D7989material :: #c&arC den, c&arC prod, c&arCcant$3strcp;#material :: den, den$9strcp;#material :: prod, prod$9strcp;#material :: cant, cant$98!oid material :: afisare#!oid$3cout55?1enumire:?55den55endl9cout55?Producator:?55prod55endl9cout55?Cantitate:?55cant55endl98class specificare3public: !oid modif#materialC, c&arC$9 c&arC atrib#material$989!oid specificare ::modif#materialC material., c&arC cant.$3strcp;#material. cant, cant.$98c&arC specificare :: atrib#material material.$3static c&ar cant 4-D79strcp; #cant, material..cant$9return #cant$98!oid main # $3clrscr# $9cout55?Situaia iniial:?55endl9material car#>)no"?,?Cos Pitesti?,?Gt?$9specificare actual9car.afisare # $9actual.modif#Kcar,?Bt?$9cout55endl55?Situaia actuala:?55endl9car. afisare # $981up compilare i rulare pe ecran apare:Situaia iniial:1enumire: )no"Producator: Cos PitestiCantitate: GtSituaia actuala:1enumire: )no"Producator: Cos PitestiCantitate: Bt,upra'e*inirea operatorilor1efinireaunei clasentr-unpro'ramreprezintdefinireaunui noutipdedate. :olosindoperatori standard putem defini diferite operaii cu obiectele clasei. /ceti operatori se obinprin supradefinirea celor e"isteni adica prin modificarea semnificaiei lor.(olul supradefinirii operatorilor este creterea lizibilitii pro'ramului e"prim0nd operaii cuobiectele claselor definite de utilizator sub o form cat mai su'esti!..LSupradefinirea unui operator ntr-o clas se face prin specificarea unei funcii careimplementeaz operaia corespunztoare operatorului respecti!. /ceast funcie este ulteriorapelat atunci c0nd clasa folosete operatorul supradefinit.1eclararea funciei folosete cu!0ntul c&eie operator sub forma:tip2rez operator simbol2operator #5ar'umente6$9Ma supradefinirea operatorilor trebuie respectate re'ulile:- simbol2operator = orice simbol de operator din C + + mai puin urmtorii patru:. #operator de membru al clasei$.C #operator de pointer la membru$:: #operator de rezoluie 'lobal$W: #operator de e"presie condiional$- nusepoate e"tinde setul de operatori C++prindesemnarea denoi simboluri#caractere sau seturi de caractere$.- aritatea unui operator nu se poate modifica.- prioritatea i asociati!itatea operatorilor supradefinii se pstreaz9 se poate modificadoar prin folosirea parantezelor.Ma supradefinirea unui operator pentru o clas, semnificaia lui este modificat doar n clasarespecti!, pentru restul !ariabilelor din pro'ram operatorul pstr0ndu-i semnificaia curent.:unciile operator care supradefinesc operatorii unei clase se definesc:- sau ca funcii prietene- sau ca funcii membre ale clasei respecti!e.Funcii operator prietenePrototipul funciei operator prietene apare ncadrul declaraiei clasei fiindprecedat decu!0ntul c&eie friend. /ceast funcie are acces la toate datele pri!ate ale clasei.E"emplu: /ici implementm operatorul unar minus, operatorul binar plus i nmulirea cu unscalar, ca funcii prietene clasei coord, care se refer lacoordonatele punctelor din plan.Prototipurile celor trei funcii operator sunt incluse n declaraia clasei i definiiile lor suntplasate n afara clasei.< include 5iostream.&6< include 5conio.&6class coord3pri!ate: double "9 double ;9public: constructor coord #double "D=D, double ;D=D$ 3"="D9 ;=;D98 !oid afisare # $fct$ membru3cout 55?"=?55"9cout 55?, ;=?55;55endl9 8 declararea funcieiilor operatorfriend coord operator#coord$9friend coord operator + #coord, coord$9friend coord operator C #int, coord$989coord operator - #coord a$3def$ fct$coord c9operator minusc." = -a."9c." = -a.;9return c98coord operator + #coord a, coord b$3def$ fct$coord c9operator plusc." = a." + b."9c.; = a.; + b.;9return c98coord operator C #int X, coord a$3def$ fct$ operator.Pcoord c9*nmulire cu scalarc." = X C a." 9c.; = X C a.; 9return c98!oid main # $3clrscr # $9cout 55?1ate de intrare:?55endl9coord p.#.,.$9 p..afisare# $9coord p-#-,E$9 p-.afisare# $9coord pB#B,D$9 pB.afisare# $9coord r., r-, rB, rE9cout 55?(ezultate:?55endl9r. =- p.9r..afisare # $9r- = p. + p-9r-.afisare # $9rB = p. + pB +r-9rB.afisare # $9rE = - G C p.9rE.afisare # $98.Q 1up compilare i rulare pe ecran apar:1ate de intrare:" = ., ; = ." = -, ; = E" = B, ; = D(ezultate:" = - ., ; = - ." = B, ; = G" = P, ; = L" = -G, ; = - GFuncii operator membreO funcie operator membr unei clase are unul din operanzi t&is iar ceilali operanzi,dac e"ist sunt transmii ca ar'umente. /stfel implicit funcia primete adresaobiectului pentru care este apelat.E"emplu: (elum e"emplul de mai suspentru implementarea celor trei operatori cafuncii membre ale clasei coor'.o Se nlocuiesc cele trei instruciuni*rien'care declar funciile operatorprietene respecti!e cu urmatoarele instruciuni care declar funciile operatormembre: coord operator# $9coord operator + #coord$9coord operator C #int$9,n definiiilecelortreifunciisenlocuiesc instruciunile subliniatemai susrespecti! cu c0te una din urmatoarele:coord coord :: operator# $coord coord :: operator + #coord b$coord coord :: operator C #int X$o ,n rest totul este nemodificat, e"cepie referirea la primul ar'ument alfunciilor care acum se face prin referirea direct a acestora i astfel pro'ramul!a afia aceleai rezultate ca i cel de mai sus.1irecti!e de preprocesare Preprocesarea este prima etap a compilarii unui fiier surs i este realizat deun pro'ram special numit preprocesor care este diferit de compilator. El este automatapelat decompilatorpentruae"ecutaanumitecomenzi cee"istnfiierul surs,comenzi numite directi!e de preprocesare i precedate de