You are on page 1of 260
LOW CLUJ-NAPOCA, 2001 AJ [SLs INCEE GC Sl Gre PENTRU PATORI VOLUMUL II UBASUL ( Codd DIACONU ROXANA Feesitare Autor: LIMIU NEGRESCU Aconfruntat cu originalul Irina Mitrov aay poner Zo Beet ta an cicildata site ite astyec odruta Posnaru =—— Fee Bevesteanu aan ella Tart “ EDITURA ALBASTRA comanda 1443/2001 ‘Toate croptuis asupra acestel exit suntrezerate sc, Casa do Ediura Albastra CUPRINS 20. 20.1 202. 20.2.1 20.2.2 2033. 204. 20.5. 20.5.1. 20.5.2. 203.3. 2035.4, 206. 202. 20.8, 208.1. 208.2, 209. 20.10. 20.11 20.12. 20.13, 20.14. 2. 22. 21 222. 223. LIMBAJUL C++ CA EXTENSIE A LIMBAJULUIC ..... eee Comentarin Definigia unei functi Antetul si prototipul unei funeti Exercitii oo... : Corpul uaei functii Tipuri predefinite in C si C+ Constant? caracter F Exercitii Operator: Operatoral de rezolutie Operatoral adress (&) Operatoral de alocare dinamica a memoriei (new). Operatoril de dezalocare a memoriei (delete)... . ‘Apel prir referingé (call by reference) Exercitii Functii care retueaza date de tip referinga Exercitii Modificatori ‘Modificarorul const ‘Modificatorii near, far si huge Cuvintul cheie void Structuri Reuniune . . Tipul enumerare . . Supraineircarea fimetillor Exercitii Funefii inline ‘i : Breet cor PROGRAMAREA PRIN ABSTRACTIZAREA DATELOR ... . . Exercitii ‘ CEASE ocr cess cece eens Definitia claselor Obiecte Domeniul unui nume . 22.10, 24.2 243. 25. 26, 21, Vieibitita Durata de vinta a datelor Alocatea si dezalocarea obicetetor Ininializare Constructor Destructor Exerc Funetie pricten (Friend function) Exercitit SUPRAINCARCAREA OPERATORILOR Exercitit Suprainicarcarea operitorilor new sidelete Exercitit Supraincarcarea eperatorului = Exereitii Supraincarcarea operatorutui [] (operatorul de indexare) Exercitii Supraincarca Exereitit Supraincarcarea operatorului > ea operatoruti ()(operatorul de apel funetie) CONVERSH . Conversia datelor de tipuri predefinite in date de tip abstract, Exercitit ‘ Conversia dintt-un tip abstract intt-un tip predefinit Exereitit Conversia dint-un ip abstract intr-un alt tip abstract Exereitii MODIFICATORUL CONST PENTRU OBIECTE SI FUNCTIH MEMBRU .. ~~. . OPERATORI DE DEREFERENTIERE A POINTERILOR SPRE MEMBRIL CLASELOR (* $12")... s+ Exercitii CONCLUZIL ASUPRA PROGRAMARITI PRIN ABSTRACTIZAREA DATELOR |... 94 94 95 96 105 106 137 140 143 149 177 185 193 198 205 207 218 225 232 235 240 246, 265 267 278 282 296 298 301 305 28. PROGRAMAREA ORIENT. SPREOBIECTE 2. .......005 29. CLASE DERIVATE SI CLASE DE BAZA . . . 29.1 Relatia dintre construetorii si destructorii clasclor de baza si ai elasei derivate Exercitii 292 Conversii 293 Redefinirea datelor membru ale unci clase de baza intr-o elasa derivata 29.4 Suprainearcarea funetiilor membru ale unet clase de baza intr-0 clasa derivata Exercitii 29.5. Clase virtuale Exercitii 30. FUNCTILVIRTUALE ........ Exercitii 5 30,1, Clase abstracte Exercitii 31. INTRARVIESIRE. eee 31.1. Intrarivfesici standard BLL, Iegite standard Exerciti 311.1. Manipulator Exercii 31.1.1.2 Iegire neformatata 31.1.1.3, Supraincarcarea operatorului << pentru iegti de obiecte 31.12. Intare standard Exercitii 31.1.2.1, Intrari neformatate 31.122, Supraincarcarea operatorului >> pentru intrari de abiecte Exerciit 31.2, Formatarea in memorie 31.3. Preluerarea fisierelor Exereitit BIBLIOGRAFIE ........... 20. LIMBAJUL C++ CA EXTENSIE A LIMBAJULUI C fn [14] B. Stroustrup arata ea limbajul C++ este proiectat in asa fel inci = si fie un C mai bun; sa permit stilul de programare prin absteactizaren datelor = si permita stlul de programare oricntat spre obiecte. In aceeasi carte Stroustrup afirma ci C++ este un “C mai bun” deo furnizeaza un suport mai bun pentru stilurile de programare suportate de limbajul c. Amintim ci timbajul C permite utilizatorului si foloseascastilurile de programare ineetitenite sub denumirile de “programare procedurald” (vedi 4.14) si“programare modulard” (vezi capitolul 7). Amibele stiluri sine suporiate mai bine de limbajul C++ pe baza introducerii unor extensii Ia facilitiile cexistente in limbajul C Limbaju! C devine un subset al limbajului C+ (adesea se obignutieste sa se spuiitet C++ este tm superset al limbajuluiC). Aceastainseamna ea un program seri in C este in aecasi timp si un program seri in C+. In Hinit mari, acest Iueru este auevarat, Compatibilitatea mu este asigurata 100% dar eazurile de incompatibilitate sit neesentiale 5i pot fi usor eliminate ta programe concrete. In capitolul de fata se tree in revista extensiile mai importante ale constructilor din C introduse in limbajul C>-¥. Cu alte euvinte, in acest capital se discuta aspectele care conduc la afirmatia lui B. Stroustrup ed limbajul C+ este un C mai bur, Cofelatte fa datelor si ori titi oferite de limbajul C+ (programarea prin abstractizaren A spre obiecte) vor fi abordate in alte capitole, In incheicte, plastic vorbind, putem afirma ca limbajul C++ este un “C inerementat” si injelegem prin aceasta ea pe deo parte este un “C mai bun”. find © extensie a limbajului C, iar pe de alla parte permite stiluri de programare impracticabile in C: ~ programarea prin abstractizarea datclor i ~ programarea orientata spre obieet, 20.1. Comentariu pot fi intro Comentarile siat explicatii pentru programatori.F orice punct in care este legal aparitia unui earacteralb, In limbajul C, § deci sin CHS, comentariile se inelud intre /* (ik cpu ccomentatiului) gi */ (sfirgitul comentariului). Comentariie pot fi serise pe mai aval rind in atara Ue aceasta posibilitate, in limbajul C+ exista si varianta de a serie comientatit pe un singur Find, Un astfel de comentariu incepe cu secventa’ si se termina la sfirgitul rindului. Comentariile de acest fel insojesc, de obicei, cite o instrvctiune sau o componenta a unei instructiuni care necesita explicatii pentru programatori. Comentariile din antetul unei functi se seriu adesea pe mai multe lini si din aceasta cauza ele se insereaza mai simplu folosind conventia din limbajul C. Exemplu: LElb as i < 29) Man biseet >be el =o ale codului In compunerea unui comentariu se pot utili orice caraetere ASCIL Comentarile sin eliminate din programe la compitare. 20.2. Definitia unei functii Definitia unei funetii in limbajul C+ se compune din antet urmat de corpul (0 functie poate f apelata dca este precedata de definitia sau de prototipul ei 20.2.1. Antetul si prototipul unei functii © funetie in mod implicit este global, Ea poate fi localizata intr-un fisier sursé folosind cuvintul cheie static Ia inceputul antetului ei. In acest eaz, se spune ci functia este staticd: ‘0 fanetie poate sa returneze (Intoarea) sau nu o valoare la reveniea din ea. Tipul valor returnate de functie se indica in antetul funesie. In eazal mee funetia nu retumeaza (intoaree) o valoare, in locul tipului din antetul ei se foloseste euvintul cheie void. ‘Antetul unei functi in limbajele C gi C++ are formatul: tip nume(lista deelarayiitor parametrilor format static rip nue (lista dectaratilor parametrilor formati) Dectaratiile de parametti sint separate prin virgula, Dacd funetia nu are parametri, atime lista din parantezete rotunde este vida 8 Spre deosebire de limbajul C, in limbajul C++ se pot face initializari ale ‘Patamettilor formal Exemple: 1. sootean vcalend {int si,int luna, int an = 1998) Incest exempl, parametrul formal an este intializat cu valoarea 1994 2. double arin (dovbie x, double a0, double double piss. 1eis9a6s93e579) Paramettiformali iniialiat se momese parametrit implicit 60, Ls apelul fimctilor, unui parametru implicit poate sii corespunda sau nu un parameiru efeetiv. In eazulin-eare un parametru implicit nu-t corespunde, la ape! uit parameiru efectiv, parametrul formal respectiv ia ea valoare valoarea sa initia‘a, Aceasta se mai numeste valoare inplicits parametrului respectiv. Daca ta un apel, unui parametru implicit i corespunde un parameteuefectv, tunel parametrului formal respectiv ise atribuie in mod obisnuit valoarea pparamettului efecti care ti corespunde, Cu alte cuvinte in acest eaz se neglijeaza valoarea implicta a parametrlui formal D2 exeinpl, apetul funetiel v_calend avind antetul de mai sus vicalend(28,2); implica lansarea functiei v_calend pentru urmatoarele valori ale parametritor forme i 28,luna=2,an= 1994, Pentru ant s-a utilizat valoarea implicita, In schimb apelul: 4 = veatend(31,3,2995) ; lanseaza functia v_calend cu valorile: 1, luna = 3, an = 1995, Incest caz, valoarea implicit a fost negli Le ut ea paramotlor impli ex a ocupe Wm aes oe par ilimbajele Ci C++ sept defn funeli in ramet tn acest eaaita delaratlor paramettorTarmal Conime mma declraile pararetlor eave sintprezeni la orice ape al func. Aces sit aga Mu avaner fis ai functie\ spre dcosebite de cela care se humese parunts aril. Pameti fis preced pe ce varabil. Prezena pramettio ra indicd, in antetul functiei.prin tei puncte care se seriu dupa ultimul parametru fix al netic. a. © limitare in legatura eu pozitia Tista_dec Exempla: Fie antetul void vE(int n,double x... Din antet rezulté c& funetia are doi parametri ies: m six, precum si alti Parametri al earor numar si tip nu este in prealabit precizat si difera de la apel la ape, Functile eu un numar variabil de parametri se definese folosind niste Imacrouri speciale care permit accesu! la parametti variabili, Aveste maerourisint definite in fisierul stdarg A, De obicei, funetiile cu un numar variabil de parametsi sint functii de biblioteca. Exemple de astfet de functii din biblioteca sistermului sint fuetile prin’ scanf. Acestea au fiecare un singur parametru fix i anunie parametrul care defineste formatele de conversie si eventualele texte constante care intervin {in operatile de intrare/iesire initiate prin apelul lor, Antetul unci funetii ponte ti mai general decit cel indicat mai sus. Astfel, in cazul limbajului Turbo C++, antetul unei functit are urmatoaren structura generala spe rator_de_elasi tip modifieatort nume (lista declaruitlor parametrilor formaliy Specificarorul de class, daca este prevent, este cuvintu ‘cheie static sau extern: Cuvinaulehele tare se utilizeaza pontew(afoatizaaneti i Mgieut on sare este definita. Cuvintilcheie extern indica fap ed Tela Imai plicit o functie se eonsidern ca este globala si de necea specifcatonut exera se obieei, nu se utilizeaza Tipul din antet defineste tipul dated retumate de functie, Daca fanetia ‘etumeavu at tip det cel indicat in anttal ei, ate valoarea respective eec converts automat spre tipul indicat in ante, inante de a reveni in punetul de dupa apel Daca tipul nu este prezeot in att fanetc,atunel se considera ed funtia Teturneaza o valoare de tip int. Cu toate acesten se recomandi ea tpl sh he Prezent oidesuna, Sa constatat cé omitreatipului din anetl finspiles eonduns 4a erori,deoarece acesia se omite gi cind tebuie sa fie prezent(adica atone! encl este diferit de i) io astfel de eroare nu poate fi depistata de compilaton, Modificatorii care pot apare intre tip si mume sim specifi diferitlor implementari ale limbajului C++. tn eazul limbajului Turbo C++ cet moh importanti modifieator snt ‘edeel, pascal, near, far si huge Primi dot stabilese convent de transfer a parametsilor side apel a funetilor Ei se olosese cing se utilizeaza module serise in mai-multe Himbaje. de programare, 10 pilin ‘ fi pascal activeazi conventia din Pascal spective. In mod anilog, modificatorul pase a din Pose odie este cea definita prin opfiunile de compilare. re aon ease pref, kts imps sedis prin muda de mermore cure sane mle fi mnodifieaorul far, iar modelul huge implica modifieatoral haze sce veune . Un exemplu de utilizare a modificatorului far il ofera pees Sa owes. sinteri de tip far " Astfel, prototipulFunetiet »_calend al edrui antet se ind pl atend(int 2i,int Tuna, jae anei934) S™ poolean vucalend(int, int, int=1994); % Prima forma clarified sensul paramettilor si de neeea ea este sugestivd in marie cu eea dea dou . nfo exempal 2s pot tiza wmatoarle pro‘ aldowble r,dovble a = O,doubie b = 369, some aria Gocble pi 318155255338979) Gouble exialdoxble, double = o,double = 360, Goubie = 2a259265030079); Exer Fonetiaetuncaa vloare zero daca se inteste sfiyitl de fiir in caz contrar. FUNCTIA BXX1 Sn bint lint ‘2, int be10) etn inca ssn bazab dn inerva 210] Soave mt it ini dt esa naman convert zona eee Pez “Famoars OT ses de vr all tena Te ong 5: int sia! Ghar er{l © ‘se reia citizen caracterelor intregului\n": fortii)t printf (*tastaté caracterele intreoului =") Bign = 1; while! te Ieee te [Less ant) ifte 2 getchar (| fslt peste minus : ities Hye hae (1 sal peste plus if(e == BOP) return OF ieee se 00 kee © "O-ebIIC mu sacitt oti dia interval 0,0) printtttse cer cifre din intervalul (0,44) \n"/b): printf (er): EElush (stdin) ; #/se wean buferal de a intavea stands (valoarea absoluta a numarului\ Gepaseste 22767\n"}7 otehart): Els > 32767) ff sereiacitirea intregulut 20.2. Sase sorie um program care citeste 0 suceesiune de numere separate prin cearactere albe $i aligeza ficeare numar pe eite 0 Finke. Numerele vive sint serise in sistemul de numeratie cu baza 6 (2 <= b <= 10). Dupa ultimul ‘numar se tasteaza sfirsitul de fisier. Numerele se afiseaza in sistemul de rnumerajie cu baza 10, Baza b este argumental programului din linia de comand PROGRAMUL BXX2 tinelude Hinelude Hinelude Hinelude “BxXx1.ceP* main(int arge,char ‘argvil) (ites socosone de num sens in baza bi fe afscazain sistem de numerals eu bea 10, ho lial mar tsa sisi de so 2b id. ( Ant beng: Aflarae != 24 Drintt ("basa de nuneratie nu este argunent in \ linia de conanda\n') exit): d jog = strlen targvitl) ieQng <2 || ing > 24 print£(*argument. in linia de conanda eronat: ts\n", Srgvitli: edie) } iffargv(2}(0] < *0" || argviti(ol > 19:16 printf (*aroumentul din linia de conanda nu\ este un intreg: s\n", azgvilli; exits , S€(ing =="2 84 argvit) {2} t= 0°) Drinef(thaea de mimeratie eronata: e\n*,argv(1}!: exit) ) 5 b= atoi(aray(1}); /feonveria bavi binae ittb <2 || b> 10 ‘peint£{*baza de muneratie eronata: te\n*,arav(il)s exiei) , fortrit AE(b s+ 10] Ing = bint (en) else Ing = bine (an,b) Tetdag) prince (*Bd\n" 0): else break: > 20.2.2. Corpul unei functii Corpul unci fancti este 0 instwetiune compusa. In limbajul C, 0 instructiune compusireste 0 succesiune de instructiuni care poate fi precedata de 0 succesiune de declarati, succesiuni care sint incluse intre acolade. In particular, © instuctiune compusa se poate reduce Ia o pereche de acolade. Acest uctu este adevarat si in limbajul C+. In plus, in limbajul C+ nu este necesar ca intr-o insinctiune compusa, declaratile a preceada insiruetianile Exemp fortint ist:i © a9;iey¢ 2. Variabila i se declara in antetu cictulu for. Aceasta declaraie este valabilé in Continuare pind la sfirsitul blocului (instructiunii compuse) care contine instructiunea for respectiva, Inserares declarajilor in orice punct al corpulvi unci funeti permite sa declaram variabilete locale atunci cind avem nevoie de ele, in felul aeesin se climin® situate in care se declara variabile locale la inceputul comput functiei care apoi ramin neutilizate 20.3. Tipuri predefinite in C si C++ [o cheie Dimensiune ntorvat ce — |" wenaichar [a aKa 4 | ss ar 8 | a =e (Saraas07 “aer (Dares az a aaa) : Cmiined is | pgasasy | amteniong | a ieaoemes) “fut | oa | astern nti = amememocwe | wg douse | [tema In cazul datelor Dotane (oat, dowbie 9 Tong pentru valorile absolute. | double) se indica intervalete 4 setepoanape Lot pone melts more mal sein. Poa tes modeler dak de tp pnt eee pe 32 de bi Dt plow asi preci det ee cle dei double psc de [Seite acl ep long double pvr de maxim 19 20.4. Constante caracter ipl int. Ea se reprezinta printe-un In limbajulC, © constanta caracter are tipul int rn ccaracter imprimabil inelus inte eataetere apostrof sau printr-0 seeventa sea veri 1.6.3.) : Inimbajul Cv ose de constant carter fe pul hare In afara de aces constante, in limbajul C++ se admit si constante carter care au tipul dt, Ele se reprezinta pe doi octei. Constanta caracter pastrata in C++ pe un octet. = sizeof (’a') areca valoare pe 1; are tipul char = Constanta caraeter pastrata pe doi octet i c ai ~ Oat mai putin serie pasteaz cod ASCH a if wnifieativ, codul ASCH al lui b. ave tipul int. + sizeof (‘ab') are valoan ‘ahe! - Broare, = Constanta earacter nu poate avea decit cel mult 2 ear Exereitii: 20.3. Sase serie un program care afigeaza dimensiunile in octet ale constantelor ccaracter's’si'ab’, precum si valorile octeilor pe care se reprerinta acestea PROGRAMUL BXX3 Hinclude > 8) 8 03701; , 20.5. Operatori COperatorit utilizati in limbajul C pot fi wtiizati si in limbajul Cr+ si aM aceleasi prioritali si asociativitate. Tabela cu priortatile operatorilor din limbajul C aa evifici 1 sagt def exndam abl expect peta nl psi limbajului Cr+ ste data tn paragrafil 20.5.1. Operatorul de rezolutie lefinita ca locala. El se ‘Acest operator permite aecesul la 0 data_globala noteaza prin Fie variabila é definita ca globala: si functia fin eare variabila se redeclara ca si locala void FL.) char i: Jn aceasta situate, o expresic de Forma serisi in compul functiei f;atribuie valoarea 10 variabilei locale ¥ declarata in ri vs global copul foretef em proecntsde opr evo Ci a evi ses jecesar ca isa fie Ou. a> 20.5.2. Operatorul adresa (&) In limbajul C operatorul adresa se utilizeaz’ pentru a defini ade variabite. Astfel, constructia: Snume Alefineste adresa de ineeput a zonei de memorie alocata pentru nume. In limbajul C+ acest operator are sio ak uilizare i anume aveea de a introduce pul referina aca fipal pointer se introduce prin constructia tip* ‘ipul teferinga se introduce prin: ta Tipul refering erceaza sinonime pentru name d datele de acest tip-pot fi foloste penta reliza apel referee), a Avind in vedere aceasta utilizare noua a operator &, se abisnuieste ca acesta Sd mai fie numit si operator de referentiere Operatorul unar * utlizat Ia declrarea pointerilor are in expresii un efect invers celui de eferentiore si de accca el se mai numeste operator de derefereniere. Censtructa tip & se utilizeazi in declraii de forma: ‘ip Samume; 7 ite. De asemenea, ferinta (call by Mentionarm ca pozitia operatorului & in declaratia de mai sus este variabili, adica declarafia de mai sus poate fi serisa ca mal jos tip & ume; pS nume, Uliima forma este cea mai uti Numele declarat in fel se spune ea este o te inijializa declararea ci, cu ae £. Ele reprezin cemplu, daca atribuim lui fo valoare: ntreg, i» asa; atunei si/ are (refera) aceeasi valoare, Variabila j de mai sus, este un alt nume cu ajutorul caruia avem acces la intregul pastrat in zona de memorie alocata fui 4 De aceea, expresile: anne see ‘au aceeasi valoare, De asemenea, aribuirea: jeanzsas, pastreaza intregul 12345 in zona de memorie alocata pentr i Declaratia: int & trebuie interpretata ca fiind procedevl prin care j se defineste a fi un nume sinonim pentru i. Acest mod de interpretare a declaratici de mai sus difera de sensul obisnuit al iniializarilor eare se fae prin declarati Variabilele referinta se utilizeaza freevent pentru a avea acees la zonete de ‘memorie alocate dinamie in memoria heap. 20.5.3. Operatorul de alocare dinamica a memoriei (new) In limbajul © se pot aloca zone de memorie in memoria heup folosind functt de biblioteca. Astfel de functi sit, de exempla, funciile malloc si calloc (W 88), In afara acestor fineti, timbajul C++ permite alociri in zona heap prin imermediul operatorutui new. Acesta este unar si are aceeasi prioritate ca gi celal operaiow tn Operatorul new ate-ca valoare adresa de ineeput a zone de memorie alocata, mora heap say zero, (pointerul nul) in caval in cave fw se poate fice alocarea, Operandu! operatorului new in cea mai simpla forma, este numele unui tip 1¢ (predefinit sau definit de utilizator Exemple: 1 int spine: pint = new int; Prin intermediul acestei expresii, se aloca in memoria heap, o zona de smemorie in care se pot pastra date de tip int. Adresa de inceput a zonei alocate se atribuie pointerului pint. Expresia: spine = 100; pastreaza intregul 100 in zona respectiva. ‘Acceasi alacare se obtine, in fimbajul C, folosind functia malfoe ea mai jos pint = (int *)mallec(stzeot (int): Prin intermeditl acestei declaraii(definitii) sealoca in memoria heap o zona ‘de memorie in sare se pot pastra date de tip int. Numele i permite referirea Ja intregul pastrat in zona respectiva. Expresia de atribuire: 190 - Pastreazd intregul 100 in zona respectiva. Zoncle de memorie alocate cu ajutorul operatorulu new pot fi intialiate {In acest scop se uilizeaza o expresie de forma: _new iplexpresie)_ unde: ip - Este numele unui tip. expresie - Este 0 expresie « carei valoare iniializeaza zona de memorie alocats prin operatorul new. Exemple: 1, double -pdouble; pdouble = new double(3.14159265); ‘Aceasta instructiune realizenza uematoaree: — aloca in memoria heap o zon de memorie in care se pastreaza valonrea 3.14159268 in flotanta dubla precizic, — adresa de neeput a acestei zone de memorie se attibuie variabitei pdouble. Goublek pi = ‘new double!3.14159265) Prin aceasta declaratie se rezerva, in memoria heap, 0 zona de memorie in cate se pastrenza valoares 3.14159265 in flotanta dubla precizic. Data respeetiva se poate referi cu ajutorul numelui pi. De exemplu, pi poate fi utilznt in mod obignuit in expres de form: sintpi/2) x°180/p3 tc. © alta utiizare importanta este aceea de alocare a unei zone de memorie, in memoria heap, pentau tablouti ‘in ncest scop, utlizim o expresie de forma: _ new tiplexp|_ unde: ep Este o expresie de tip intreg. Prin aceasta consteuctie s eap*sizeot(tip) octet rezerva, in memoria heap, 6 zona de memorie de Valoarea expresiei de mai sus, este adresa de ineeput a zonei de memorie rezervata prin operatorul new Inte tab tabsnew daubletm*n Aceasta instruetiune rezerva in memoria heap 0 zona de nr*n*sizeof{double) foctefi. Adresa de inceput a acestei zone de memorie se atribuie pointerului tab. Elementele unei astfel de zone de memorie nu pot infializate decit oumai pin seevenfe de program corespunzatoure, De exemphi, pentru a anula cele m*n cleniente de tip dauble rezervate ea mai sus, putem Folost instructiunea for de mai jos: Fortine boty d= mvnyieey tablS}=0.9: 20.5.4, Operatorul de dezalocare a memoriei (delete) (© zona de memorie alocata prin operatorul new se elibereaza prin operatonut delete. Dac p este un pointer spre rip tp "ps si p= new tip; atunci zona din memoria heap alocata cu ajutorul lui mew se elibereaza folosind construct: delete p: De asemenca, operatorul delete se ulilizeaz pentru a dezaloca tabloutile alocate prin new Fie alocarea: Lip *p~ new tiplexpresie}: Accasta zona se elibereaza folosind constructic de form delete [expresie “Mentionam ca expresia care defineste numarul clementelor tabloului nu este totdenuna necesara la dezalocare “Mai tirziu, vor reveni asupra operatoritor new si defete si vom indica situatia cond este necesara prezenta dimensiunii tabloului la dezalocarca lui 20 a pointer ia care se aplica al ap lea opernforul fan pointer nenul a cara vafoare a Fost bint ca rezullat al aplearit operator ew, tune eect aplcaitu delete este inpeviabi 20.6. Apel prin referinta (call by reference) Inlimbajul C apetul se face prin valoare (call by value). Acesta devine prin roferinta cind parametul efeetiv este un nume de tablou (vez 4.15). De asemenea, apetul prin referina se poate realiza cu ajutorul pointerilor (vezi 8.2), in capitol 8 sint date o serie de exerciti care ilizeaza pointeri pentru a ealiza pel prin reerinta (ex. 8.1, 8.2, 83, 8.6, 8.7). Ir limbajul C++ se pot utiliza toate faciitagile amintite mai sus eu privire Ia apelul functiilor. In plus, s-a inteodus apelul prin referinja, Avesta se realizeaza prin intermediul parametrilor de tip referinta ‘Exemplul devenit deja clase pentru explicarea apelului prin referin este cel al fancfiei de permutae a valorlor a dowd variabile Fie funetia perm defini ea mai jos: void pormiint xine y) t 1 viyeu 5 ‘Aceasti functie nw are nici un efeet asupra parametritor efectivi de la apelurile ei Intr-adevar, perm(a.bl: Apel ind prin valoate, se atrbuie parametrior formal x sy varie lui a si repecti b. Functia porta valonte parametrlor formal x i y dar aceasta petmttare nu are nici un elect asupra paramettilo eectvia sib Tentru ca funeia sa pemmute velorile parametilor efectvi este necesr st se realize apelul ambilor parametr prin refrin In imlajul C (Gi doc iin limbajul C+) este posbil si realizam aces om folosind pointeri, ea mai jos: void pperm( int *x,int ty) 2 ; a bye In acest caz, functia pperm se apeleara astfl: pperm(sa, sb) Prin acest apel se atribuie pointerilorx siy adresele paramettilor a si respectiv 'b. Funetia pperm nu permuté valorile pointerilor x si y ci valorile intregilor spre ‘care pointeaza cei doi pointeri, adica chiar valorile lui a sib In limbajul C++ se poate defini functia de permutare ou parametti formali de tip referinta: void rparm(incs x,intk yl c ‘ a Functia rperm se apeleaza ast: Ane a,b: epern(a, bh Im acest caz x iy sint sinonime cu variablele a si respectiv b. Aceasta inseamna ca x gi aeceseaza aceleasi date din memorie ca si a gi b. De aceea, permutarea valorilorreferite de xsi y inseamina permutatea valorlor referte de @ sib Comparind functile perm si rperm observim ca ele se apeteaza Ia fel gi singura diferent dinte ele consta in modul de declarare al parametritr formal {In cazul functiei perm parametri formali sit date de tip int, iar in eazul funeiel perm acest sint referinte la date de tip int Exereit 204 Sase scrieo functie care afiseaza caracterele unui tablou si citeste un intreg de tip int, Funetia are doi parametr text: + Tablou unidimensional de tip earacter si care are aceeasi ulilizare ca in exercitiul 6,3. ” = Parametru de tip referined la intregi de tip int, Numaru! citit se pastreaza in zona de memorie alocata parametrului efeetiv corespunzator lui x. Funetia returneaza valoarea zero la intilnirea sfirsitului de fisier si unu i contrar, ‘Aceasti funetie este analoga cu functile definite in exercitile 6.3 si 8.2. 2 tn eazulfnctc din exert 63, puma cits aibue varia lobale vin fat fit exereil 82, pstenza numaral eit m zona de ‘ort spre care potteaza parame oral x dep pointer. “Ch alte cuvinte,aceste funeti sint 3 variante pentru a citi un intreg de tp int upa'es i ponabi ee afgcaz un sir de caractre. Funetia defini in exer dace ena anre utlizaza 0 vartabla global, cea din exert 8.2. ese cosets at funia defn mai jos este arian e paramet de ip refer (ape prin esi) FUNCTIA BXX4 ine reit_tnticher text(],10té x} saiseaza srl de camctere see car pinta Yxt, ‘Gest un inieeg st paste n-ne de memoreslocataparametalefeetiv forester In x: 1 aii fsa de isin, Tale ” ( char ¢(2951; fortis) eine (eer); TEtqate(e)==0) return 0 iftescant(e,"ad*-@x)==3) return Ty , , Observaties Funetia de fata seapeleaza prin apeluri de forma: [Ebreitine ene ny oo else i/satasia EOF Parametrul x este sinonnim cu 1 yi de accea Ia apelul funotiei sseanf, expresin Gx inseamna dm, 20.5 Sa se serie o fimetie care citeste un intreg de tip int care apartine unui interval dat. ‘Aceasti finctic este analoya cu functia definita in exercitiut 8.3. Ea foloseste ‘un parametru de tip referints in locul parametrului de tip pointer pint al functiei din exercitiul amintit mai sus. FUNCTIA BXXS sae voit int michar text(),int inf,int sup, int & rint) 2B 1 alscara stl de caraelre spe eat pont text siteste un ine dtp in ee apartine inevallu itu si: paseoza in zona ds cmon alocatnparantuli efstivcorespuzator Ii rit 1h nile frit de isi alte, c fortis Lrtroie_int(eexe,rint)=20) return 0; (saint EOF Lt(eine >= infwarint <= sup) return 1 peintl(+intragil tastae ay apartine intervalulud:"); print (*[4¢, 4a) \n", inf, sup} prinvt(tse reia citirea\n'); 2066 Sa se serie o functie care citeste o data calendaristica compusa din zi, una sian. Punetia valideaza data calendaristia respectiva Aceasta funetie este analoga cu functia definita in exercitiu! 8.4, Deosebiren Hirelude ‘brxS cpp" font cit it im Hirelude *beiS cpp" fonetis .calend Finelude "byi6-epp” #finetia zidinan Hinelude "bex6epp* 1 fumctia eit dts cen Finelude "oe? vepp* /funtatuna si ua int areilet) = (0,31,28,31,30,31,30,31 0,31, 30, 32) satel) Feet o dtaeaenarisicn, o aldo sin cuca este corel, siigenza dita cali urmatoar 25 ‘ int 22,1190: ‘i iteste si validean data eae ittreit data calendize, 11, aa) itfees=31estie=i2) ( +3 dscembrie; zua urmaroare este 1 fanarc ia anal urmator*/ seeli Lance fi 2at+2 snl urmator ) else Hse determina 2a urmatoate Fluna_si_ziua(2i_dinan(ze,11,aa)+1,aa,e2,11); 1 fica data calendars all urmstoare printf |*ziva:td\cluna:ta\anitd\n", 22, 11,aa) 20.9 Sa se serie o functie care citeste: = valoarea variabilei m de tip int; = valoarea variabilei m de tip int: ~ m*nnumere care teprezinta clementele unei matrice de ordinul m*n, Funetia de fata este anatoga cu functia definita in exerci 8.6, Ea foloseste parametri de tip referinja in locul parametrilor de tip pointer. FUNCTIA BXx9 : int rdcitmat (double dnat{|,int max, inté melin, P*stestepe mama de ini fn mumar de eosin sta - mumere de tip double po retursazavaloten men ‘lar lx mse pastes in 20 refers dealing + vloarea lin so pstraza in zona lesa de nrc! c char ¢12551; Shar orl) Mens je necol) le pasroaza in matrisn dat pin tina; of Ise Gites valoie lui msi Ieiteste pe if(reit_int_Lim(*ounarul de Liniie*,1,max,nelin) printf ier} exit (i) , ieiteste pen Af(reit_int_Lim(*nurarul de coloan printé (er! exieilyy A max, neo) 26 jenrlintarcel SeGi <= max) break: print i{*produsul an ta depasesste: ys evie=tel\n i maxt printfitse reiau citirile let m si ant: while (1) 1 sectes ole me clomente ale mats astate pe ii i Afladeie(idnae) '= 40 ¢ printé(ny e-au tastat ad elenente\n®, i); exit): 20,10. Sa se scrie un program care citeste elementele de tip double ale dowd imatcice sib, calculeaza produsul lor sil afigeaza. Acest progran este analog cu cel din exercitil 8.7. In cazul peogiamului de fat se folosese funeti eu parametri de tip referinta in Tocul funetiior ev paramet de tip pointe. PROGRAMUL BXX10 linelude Hinelude ) Printf(-ditera de munarul Liniilor “I; peintflemateieed betc\n",p) eae(lis 1 sealer prs e239 tor listsiengiest for (320) t Le for fkeOjkeonskre4 er) re alae] *btkest iD sie)! prinee(e (4d, Sd) oS8q *i,5-60D99 1) Ttjaae=31 fsa 4elemente pe ind Eve dua bie printf (ssetLonati 9 tasta pent a cont inwa\n*) gece) 20.11 Sa se sctie © funetic care pastreaza un sir de caraetere intt-0 zona de _memorie alocata in memoria heap ew ajulorul operatorulut new, Functia relumeaza adresa de inceput a zonei in eare se pastreaza sirul de caractere ‘sau: Zero (pointerul nul} in eazul in care nu se poalerezerva zon respectiva in memoria heap, Aceasta Tunetie este analog cu funetia din exercitiu! 8.15. Aceasta din urma utilizeaza finetia malfoe penteu a aloea zona de memorie heap, FUNCTIA BXX11 Aetehae ‘un * posi i memories do eaeatere pre Tet (pene chart str pointe 87 ntstea)) '=00t pans ca valoute aon dene zn ce mama eer in noi hep ete ate kn) tei irepy ibys)» -iereasial n nema ep 28 ease eeturn 0; aus putatreorva zona in memoria sep 1 20.12. Sa se serie un program care citeyte o succesiune de cuvime si- aligeaza pe cel inai mate. AAcest program este analog eu cel din exercti 8.16. In cazul de fai, 8 uilizsaza operatorul delete pent eibera o zona de memorie din zona heap spre deoscbire de programul din excriful 8.16, care uiizeaz in acest seop feta free PROGRAMUL BXX12 Binelude Ninelude “mec epp* mmensie define MAX 100 ming) ites ceived eins aiseaza pe ee ma mare“! fl char euvert (MAC Chae Seuvmaxel; poineaza spre cuintl maxim wh Le(ecané ("#L008" ,cuvert) 1-807) LE teuvmaxe=0) pra ce CCuvmexe-nisemair (euvert) else : if (strompleavert, cuvmax =0) ene ese mat mar Sci cel din memoria heaps spre eae pointeaza cava delete cuvewn, se liberora mona di menos heap 56 patrcaza vital ci cer memos bey ‘cavmanenmensir leuve 1 peint£(*cel mai mare cuvint este\n") print £(*ts\n",comex) + } 20.7. Functii care returneaza date de tip referinta Lh limbajul C++, 0 functie poate returna o seferinga la o data de un tip oarevare, In acest caz, rp din antetul unet funeti are forma: tps Exemplus typedef struct ( Souble %: 29 double y y cout Goubies re = retreal (a); Soubles im = retimagtz) + Funetile retreat si retimay retumeaza referina la pi imaginara a numarutui comples 1 reala si respeetiv cea Ele se definese ea mai jos: Goubles rotreal (COMPLEXE ©) c ) Goubles retinng (COMPLEXE c) t ) funetie care retumeaza o referinta poate fi apelata atit in dreapta semnului ‘egal cit sin stinga, Un astfel de apel este un operand atit vale et i rvalue (vezi 87). De exemplu, functiite reteal si retimag pot fi utitizate pentru a initializa ‘numirul complex > din exemplul de mai sus, seriind retreal (2) = 1; . retinag(s) = -3 Prima instructiune are acelasi efect cw atribuives exe int cea de a dows, cu atribuirea: Rye Evident, atribuirite de forma 2.x =... $iz.y=... Sint operatii simple eare mu se Justfica a fi inlocuite prin atribuii in care se apeleaza functiile retreal si retimag, Astfel de apeluri se utilizeaza in cazul in care funetiile apelate reprezinta procese dc caleu! mai complexe. Apelurite funsilor care returneaza referinga, find operanai de tip value, lor 4i se pot aplica operatorii de inerementare gi deerementare. Astel, insttuetiunile vecreal (2) sint corecte si ele inerementeaza partea reala a lui = Principiu, apetul unei funeti care returneazs o refering trebuite considerat casi cum ar reprezenta un mime. — De exemplu, reteai(a) ext Fie tput: echivalent eu nunele ealifieat 30 sya struct ( Gouble sea: yee sidectaratia: Pentru a ne refer ka componentcle x iy ale datei nve se utilize califcat aa mumele rire. 2.x pentiu partea reali si nee. t-y penta partea imaginara, De exemplu: nre,z.t = 3 nrezy = 4 ee definese pirtile reall si respectiv imaginara a componentei + a datel structura Acclasi lucru se realizeaa folosind urmatoarele atribuit sau daca consideram declaratia: COMPLEXE ve = re. tune aeclensiatrituiri pot fi sei pre.vetreal (r=) = 35 fee retinagtr) = 4: Exercitii: 20.13 Sa se serie o fanetic care enleuleaza modulul unui numar complex si retumeaza ¢ teferinga fa el ‘Accasta funotie este analogat cu cea definita in exercitial 10.1 FUNCTIA BXX13 ee teal emu conpcx siren rae et ‘ ) 20.14 Sa-se serie functie care caleuleaz argumentul unui numar complex yi 3 returnesza o referin la el Aceasta fae este anatoya cu eca efinita m exerci 1.2 FUNCTIA BXX14 Goublek rarg COMPLEX 2) * caleuleava argument umarai complex si retumeazao eens Ia el */ static double a; Tete.x 90) reture else” iy=psin 0) rerurn a=pr/a else return as(l*e2)/2; xis siy!=0 atatan (zy! eo) 4 Tete <0) ff xeOsty te iciny <0) th>Osyeo Foturn 9e2"PIva Observativ: Variabila aa fost devtaratastatica din eauza ca fntia returneaza o relerinta la ea (se utilizeaza instruetiunea return a.) Daca variabila a ar fi fost automatica, ea Sar fi alocat orelerintt laea nuare sens, deoarece la revenitea din fu stivei si deci variabila a este dezalocata stiva, In acest exz eface curatires 20.15. Saseserieun program care citeste numere complexes leat cu modulul si argumentul Hiecaruia, PROGRAMUL BXX15 waLimpreun io.h Sinelude mati he faofine Pr 3,14is9265358979 typedef struct ( Soule x double y HeOMPLEK: 32 include “bee cpp? mod finelude "brxl4 cpp" are sain) ‘> ieste numere complexe sie afissaz impreuna cu modulus argumentlfcearuia 7 t whilo(scant ("416 $16", gcomplox.x,ucomplex.¥ printf (arib-’ged* (eq! \n", complex.x, compLex.¥) peinté (modul=tg\targ=¥a\n" rodul (complex Ferg complex): 20.8. Modificatori Mocificatori sint cuvinte cheie care se uilizeaza in declaratit sau definitii de variabile si functi, Cei snai folositi modlficatori utilizai la definirea functilor sin: deel, paseal, near, far si huge ‘Sensul acestor modificatori este amintit in paragraful 20.2. iin acest paragraf amintim modificatorit utlizati mai freevent in legarura cu vatiabilale . Acetia sint const, near, far si huge. 20.8.‘. Modificatorul const In principin, modificatorul const se utilizeaza in definifi sau declarafii pentru defini date constante. CCuvintul cheie const trebuie considerat ca modifica tipul unei date restringind modul de utilizare al datei respective. a “TI i, ewvintul const precede, in dectaratie,tipul date, Exemple: 1, const int versiune = 3 2, Gonst double pi = 3.14259265358979. 3, const int xeif() = Cat tbt tet ase 2) Dale declarate.(¢ef ateibuit deforma: st fel nu pot fi modificate direct, deci versiune = 4: pi = 3.14159; reif(O) = 'A%s 3 sit crate Into dela (deni) in eare se uilleaza modiintoal const, se poate amit pul. n-acestcxz se subintelege tipi Aste, constanta declarata nas jos fat an = 1995, are tipal int Modifiestonul const are utilizari importante mai ales in le (O constructie de forma: uc cu pointer const sip *nu defineste un pointer spre o dati eonstanta. De exemplu, Tie declaratia const char ‘air © tabe*s atribuirile de forma: " “un nam sioieeny = oR ete sint eronate. ( constructie de forma’ sip *eanst nume = 5 dlfineste un poonter constane spre o data eare nul es De exemplu, fie declaratil: ~~ 1 constant cher teonst peir = “abery char te const char ‘sir Atunci, o atribuire de forma: este coreeta, dar: pair nu este acceplata deoarece psir este un pointer constant, in schimb, atribuirile: Sipsirea) = "Bt stpairea) = e+ sinteoreete Este posibil si se defineasca un pointer constant spre o data constants. In acest cop se ulilizeaza o deelaratic (detinitie) de form const sip *eonst mune a4 De exemplu, fie deelarayia onst char *eonst atribue = "TEM Pe In acest eaz, atruet este un pointer constant spre um sir constant de carnetere, ‘Amintim ca modifieatorul const se utilizeaza Freevent la declorarea para- imettilor formali detip pointer pent a interzice functilor respective modifican datelor spre care peinteaza parametritrespectiv ‘Asifel de parametri se intilnesc, de exempl, la funetiite de pr sirurilor de caractere: unsignod strlen{const char *3) Char sstrepy (char ‘dest, const char ete. Funetia strlen au poate modifica data spre care pointeaza s, In mod analou, functia strepy nu poate modifica data spre care pointeaza sursa. Mollficatonul const poate fi tilizat si pentru a proteja a data returnata de o functie De exemplu, fanetia de mai jos returneaza un pointer spre un sit constant, ceare nu poate fi modificat in mod accidental (direct) const char *denluntint i) mrtuneara in pine a denne ana c static cons: char ‘tall! = (lune tlegala®, “lanuacie®,...,*decenbrie"}; return(i 22)? eab(Ol : tab{ale 1 Protectia datelor obtinuta cu ajutorul modificatoritor const mu este totala, Intr-adevar, daza vom considera declaratile de mai jos: const char *3ir = “abe tunel o atvibuire de forma: este eronata deoarace sir sis sint pointeri de tipuri diferite: "sir este un pointer spre 0 data constantd de tip caracter, iar s este un pointer spre o data de tip caracter, In schimb, o atribuire de forma: = (char ‘six este coreeta, In continuare s pointeaza spre acceasi data a si sir Cum 5 nua fost declarat cu ajutorul modifieatorului const, recults ca atribuirile de mai jos sint Legale: tesa wet) = 8 35 visi = ¢ Jn felul acesta, data "abe", protejata cu ajutorul modificatorului const, a putut fi modificata cu ajutorul pointerului s. O modificare de acest fel se spune ef este omodificare indirecta. Modlificatorul const nu permite modificarea direct a datei, adica modificari Ue Forma: seire) stsired) in_felul_acesta, modificatorul const protejeaza datele impotriva unor ‘modificari ditecte care pot surveni in urma unor enor 20.8.2. Modificatorii near, far si huge Acesti modificatori sint specific} limbajului TURBO C++, Ei dau posibili- tatea utlizatorului de a defini explicit dimensiunea pointerilor: 16 sate 32 bit In eazul limbajului C, modelul memorieé (tiny, small, ..) determina formatul inter al pointerilor In C++ se pot folosi deelaratti de forma Lip modificator *nume;, unde: modificator Moditicatorul near specifica faptul ca pointerul se reprezinta pe 16 bit Ceilalti modificatori forteaza reprezentarea pointerilor pe 32 de bit Utilizarea acestor modificatori poate conduce, uneori, Ia economic de _memorie si de timp calculator evitind lucrul eu pointerii pe 32 de biti cind acesta ru este necesar Diferenta dintre modificatori far si huge se manifesta la calculele eu operanzi de tip pointer. Operatile cu pointeri de tip far pot conduee uneori la rezultate eronate spre deosebire de cele realizate asupra pointerilor de tip fiuge, operatii care se efectueaza (otdeauna coreet, dar sint mai costisitoare in timp, Acesti modificatori nu sint necesari pentru programe de dimensiuni retativ miei si care nu utilizexza volume mari de date. Programele din volumul de fata se ineadreaza in aceasta categorie i de accea hu vom utiliza avesti modificatori in exercitile care urmeazs, © exceptie de Ia aceasti regula o constituic funelile standard pentru gestiunea graficd a ecranului care implica modificatorul far ~ Este uml din cuvintele eheie: near, far sau huge. 20.9. Cuvintul cheie void Cuvintul cheie void are diferite utilizari in functie de context. O prima 36 Utiliare a lui void este in Jegatura cu functile care nu retumeaz 0 valoare la revenirea din ele void numet..) ot in antetul unei functi se poate utiliza cuvintul void intre parantezele care ‘urmeaza dupa numele functiei In acest caz, void indica fap paramete Ulizarea lui void penira a indica absenta parametrilor nu este obligatore. In schimb, este obligatoriu ca void s@ apara inaintea numelui functiei cind aceasta hu raurneaea o valoare. Aceleasi reguli se aplic sila prototipul functor. Exemple: 1. void €(vaid) Funetia fu are parametri si nu retumeaza o valoare, 2. voia gins Funetia g nu are parametti si nu retuneazi o valoate, Oallta utilizare a euvintului cheie void este aceea de a defini un tip pointer universal: ‘Un pointer spre void nu are tipul precizat, Un pointer spre un tip precizat se poate atribui direct unui pointer spre vo Fic declaratile:” tp *Ds void ¥py; unde: ip - Este diferit de void, In acest eaz, 0 atribuire de forma este corecta Inschimb, atribuirea inversa, adica: by este eronata, Astfel de atribuiri se pot realiza numai folosind conversii explicite, ea mai jos: P= (tip -ipy. [Nu se pot face operafii cu pointeri spre void. Deci, expresiile de forma been 37 sint eronate, Pentru a putea face operatii cu astfel de pointeri este necesar a se foloseasea conversii explicite: (int py oa (double *}py-n ete. In general, se vor evita astfel de operat deoarece ee pot conduce Ia ero 20.10. Structuri In timbajul CH se pot defini tipuri noi folosind deelaratia sruct ea in limbajul C(vezieapitolul 10), De asemenea, se pot atibui nume la tipuri predefinite sau definite de Ltilizator folosind constuetia spedef Pentru tipurile definite cu ajutorul Iu struct putem defini date ea mal jos struct mune { ): : struct mime mumel prume2yui . In limbajul C+ mu mai este necesard uitizarea fui struct Ia. declararen structuilor nue, nume2, de tial mime: Deci, vom serie mai simp ume name, named, unde, ume - Ete tipulutilizator deinit print-o construc Jn fetul acesta, in imbajul C+h, mu-mai este necesara denumiten tipurlor structurate (definite ei ajutorl lui src) prin inermodinl constrcish pede in limbajal C=+ o strutura poste fi trinsferata direct prin paraietr. Aste, «daca avem dectaraia € struct ea mai struct nume { k atunci datele de tip nume pot fi transferate prin parametri in 3 moduti ~ direct: tip fi(nume par) [ ..} pointer spre structura: tip 2(nume *par) ( .. } referinga la structura: tip f3(aumes par) { .. ) 38 ate elurna o Structural, un pointer spre siructura sau De asemerea, ¢ fune + returnea7o data de tip nume: = numme *22(..) [= ] = retumeaza un pointer spre o data de tip numes = med g3(} fo.) =retumenza o refering lao data de ip nue ect una ate, Fie: rune 91,02 Atunei ateibuirea: este légala 20.11. Reuniune In limba se poate reali +1 fata de limbajul C, reuniunite pot mai pentru prima componenta ae Exemplu: double p w= (.24159265388979) _- Cuvintul ution poste fi omis In declararea datelor de tip reuniune. Asifel, fiz declatata , Bloat # | gouble a: » In continuare se pot declara, defini, date de tip altermative ca mi jos © alta facilitate existenta in CH este pos de a utiliza seyniuni anonime ca $i componente intf-0 structurd. Aceasta permite accesul mai simpht Ia componeatele structurii Exemplu: struct { 39 Reunjunca, componenta a structuri a, este anonima, La componentele ei ne roferim ca mai jos aim 1234; a= 3.14159; ad = 314159265 20.12. Tipul enumerare In limbajul C++, tipul enumerare se defineste ca in limbajul C. Cu toate acestea exista unele diferente. Diferenta esenjiala consta in aceea ea in Limbajul C++ se Fae teste asupra valorilor care se atribuie unei date de tip enumerare. De accea, la 6 data de tip {enumerare se pot atribui numai enumeratorii (gomponentele) ei, Exemplu: Fie declaratite: ‘enum sopt Qunisi marti ymiereu ol, vinwri, sinbata, Quinton) ; Expresiile de mai jos sint legate: iffziua > luni 66 2iué else Hide olihea winersy In C+, 0 expresie de forma: este eronata, desi conform declaratiei de mai sus, marti are valoarea 2 Enumeratori sint de tip int. Ca si in cazul structurilor, cuvintal enum poate fi omis ia declararea datelor de tip enumerare, a Astfel, za se poate declara mai simplu scriind 40 20.13. Supraincarcarea functiilor In limbajul C, functiile utilizate intr-un program au nume distincte. In limbajul C=+ exista posibilitatea ca funcii diferite sa aiba un acelast "De abies fi nite print Cazurile cele mai freevente de functii cu acelasi nume sini functiile care realizeai acelasi proces de calcul dar asupra unor date de tipuri iferite, De éxempla, in limba C exista funeti in biblioteca sstemului, eu nume distinete pentnt caleuil valor absolute abs - Pentru calculul valorii absolute a unei date de tip ut labs - Pentru caleulul valorii absoluve a unei date de tip Long. Jabs - Pentru caleulul valorii absolute a unei date de tip double. ‘Acaste functii au urmatoarele prototipur: Spt abs tine) + Yong labe tlong) aousie fabs (double! Prinele dous prototipuri se afla in fsierul sudib. A, iar eel de al treilea in fisierul math i Tin limbajul C++, aceste functi pot fi mumite cu un acelasi nume, In acest caz, cle xe disting prin tipul parametrulu. Asti, ic limbajul C++ este posibl sa dafinim acoste 3 fometi eam jos: Line abstine n) (return a <0? -n im) 2, long abstiong a) (return < OL? -n ar} 3, double abs (double a} { return a < 0.07 -n mF La un apel de forma: x= abs(expresie)s compilatorul C++ apeleaza una din cele 3 funetii abs definite mai sus, ginind seama de tipul parametrului efectiv, adica de expresie dintre paranteze, Astfel, ‘daca expresie are tipul it, alunci se apeleaza functia definta la punetul 1, daca ‘expresiz are tipul ong, atunci se apeleaza functia definita la punctul 2, iat daca cexpresie are tipul double, atunci se apeleaza functia de ta punctul 3. In felul cesta, mimele ahs reprezinta 3 functii pe care compilatorul le poate distinge, fa ape, dupa tipul parametrului efectiv. Se obigoieste st se spund et cele funei supralncared mimele abs % Tn general, un nume se spune ca est commun pentrs mai multe functi spre functile cu acelasi mume vom spune ca sint supraincarcate (Bunetions overloading) at La ora actuala exista incetatenit in limba romana si ali termeni pentru supraineiteae, cade exemplu, suprapunere,redefnie sa supradefinine In aeeasa carte adoptam termenul de supraincaeare © condite csentiala pentru supraincaccarea finctillor este ca cle sa aiba protoipar diferite in eaz contra, compilatorl mu poate face dstnele int ce, Taapelul lor. In princi, numarul si tipal parametrilor efectivifmizeaza un eriteriu de selectc al funeilorsupraincarcate, Avind in vedere acest fap, re7ult cata apell functor supraineareat, de bicei, nv se mai aplica regula simpla de conversit a tipurilr parametilor efeetivi spre tipurile parametilor formali corespunzater, regula atizata tn limbajal C se pot aplica conversii daca mu exist coincident inte tipurile Parametrlor efectivi si cei formali eu eare se corespund. In limbajul C++ se incearea selectarea acelei functii pentru care exista oincidenta intre numarul si tipul parametrilor efectivi (de la apel) si al Parametilor formali ai fumetei supraincareate. In eazul in care use poate stabil @ astfel de coincideni, se fae si in acest eaz conversii ae parametilorefectivi, ‘Aceste conversii pot sa nu Tie unice side aceea sint necesare reguli suplimentare De exemplu, reluind apelul de mai sus. x=abs(expresie), . unde expresie ae tipul float, se abserva can se realizeaz oincidenta eu tipul pparametrului formal al niet uncia din funcile eae suprainearea numele abs, De aceea, in acest caz, se va face o conversic a valori expresiei de la apc. Sint Posibile 3 conversi Etoat -> int float => long Hone “> aoubte Inprincpiv, se aleg conversi care sa nu condhuca Ia pierderen de informatie. De aceeaincazul de ft, sintexcluseprimele dout eonvers La un apel, selectia functici se realizeaza in mai multi pasi si in ordin mai joe de 1, Se cauta o corespondenta exacta si se apeleaza functia respectiva daca ea exist, 2. Daca mu se ponte determina o functie cu coincidenta exact, atunci se cauta luna pe baza efectuarii de conversii predefinite (pentru tipuri predefinite) care ‘nu conduc la pierderi de informatie, adica se fue conversit Fira trunchicri 3. Daca nu se poate determina o functie conform punetelor precedente, atunci se inecared selectarea une’ funetiifolosind conversi pentru tipuri predefinite ate pot sa conducd la trunchieri (de exemplu, date de tip double se convertese in date de tip float, long sau int) 4. Daca in pasii precedenti nu se poate determina funefia de apelat, atunci se 42 ccauta o Finctie admitind conversit nu numai pentru tipuri predefinite ci si pentru cele definite de uilizator {in cazul in care nu se poate selects o funetie wnied parcurgind in ovdine past «de mai sus, conpilatorul C++ semnaleaza eroare, Mai tirziu, se va reveni asupra problemei apelurilor functilor in legatura eu cconversia datelor de tip utilizator. suprainearce numele modul cu functii de calcul a valorit absolute pentru rumere intregi si neintregi, iar pentru oumere complexe se va calcula module FISIERUL BXX16 int node! (inet) sretumen t return <0 , ‘asta absolut Ii ong madui (Long m) stuns valorea abso a ha c , Goublo modsl (double a). //rtumeiza valoarsn absta ahd c return d<02 -d: ) cypedef struct { Soubie ss double y; y conPLEK: Gouble modat [COMPLE 2) i! eturneaza modell In 2 ‘ return scrt(z.x t g.xtzy * Boyt ) ong double modul {Long double 1d} /frewreaza valonrca absoleta a uid ‘ return 16< 00? “ld } 20,17 Sa se de‘ineasea functi supraincarcate eu numele afiseaza, care si aligeze ‘numere si siruri de caractere, Fonetiile av unul sau mai multi parametri, Primul parametru defineste rnumarul de afigit, Parametrul al doilea, daca este prezent, defineste dimensiunea ma a cimpului in eare se afigeaza data. Data se afiseaza cadrata in dreapta si B 1 | | ‘eventual este precedata de spat Parametrut al teilea, daca este prezent, indica numarul de zecimate in cazul numerelor neisitegi sau numarul de caractere in eazul in care se aliseaza sinuri de cearactere FISIERUL BXX17 char *format(const char *sl,const char 82) void atisouza(ine Sint ekmp . atic slot inci de dense minima cya ev inp 7 sir © tormat(-$*,cimpts Biz = comme tsiz1,"d) prince (siz); Selete sir: ) void atiseaza (Long 1,int cimp = 10} 1 char *sir, tir 1 salto Hs elnpal de dipensiuge minima egal ev eienp*/ sirl = format ("#*-cimp! sir» forme(airi,"ld} rants ars) Qelete shes delete sith , vaid ativeaza (double 4, int cimp = 15,int precizie = 6) Pats aloes hid cpl de dimesiune mina pals eu cn teu pei deiita de precizi #7 fi char ‘sie, tir tsiz2,-obe3 Sir] © format ("$+ cim) Bird = tormae(enrds tlt Sid « format (eir2,precisie); Sir = fornavisizs, "a" prince (eir.al delete siz?) Selete sir)| } void afinenzallong double 1f,i8t cimp = 18,int precizie = 6) 2 aos loan i in emp de densivne mii 44 sh cw imp sou pena definta depecizic *? ‘ chor ‘oir, teirt,* 22, reir shel = formae(*e*.cinp); fied = format (sizi, ts") fir] = formet(sird,pzecizie) fir = forme (sir3,"la") printf (sir lf) delete sir: delete sirl delete sir2: delete sink: ' void afiseazs {COMPLEX 2, int cimp = 15,int precizie = 6) 2 atsezea marl complex 2 in copa ci si eu precivia dfinta de precizie *! ‘ char tate! sir > fornat(-¥*,ciap) Sir = formactsil"."h7 delete sir; fir = format (eirl,precizie) ; delete eizt Hird = formacisir,-g delete sir; * scl = format (*Partea reala = *,sir2): Slr = fornatisirl, Partea imkginaze = delete sirl plea = fornat (sir, sir2): prince (aiei.2.x,2-9)! delete sir delete sir2 , void afiseaza (const char ‘2, int cinp = 70,/int precizie = 10) atisaza sil do carters spe ate pinta siate-un ei de Tgime minim egal eu valores i ip seu peceza cya eu pecizie*! cl shar sir, tetra, tsie2, sid: srl = format (*t*,clep): Bed = format isirist.*): Sir} > format (sir2,preciziel ; Sir = formacisirs, "5°); pinefisir,s! Jelete cir: Belete sirl delete siz yeleve sir; 45 char “formaticonst char ‘s,int nl contests un sipin concatenate casero spre care poiteaza seu cle rezaltate prin conversa Ii nin Zeina Srl zl se pastauza in memoria hoop." cl ‘char zona (101; itoain, zona, 10) return’ format (e, zona) ) char *formst(const char *61,const char +22) "consist un sr prin concatenate sir spe cae pinteaza 2 la fist iii speeearepointeza 7 ‘ char ne, nem = new char(strlen(si)+strien(s2}+11; strepy (mem, £1) treat (mer, #2) ) 20.18 Sase serie un program careafigenza modulele numerelor itite de la intrarea ‘standard. . PROGRAMUL BXX18 . Hinclude <2talo.to Hielude Hinolude estring. he Hnelude Ainelude “BRX16.CPP* /functiesupsincareats mod include “BxX17.CeP” _/ futile sopaineareateaiseaza raint) /*afiscaza module numereor cite de intare standard */ ane ts char cont (| char intreg_int{] = "\nint="; char 125817 forti:l | fortia) afiseaza(intreg_int, strien(intreg_iat)} Le (gaes(t)e=0) exit (1) iffescanf(t, "$d-,6i)2=1) break; afiseaza(*ns s-a\tastat un intreg*,10) afiseaza(*se roia citirea intregilor\e") ; d afiseaza(*\n\n\e\t tip ine\n\n*,10}7 46 st\n Actionati 0 tasta pentru a continua\n*y at.seaza model tL) af -seazateont,50) Osten; Sfiseaza (‘Alt int? Se raspunde cu D eau N*) Effie = getehQ) i= 'D! kee fe '2") break: fish for pea in char intron long{) = *\ntona=s ong 1 fortsit | fers) af iseaza(iatveg long. 10); Se(@ersit) == 0) exitt); Sf taseanf (t,'#10" 61) == 1) break: afiseaza (tae s-a tastat on intregin‘ 1 Afiseaza(tse relia eitires intregilor*} , af.seazat*\n\n\e cip Leng\n\n" 10) ‘afiseaza (nodal (L1}7, bf seavateont, 50! Getcht): Bfiseoza (‘Alt long ? Se raspunde cu D say N“) Life =getch()! t= 'D! age = “d°) break: ) dss for penta tong char fotant_simplul] = -\nflotant sinpla preciaie char reli] = "se rein citizen nunarului\n” Float f char eri] = ‘na sa tastat un nunar\n fortis! ( fortiay af iseaza (Flotant_siaphu, 10) Ltt@ers(t) == 0) exit); Sf tescant (t, "WE" KE) == 1) break: af iseaza(er 20); atiseaza(rel, 10) , afiseazat*\n\n\c tip Goat yan, 101: Stiseazatmodal (£4) ‘sfiseaza cont 50) pete? Bfseaza(*Alt float 7 se raspunde cu D sau m") EfMfesgetchi}) 12 "DY ae © t= 'd") break: ) ffi fe pen Mas char flotant_dublu[) » *\nflotant dubla precizic double 3: forGinl ¢ fortis! afiseaza(flotant_dublu, 10); Tttgeestt! == 0) exit) a ) break: SE ((e = geten(l) f= 1D ak e t= 1a") break atigeaza er, 10}; 1 ds fo ott con s#iscaza eal 10} , ) afisenza(\n\a\t tip double\n\n", 10); Onservat aL Lseaea modal (db 25, 16) { afiseaza {cont ,$0} 1. Funetiile supraincareate utilizate in acest program sint: | getcnty agfeazay 1 sis pa Se modi Ele so selecieaza prin coincidena inte tipurle paramerilor efectivi gi chor Elotant_tungt] = "\ntlotent tong formal cae se covespund prin pie, excepind pel fuctit modu long double id; rentru tipul float cind se face o conversie spre double. i foetesh Un opel de forma or heeaza (fotant_tung, 19) afiseara tel) irasee teeta genciatg nde sir este un pointer spre un sir de caractere, afiseaza sinul respectiv ie(oscant(ercateneaig} =e 1) beaak iat-un cimp de minimum 79 de earactere. Acetsta deourece parametrul i tetsearaters toys implicit etmp al unete\ fiseaca are valoarea 70. In enzul in eae sil eare : afiseaza (rel, 10); seafis ‘mai putine caractere, cl se afiscaza cadrat in dreapta in cimpul \ Stiscnse outa! (id)50-20} Daca srl contne mai mult de 70 de caractere, tune’ numa primele 70 se ‘tideaea Cone 30 or fia, denarece parametrul implicit precizic are valoarea 70. gerch () In apel de forma: @fiseazal‘Alt long double? Se raspunde cu D sau N *}; ion cere ce if(iesgeteh()) $= 'D && © d') break, eee ) stirs fr penta ong double stvibuie parametrului cimp valoarea 10. In acest caz,sirurile de caractere Care contin ma ptinde 10 earactefe se aflgeazaintr-un elmp de IO caractere ar agcemn = “\cmeton pastes rosin Sern meee } Sinurilecu peste 10 caractre, dar care nu depigese 70, se aligeazd pe atten i Ct caraetee cite itr n compunere lor | eee Paramettul implicit precise, nefiind definit in apelul de mai sus, sirutile cu | Sewers Or exit (a); peste 70 de earactere se afigeaza trunchiat si anume numai primele 70 de | HeGScanftessale-sdeowplon a) te ¢ eerie vor dl alte Stiseaca tee,10); Stiseaee ei 10); 20.19 Sa se sre funei care supraincareanameleputre si care rida a pure | sens ntaren inna 10 FISIERUL BXX19 E{sscant(e -4f*vacemplor.y) == 1) breaks fa: potere(ine a, int bt at seoza or,20) iTrieapeats poe SEES ei st0) ‘ atiseazal*\a\n\t tip comlexintn*, 10); it | afiseoce aodul feomples) 25:10)? \ Stisenseleent 017 eta a= 0) reesrn 0 Alt complex ? Se aspunde uD sau *) Brie Ler til © brie 48 49 , Long purere(loay aint b) (rrdiea pea ta puterea i ong e ifla == 9) return 0. ifth © 0) return 0 fortis Lee tit } brits) @ te a. double putere(double a, intB! ica pe tere b ‘ aoubie ane 1,37 Af (a == 0) return 0.0; er eee) Forti = tye 5 1.07 4 <= $riy) ote as return b 2074.00: 07." : doubie potere (double a.double bi "rica pa ta tera ‘ return powia-bl: > 20.20 Sa se serie un program care citeste siruri de perechi de numete de forma (xp) $i afiseaza, pentru ficeare pereche, valoarea lui x la puterea y. Nu= imerele x siy sint de diferite tiput PROGRAMUL BXX20 Hinelude Elnelude crtdlib.n cnath b> Sconie.B> Hinclude "Bxx19_cPP" paint) cies perechi de mumste de forma a) si afisoaza pa lab */ fl char £1255) char baza(} = “heza\n*; char expt] = ‘exponent in" char erint{] = *nu s-a tastat un intreg\n*; 50 tortie € fortis printf (baa) Drinte|tint=") Setgets(t) == 0) exit) Sf (ascané (,"4d",6i) == 1) break: print terine) ) Foetsst printf (exp): printf (rint=") Te tgeta(e) == 0) exten): SE (ancank (e783, 4g) == 1) break: int ¥ = patereti.j): printtirt = adhe j= $d\e E05 = BAD ESI DeincElralt intsiat ? Se raspunde cu D sau N \n"): fette = geteh()) {= "Di && ec t= °d") breaks » arstisicin esa wy fortia € tert peinet (nasal: print #(*long=") Ertgeea¢e) == 9) exte(ay: Sp(asoane (eWay fu) == 2) break: prinvétenu s-a tastat un intreg de tip lona\n"); , for(i) ¢ prints (expt: prince ("ine irigoes(el ietaseant (2, "td"/ 4) printf jerintl: 0) exitith: 1) break: , Long m = putecutud) printé(urs eave 5 = ¥a\e ur75 = Wan" a, 5 mt Print (sAie longrtine ? $9 raspunde cu D sau W An"); Hille = geteh(I} = 'D) kee I= "dl break J aStinsit ong int float f char emn{] © ‘Nu s-a castat un nunar\n"; forts) fortis) ( printf (havay: printé(*float=*); Ee(geesiz) =+ 0) exit) SElescant it "R£,4E) 22 11 broak: , printi(ers) + double g = puteretd,h: : printE(ra = tg\t h = 89\t doth = tw\nt.d.b.a! fortes Print i*A1t dauble**double ? Se razponde cu D sau NM \nty; bein fexvi Efle = geten{}) t= "D' ke © t= *d") break, peinte lint ) Sts double*double Teigetstt) == 0) exit: ietsseant (t,$0",63) == 1) breaks Boat fexps eine lacine) og double 1a) 3 | Float g = putere(fih: Forts) ¢ prin tit€ 2 ag\e 2 Sd\e O84 = Yann fi.) fortis) print t (Ale float**int ? Se raspunde cu O sau N \n"): printf (baza}: fifties getchi)) t= 'D! 6c f=") breaks printE("long double=*); dS Henn if(gets(t) == 0) extent: if (Seeant (e,"8LE", 61d) == 1) break: doubler & q printf fern) | ) loetast ¢ Forts:1 ¢ fortis) ¢ printf (exp) prints tbaza) peintE(*Floate): brintt {"double=") Te(etsity == 0) exiesa): Setgetaqe) == 0) exiecy Gt(sscant te, "86" atom) n= A) break: if fescane(e,S81f* aa) =e 1) breaks printf tera): priner teeny ) : double p = putere(ié, fexpt: forint Drinte("id = aLE\e foxp = BEE prints (wep) + Bart foxy = Saint, 16, foxp.p): peiner Cine" printé(*ALt long double*+Float > Se raspunde \ Tigetsie) = 0) oxic) eu D sau NAntly Hlaseant (t, "Ra", 43) == 1) breaks AE(le = geten(i) 12 1D! kk @ 12 a") Breaks prinef lerint) 3 J Shisit long double" "oat double @ > poteretd. ils float ge: printt(d = wht 5 = Sd\e ded = Sq\ntd.5.0) print H{eaie daublessine ? Se raspunde cu D sau ® \n") Tetqe = qetehi}) I= 'D' sec fe °d') break re AF Stn double™ printf tbaza): Souble hy printt(*tloat=*); Ae(getstt) == 0) oxit (at; : fortis) | it(Gscant te, ‘4f",4q) == 1) break: fate ¢ prinee(asn) : i printf (haze) : : rine (*doubie="1 forts:) ¢ Stigete(e) == 0) exitia) printt (oxp) {flaseant (t, “#1f* 4d) 22 1) breaks BeinteC Coates}; 1 printé (ern)! Efigets(th == 9) exit); 1 itfsscantit,"f*,ar) == 11 brook fortis) 4 printé (ern); prince (exp! : peinte ("double="): double s = putereta.r): Teigees(er == 0) exic i) printi(tq «wie r= 4g\t qttr = Selateares)s i fageant (e, VLE" ah) == 1) breaks printF(*AIt foat**float 7 Se vaspunde ex Beau N \n*hy prineeternt + LeCle = geteh(I) 2 ‘DY ake i= a") break; PSs ot foot 1 Observatit: 1. Inacest program se uilizeaza functia putere supraincarcata eu urmatoarele ‘ipuri predefinite: Result retwrnat tera exponent aa in in 2 ng ion int 3 double dic in a Soabte Subic able 2. Funetiaputere se apes cu pram efetivi de ite tpurpredefni ‘dupa cum urmeaza: arisen purertint int) puter{longint) Duteret fost nt) ieretdoublejnt) ‘uteretdouble double) >ere{long double float ‘ pueret Moat oat) Funetile putere supraincarcate se solecteaza ast! Ya Sescletea fnctia dea pact : inc : |:sletr prin coining ‘ 2 sleepin comet a 3: sclectare prin coineidlenta; - moves tinddoi : 4 seketarepn cone 4: scr income! Bara di mgd come Sor de sictpnent pats ds ‘ 4: skit prin coro prt i le de In paragraful 15.1. s-a aratat posibilitatea de definite a ma yurilor in lint . Accs faction eve presents sn inkl Cn ares diminuata prin prezenta functiilor infine, . Amiuimca un macr se defines pin conse de Fama fine mel pp 2, pn) text nA P72, pm mai pane ema par Intex Un act pot apelatprin consteti deforma; 34 umele te, 8) unde: €1,¢2,.,e0 —_~ Sint parametsii efeetivi ai apelutul Apelul macroului se inlocuieste eu fexr dupa ee, in preslabil, parameuti formali pi, i= 1.2.0 sau inlocuit, in textul rext, cu parame efeetivi corespunztorie, i= 1.2,..n. Aceastainlocuire a apelului macroului se numeste expandare. Expandarea macrouriordiferd de modul in care se realizeaza ape funeiilor obisnuite La apelut unc funetiobisnuite nu se substtue apelul metic prin corpul ci se reatizeazs un salt la zona de memorie in care se pastreaza corp funetieh respective, La terminarea exeettiei funetied se revine in punctul imediat urmator apelului. Un apel de aceasta forma, numit si apel eu revenire, implica diferite opera suplinentare in cazal in care functin este foarte simpla (2- 3 instructiuni), operaile implicate de ape si revenire pot fi mai costisitore decit cele mplicate defunct, insigi- De acec, in asta de situ arf util ea apetul funetilor si se realizeze la fel ca apelul de macro, adica prin expandare (inlocutea apelului prin corpul netic. ‘Acestluerv ese posibil daca antetul funetici este precedat de euvintl cheie inline. © astfel de funetie se numeste funetie inline. Exemplu: Penitu calculul maximului dintre doua numere se poate defini mseroul de mai jos: Haotine MMRiKy) be < ty)? yt: GO) seeventa pentru apelul macroului MAX: ine a,b, = Maxintb, a=) La preprocesars, se substituie apelul meroului prin textul su si se obtine © lav) < lacb) 7 ta-bi (aso) Calculul maximului se poate realiza folosind funetiainfine de mai jos: inline in: maxtint x,int y) {return x © y 2 ys xs) Instructiunea de atribuire de mai sus se sere: © = maxtarb,a-bh in avest ear, apelul fumetici max se schimba In compilare prin corpul i, Se obignuieste sa se spun ca apelul funcliei se realizeaza prin expandarea ei In elu esta se elimnina operafile specifice de la apelul si revenirea din functile obisnuite, 55 Functile nfine au uncle avantaje fata de macrouri. Astfel, 1a expandarea unui ‘macro nu se tine seama de tipul parametrilor, De aceea, nu se realizeaza nici un control asupra tipurilor parametsilor efectivi sau conversii ale valoritor acestora spre tipurile parametrlor formali La apelul unui macro, parametii formali se substituic in textul din compul ‘maeroului prin parametrii efectivi eorespunzator ‘Aceasta. substitutic se realizeaza inlocuind un sir de caractere (numele parametrului formal) printr-un alt sir de caractere care defineste parametrul cfectiv corespunzator. De aici rezulta si un alt dezavantaj al macrourilor $i anume acela al efectelor secundare, care in cazul macrourilor sint mult mai greu de pus in evidenta decit in cazal functiilor. Efectele secundare sau colaterale apar la calculul expresiilor ‘eure conin operanai ale caror valor se schimba la evaluarea lor. Astfel de efecte se intilnese mai ales la utilizasea, in expresii, a operatorilor de inerementare gi dverementate. De exemplu, atribuirea: a astel: expands; = fase) © thee? Ubeed 2 lett! Efectul acestei instructiuni este diferit de cel al instructiunii objinute apelind Fanotia inline max in Jocul macroului MAX: c= max(aes bret Acest apel atribuie lui c maximul dintre a si, funetia max nefiind influentata de inerementarca valorilor lui a sib Valoarea lui ¢ in urma apelului macroului MAX este influentata de eferele secundare rezultate din inerementarea valorilor variabilelor a sib. Mentionam ca efeetele secundare pot fi prezente si in cazul funetiilor, dar in acest cuz ele pot fi controlate mai usor. De exemplu, apelul functiei max in instruetiunea de mai jos = maxibears,2tared atribuie lui ¢ 0 valoare care poate sa fie diferita pentru implementari diferite a limbajului C++, Nu exista o reguli pentru ordinea de evaluare a parametritor cfectivi si din aceasta eauza nu putem sti daca evaluarea cxpresiei: aeave se realizeaza inainte sau dupa evaluarea expresiei bea» De aceea, se recomanda evitarea apelurilor de acest tip prin introducer atvibuiri prealabile pentru parametri efeetivi cu efecte secundare: uunor biases 36 = maxcie1,02) Avind in vedere avantajele functilor anf fata de macrouri, rezulta interesul seazut in uilizarea macroutilor in limbajul C+ Corsttuctia Hdefine in limbajul C++ se utilizeaza freevent in legatura cu compilarea conditionata, precum si in eazul functiilor de biblioteca utlizate alit in prog:ame C cit si in programe C++ Functile fine se vor utiliza totusi cu precautic, deoarece ele sit avantajoase 1d sint simple, O funetie infine ce confine mai mult de 3 instructiuni numa 2 jeu) apelurilor poate deveni ineficienta deoarece expandarea ei in program Sule poate conduce lao crestere substanials a dimensiuni program Furetite dnline au anumite dezavantaje fata de functile obisnuite. Astiel, aceste‘uneti nu po fexteine gi dee’ ele pot fi definite 5 utlizateinte-un singur ‘nodal al progeamuli, De aemenca, corpill unei funcfii inline ny poate contine seevente ciclice (seven introduse prin istructunile while, ie) jt de cate compl n care funetia nut poate fi ata De exemplu, daca o functic cu atributul inline confine o instructiune cic ‘atunei atributul dline va fi neglijat si functia respectiva va fi tratata in mod obisnuit. Compilatorul emite un mesa) de avertisment (iwarnings) corespunator. 20.21 Sa se serie wit program care citeste un sir de perechi de mumere intrest afigeaza, pentru fieeare pereche, maximul dintre el. PROGRAMUL BXX21 Hinclude 20.22 $a se serie un program eave citeste un gir de perecit de intreyi si afigeaz, pentru fiecare pereche, maximul dintte valorile for absolute st PROGRAMUL BXx22 Hinclude Seine ine abs (int x) /sewmeaza vloaeaabsoluta wl x*/ return x¢ 0? ox: x , inline double abs (double x) ( rtumeaza valoeea absolute sui x */ t voturn x < 0.02 -x ix inline int maxaberine x, int yi ( rotumara oxi vale abso ale hx iy * i Ant z= abso; int a = abstyi; } 38 inline deuble maxabs double x, double yi 2 rsarasizansxinl sar asolte ak bx sy Souble 2 @ouble.c abs tx); abeiyh: > maint) : teste unsi de porch de inte afiseara, pent Roca pete, ‘asin dnre valor lor abso ; ~ itesteunsir de percchi de numeresaisce7a, pent care perce, maximal dine ‘alrite er absolute *? ine a,b; printé(‘sirol de perechi de numsre intregi\n") nile (seane("ea 8é°.6a/abI== 2) wy uamabasa, ny prirer(~a=ta\tb=td\ tmaxape (a,b) =88\n".a, 2 double «4 flush (sein) + (dears 20m de inane printf (*pirul de perecht de mumara\n While(seant (if R16, eeykd) == 2 1 rire {re=8f\ta=ni\emaxabs |e.) =86\n *eydmaxabe(e.ai): 9 21. PROGRAMAREA PRIN ABSTRACTIZAREA DATELOR ‘Am vazut 8 limbajul C, si deci si limbajul CH, suporta stilurile de programare procedurald si programare modular Programarea procedurala (vezi paragraful 4.14.) are la baea utilizarca procedurilor a caror echivalent in limbajele C si C++ sin fanetile Programatea procedurata este eel mai veehi stil de programare Mat tirzn, pe masura ce complextatea programelor a erescut, a apna ideea dea deseompune problemele in suibprobleme mai simple eave la tindul lor pos fi ddescompuse in altele mai simple gi asa mai departe. In felul acesta se ajunge la 0 descompunere arborescenta a problemei date in subprobleme ma simple Programarea subproblemelor devine o problema mai simpla si fiveare sub- problema are o- anumita independents. faja de celelalte. subprobleme. De {semenca, interfata ci cu celelalte subprobleme este fimitata si bine precizat prin proeesul de descompunere a problemi initiale. De obicei, programarea unci Subpeebleme, componenta a descompunerii arborescente a probleme: insite, eonduce la ealizatea unui numarrelatiy mie de func ‘Aceste functit pot prelucta ih comun anumite date. Unele dintre cle sint independente de functile realizate pentns alle subprobleme componente ale descompunerii arborescente, Altele realizeaza chiar inerfaja cu subproblemele invecinate Despre funetile_objinwe in uma programarii_ unc} subprobleme_ se obignteste si se spun ca sint inrudite. De obicei, aeeste funetit, impreund eu Gatele pe care le prolucreaza, se pastreaza inte-un fisler si se compileuza independent © ccolectie de funeti inrudite, improuna eu datele pe eare fe preluereaza in comin formeaza un modul. In felvl acesta, problema inifiala se realizcaza prinir-un program aleatuit din module ‘Programarea modulura ate la baza elaborarca programelor pe module. ‘© pare din datele ulizate in comun de funotite modulul, sau chiar toate datele moduli, nu sint necesave sim alte module. Aceste date pot fi proigjare Sau cum se mai spune,aseunse in modul Limbajul C si dee si C++, permite ascunderea datelor in modulfolosind date care au clasa de memorie stati (vezi paragraful 5.2), ‘Mai mult decit ati, pot fi declarate i funcile ca static si stunei ele vor fi ascunse in modul (ou po f apelate din afara modulului), Ascunderea functifor in Inodul se face pentru accle funcji care nu se utilizeaza la realizarea interfetei ‘odiululi eu eclellte module ‘Ascunderea datelor si funotillor in module permite protcjaren datelor si izanea eronat a funeile. preintimpina wi 60 In capitolul 7 se da un exemplu de modul prin care se implementeaza o stiva pentru rumere intregi in expitolul respectiv, stiva este implementata printr-un tablow cu ajutorul declaratii statle int stack Imax) unde MAX este © constanta simbolied definita in prealabil si care stabileste imensiunea maxima a stivei. Numerele de tip int puse pe stiva sint pastrate ca ‘elemento ale tabloului stack si ele ocupa zona: stack(0),atack(1] stack next~ Elerentul stack{0] se afla a baza stivei, iar stack{next-1] se afla in vittul ci Variabila next defineste atit pozitia virfului stivei (elementul stack{next-1)), cit gi elementul liber al tabloului de cel mai mic indice. Initia nex are valoarea zero, deoarece stiva fiind vidi, stack[0) este ‘elementul liber de cel mai mic indice, Variabila newt se declara ast: Tn felul acesta, cele doua date (stack si next) utlizate pentru a implementa 0 stivas pestru gestionarea numerelor d tip insintascunse in modul, avind clasa de rmemorie static. Gesiiunea lor se face prin functt globale accesibile din orice modul al progranului. Aste, ip exercitiul 7.1. s-au definit fumetile: push = Pune in virful stivei yn numar de tip i pop += Scoate numarul de tip int din virfut tive. top + Permite acces Ia numarul de tip int aflat in virfl stivei. clear - Videaza stiva, empty = Retumeaza valoarea 1 daca stiva este vida gi zero in eaz ccontrar. Sul = Returneaza valoarea 1 daca stiva este plina si zero in caz ccontrar, Datele stack si next fiind ascunse in modul, utilizatorul nu are acces direet la le din alie module, De aceva, ele nu pot fi deteriorate aveidental. Utlizatorul are ‘acces nuumai la elementul din vieful stivei. Acesta poate fi scos din stiva (functia ‘pop) sa. poate i folosit lisindu-l pe stiva (functia op). De asemenea, utilizatorul poate pune un numar pe stiva numai in pozitia urmatoare celei corespunzatoare ‘elemenrului din virful ei (functia push). Meajionam ca stiva implementata in acest fel nu este chiar o stiva veritabild, deoarece stiva, prin natura ei, este o siructura dinamica. In cazul de fata, este Fezervata o zona fixa pentru stiva deoarece tablourile din limbajul C nu sint dinanniee In capitolul 11. se da o implementare pentru stive cu ajutorul listelor simpli 6 inlantuite, Acestea sint structuri de date dinamice ceea ce permite ca si stivele implementate cu ajutorul lor sa fie de natura dinemiea, {in acest caz, un element al stivei este o data de un tip definit de utilizator si anume: typedef struct mod ( declaratii struct tned *urm; }7NoD; Jn acetasi capitol, pentru gestiunen fistelor simpll inlantuite s-au fotosit variabilele globale prim si ultim care se definese ea find pointe spre tipul TNOD. La implementarea stivetor prine-o lista simplu inlanguita, operaile push si pop se definesc cu ajuorul fanctilorinjprim si spn (vedi paragrafl 14.3.1, $ respectiv 11.1.4.1,). Vidatea stivei (operatia clear) se realizeaza folosind Functiasterlist definita int In mod analog, se pot defini simp si ste Faneti pentru a realizanccesul la elementul din virful stivei (corespondentul pentru top) sau a stabili starea stivel (vida sau nu-corespondentul pentru empry) ee Functile de gestiune a stivei pot fi reerise in aga fel incit sa nu fic nevoie decit de varabila prim: . Se poate realiza si in acest ea2 un modul cu ajutorul catuia si se ascunda datele de implementare ale stivei. In acest scop nu avem decit sa declaram: variabila prim ca statica: statie TNOD *prim; Initial, variabila prim are valoarea zero (pointerul nul). Accasta deoarece Inia stiva est vida, Stivele implementate ca mai sus nu sint convenabile daca int-un program este nevoie si se foloseasea, in acclasi timp, mai multe stive pentru date de acelasi tip Intr-un program se pot defini si utiliza oricte date pent tipur predetinite ‘De exemplu, putem defini date de ip tn prin declarati de forma int nume_Iynume_2,... nume_ns Cu astfel de date se pot realiza diferite opera predefinite cum sint cee pat ‘operat operat de comparatie, opera logice ere In cazultpurilor definite de uilizator se defineste modal de reprezentate al datelor, dar au si operatile care se realizeaza asupra daelor respective, De aii rezulta simplitatea in prelucrarea datelor de tpurt predefinite im camparaic cu tratreadateor ale carortiput sint definite de uiiztor Pentru a pute utiliza simple, int-un program, mai multe sive pentru date de lun aoelai tp, a i necesar sa putem defini tpul sti, inflegind prin aceasta e& se dofnese ait reprezentarea datlor de tp stv cit si operate ndmise asupea o datelor de tip stiva Tipul utilizator fotosit in limbajul C nu stabileste nici o legatura intre reprezentarea datelor de un amumit tip si operatiie executabile asupra datelor de lipul respectiv oo Pe exemple, in paragraful 103. se definestetpulutlzator COMPLEX ea mai jos typedet struct ( ‘double real; Souble ines somone Prin accasté declaratic se defineste reprezentatea datclor de tip COMPLEX si anume, 0 astfel de data este o pereche ordonata de numere, fiecare de tip double Se pot declara date de tip COMPLEX ca si date de tip int, fong sau orice alt tip predefinit. De exemple, folosind declaratia: Inseamna c& z este © dati care se compune din dous numere de tip double. Aceasta deelarstie este analoga cu declarati: sae is prin care se stabileste ei este o data de tip int, Cum tipul ins are predefinite si operate ssp dateor de acest ip, rezulta ca declaratia de mai sw, precizeaza ait reprezentarea lui i (reprezentarea in binar prin complement fata de 2 pe 16 biti) cit si operate posibile asupra fui De exemplu, expresiite de mai jos sint corecte into saz et, Ita Jn cazul datei 2, este precizata numai reprezentarea lui = si ae componentele sale: areal Acces la prima componenta a Iu imag ~ Acces la a doua component a lui z La definites tipului COMPLEX nu se precizeazn nimie asupra operatiilor dmisibile pentru datele de acest tip. Utilizatorul poate defini astfel de operatii prin intermediul functor. De cexemplu, pentru adunazea numerelor complexe se ponte defini functia void adconplex (COMPLEX *a,COMPLEX *b, COMPLEX *e} C <> real =a -> real | b-> realy © -> imag =a => imag + b> imag 1 3 {In felul acesta, daca u.v,w sint declarate ea mai jos COMPLEX ues atunei apelul adcomplex i,k realizeaza suma dintre numerele complexe u si v, iar w devine egal cu sums respectiva, ceca ce in notatie matematica se serie ast: In mod analog, prin intermediul functilor, se pot realiza gi alte operatit eu mere complexe (vezi exereifille 10.1,10.2, 10.12, 10.13, 10.14, 10.15, 10.16, 10.1. Prin realizarea acestor functii nu se precizeaza ca ele definese operate asupra datelor de tip COMPLEX si ca alte opera sim intersc {Un prim pas, in tneercarea de a apropia modul de sata a tipurilor utilizator de cel al tipuritor predofinite, a fost acela de a preciza, la definirea tipului Utilizator, nt-numai reprezentaeea datelor tipulul respecty, ci si funetile eare definese operatii cu datele de tipal respect, ipcest luce Sa obfinut simpll prin chumerarea prototipurilor_fantiflor respective impreuna cu definires eprezentari datelor ~ De exemplu, pentru tipul complex putem enumere funetile eare realizeaca operaile eu datele de tip complex, ca mai jos: struct complex (—/seprezentarea tipi ouble real “fact prin are se ealiesznopcratle supra nameteor complexe Goubte model {) 1 madell sumarul complex Goubie aeacls Hfsrgumenol nrmarula comptes void neat! ‘veal = sel sag = imag ‘eal = aay gal imag aimag ienag void adconplex (complex a, complex b) Mca areal nk; imag =a ia jpiex teomplex , complex b) 1 sft set complex ile enumerate ea mai sus, in dectaratia complex, se numese Funct membru. Prin aceasta nu se realizeazé facilitati deosebite deoarece enumerarea fiunctilor membru indica, pentru programator, doar faptul ca funetile respective sit strins legate de datele componente ale structurié respective, Programatorul poate defini Cunctit suplimentare care sa renlizeze si alte 64 ‘operatii asupra datelor structuri De exemplu, funetia de prototip int peiteomplex(complex *a); cate citsste partea real si cea imaginara a numarului complex, spre care pointeaza a, poate fi definita si utilizata pentru numere de tip complex, desi ea nu a fost erumerata in declaratia struct de mai sus Datele de tip complex se definese in mod obisnuit: complex 2: ‘Aceasta inscamna ca z este o data care are doua componente: real si imag de tip double. Tunstile membru care sint foarte simple pot fi definite in eudrul declaratiet “siructialocuind prototipul prin ansetud si corpul functii respective De exemplu, prototipul double modul (); din definitia tipului complex de mai sus, poate i inlocuit cu definitia funetict modal: 5 gousle modul() {return sart(real*reat+inag*imag): ) Fu embru, definite in interiorul declarailor struct, se real mod inplieit prin expandare inline (vezi 20.14). De weeva, ele nu vor Hi Jn fntenorol declaraftelsiruct deci daca sin foarte simple. Turetiile membru, definite in afara declaratiei struct, se pot expanda inline dlaca se declars explicit acest lueru, Dec functia modu de mai sus, poate f ofinita infine in fara declarajici struct daca se dectara explicit ea find o functie inline. Tuwetia memibru arg este destul de complexa (are peste 3 instructiuni) side avoea sa nu va fi expandata inline, Deci, pentru ea se indica protoipal im detartia tipunui complex yi se defineste in afua dcclarafiei rexpective ca o fanetie obisnuita © functie membru care se defines lifica ea numele ipului pr in afara declaratii tipului a cari mx ca ptin intermediul operatorului de rezolt ‘Astfel, aumele Tunctiet div-antet se inlocuieste cu: ume tip:nume_fianefie_membru De exempla, functia membru arg a tipului complex, definit mai sus, are antetu double complex::are0 , 6s Acvasta conventie se aplica si pentru functile inline care sint definite in afara detinitii tipului pentru care ele sint funetii membru, De exemplu, functia modul se poute defini ca funetic inline in afara delinitie tipului complex astfel Aline complex::nodul () ( return sqrt (real*realtieng*inag): } Accesil la componentele date ale unui tip, numite si dare membrw ale tipului tespectiv, se realizeaza in mod obisnuit folosind operatorii punct(.) si sageata ©). 4 complex 2 complex +P, de exemplu, declaratile [La datele membru ale lui z ne referim prin nume calificate: tn mod analog, Ja datele membru ale numarului complex spre eare pointes ne referim prin: po real si p-> imag. ; In continuare, ne intereseaza apelul funetilor membru. Q funetie membru se Poste apela numai pentru o dats de tipul pentru care fui respeativa. este membru. — "Lapel uneiastfel de funetii se Folosese aceeasi operator’ cain caval datelor membru, adied punetul gi sigeata, Asif, pentru calculul modulului numarului 2, dectarat ea mai su liza apetl se va 2 odol() In mod analog, pentru a calcula modulul numarului complex spre care pointeaza p se va utiliza peal p-> moduli) Din acesteapeturi se vede ca in cazul functilor memibru mu este nevoie de un prametru pentru aavea aeces In data curenta prelucrati de fumctia apelata, In eazulfunctitorabignuit, functa are acces In data respectiva daca aceasta se transfera print parametru sau este o data global De exempli, fnctia dmodu pentru calculul modulului unui numa de tip COMPLEX a fost defini in exercitiul 10.1, ca mai jos doable @nodsi (COMPLEX *2} return sqrtle -> xte “> xin -> yz oy): : 66 unde tipul COMPLE. typed struct double; double: ) COMPLEX: Tipul COMPLEX definit in acest fel, na are Functii membre, Daca se foloseste dectarat COMPLEX = varului complex « se va utiliza apelul tunci pentru exfeutl modututu me anode Parameteul formal 2 al fonctied dod! este un pointer'spre data de tip COMPLEX pentru care se ealculeaza modolul. Else utilzeaza in corpol functie pentru a ave acces la componentele parametrului de la ape. Tn cazul apelufui unei fanetii membru exist in mod implicit un astfel de parametru, Numele lui est his El are declratiaimpricia Lip *eonst this; unde: tip Este tipul pentru care functia apelata este o functic membre. Valoarea li shi se defineste ta flecare apel al functiei membru asttel # daca se foloseste apelul: snvme_data.smume_fanctie..) atunei this are ea valoare adresa datei nume_dato; # daca se Foloseste apelu: pointer > nume_fiactiel..) atunei thiv are aceeasi valoare ea si pointer. Pointerul this se aplica in mod implicit la componentele datei Astfel, daca consideram apelul: a.modul tunel rhs are valoarca implicita adresa Iai, adiea ‘In cazul functiei modu, shis se utilizesza in mod implicit. De act ca expresia in mod implicit se aplica lt componentele datei spre care pointeaza this, adica cexpresia respectiva se interpreteaza ast: this -> waaltehis «> ralithis -> imgtthis > imag 67 Se observa ea utilizarea implicita a pointerului dhis simplifica mult d Functiilor membru Pointerul this poate (i utilizat in mod explicit, de catre programator, in functile membru, daca este novoie si se faca seferiee la data spre eare pointeaza, this, Funetiile membru pot fi enumerate si pentru tipurile uilizator inttoduse prin union, Acesten su aceleasi facilitai ca $i In eazultipurilor definite eu struct. Din cele de mai sus, rezulta ca tipurile de date prezinta dowa aspecte: unul legat de reps ima ca fipul este © mulfime de date cate au dceeasi reprezentare, iar celalalt aspect este legat de gper se dlefinese asupra multimii respective, Tipurile de date definite in acest fel se numese tipuri ubstracte de date, Tipurile abstracte de date au ca si componente att date eit si funcfii, De aceea, tipurile abstracte pot fi considerate ca o genetalizare a Upului utilizator kt real +b -> real; ) ‘ real = a -> real - b -> real: ) void mleorplex(complex ‘a,complex *b} Mealeuleazaa"s t real = ac real +b -> real = a > img 1b -> ine: Gag =a o> real +b -> imag a > img * b> zeal ine divecuplex(complex *a,complex ‘i; Meakeulearaah a Witndet 9 fdefine “ps 3,146159265350979 Heetine er tendit " doubie conpiex +1 arg!) /retumeuea argumentl numa complex qi double a: if(raat =< 0 s& imag == 0) return 0.0: isvisaa Getreal urn 0.0 lee Osi real <0 ifteeal == 01 SElinag > 0) return PL/2: eles //teal=Osi nay <0 return (3*PD)/2 Meal 2 0 imag "20 ao atan(imag/ zeal) + real = 0). deal 0 ie timag = 0) Hea Oslimag <0 (cal > Oi ioe > 0 2 Asin org int complex :: aiveonplex (complex ‘a, complex *b ‘ener ib rturaza Ta nari €07e70 double 4: Pees cool © b -> real +b -> img © b -> imag > 0.0) return 9; real = (a> real * b-> real +a -> imag * b -> imag) /dr Teng | ta ce img + b> veal - a -> real * b-> imagl /dr retire 1 21.2. Sa.se serie un program care eitestetrei numere complexe a, D, € care sint coofiesentit ceuatie' atxtxtb*xte = 0 rezolva si afiseaza radacinile eeuatiei respective. PROGRAMUL BXXI2 Hinclude Hinclade sstaiib. b> Finclude "EXKT.CPP* finolude “118,CPP* i/iteste ur mumer de tp double int eitconplex(conplex *a) ‘> sieste pate eas xa imagine aur mar complex ‘O-lasist de isin, lt St(peit_double(*partea veala: *, fa -> real) «= ittpeitadouble(*partea imaginara: *, 4a -> imag] revaen 0: , 1 return 0 0 sain() teste pe ae numere complexe; ez st fie radii ecutici aextaebtate =O" ‘ ‘complex a,b, 6,31, x2, bp, temp, aa. tempt: char ert] = 'S-a tastat BOF\n"; Souble x,arguaent Complex pateu * (4.0,0.072 se eiteseeoeficenti printf (er)? exit ot ittcitcomples (kb) == 071 print (er! ein) } ittcitcomplex(se) = 01 eat) , jflacreal == 0 && acimag «= 0 && bireal == 0 5 blimag == 0 sh e-real == 0 G4 c.imag =» 0) [ jia=b=e=0 printé("ecuatie nedeterminata\n* exit (0) : jtla.real == 0 64 acinag == 0 6% b.real == 0 be b.imag == 0) t print£(ecuatia nu are solutie\n‘) exit tL) 1 ifla.renh == 0 66 a.inag == 01( Drint£{-ecuatie de gradu intiita') Misreal © -¢.real) x1imag = -c. ima ba Ldivconples (41, 6b) Deine £Cxctgei* (2g) \n",¥2.rea1, x2. imag) xi (0) B bp.nuiconplextéb, sb! tenp.ulcomplex patra, ca) tenp. Secomplexihp, atenp1) np eal +1 imag = moduliempls Argument = attr) F = temp.modul 1); argument = temp. argit: (temp = P(costargument)+isin argument) saienp) = san(y"(costargumcr/2}*sinfrgument2)} */ ro sqrt , omy =sguybb-4tare) tonp.real = ¥*eos(argurent) comp.inag + r*sin{argurent) aa.adconplexica, tal (ix1= -betempya8 bp.real = "b-veal bp.imag = -b.imag; (Pb ‘Hemp = -bsemp temp! .adconplex(&hp, &tenp} xL-diveorplex (dterpi, 62a) 2x2 = Cletempian ‘tempi. sccouplexighp, temp): fex(atespi, aa) tg + (Ag! \n*,x1 reat,xt tag) Drineé(*m2 © Agri (4g) \n*, x2 real, x2. imag) + ” 22. CLASE La programarea problemelor complexe intervin concepte noi care mt pot fi xprimate simpluprin tipur predeinite de date De obice,oree limba} de proyramare pune I dspozitia programtonul un numar de tipuri predefinite, care ins, in mod freevent, nu corespund tuturor conceptelor necesare programulti, Astfel de conespte se implementeazs in Tinibaul C++ prin intermedia claselor ¥ O clasa defineste wn tip abstract de date, Brin fi asinact de date injclegem 0: multime de date care suo aceeasi inst de opal ire sept Ses ara, ie cate nu corespund not = mar complex: lista bores = ote Pentru fiecare iermediulclasclor. Din definitin tpului abstract de date rezuta a acest are 2 pari © parte care defineste reprezantaren datelor tipului respeetiv si o- parte care defineste operate «supra datelo respective Parte care dsfinesterepreventareadatelor este formats din componente care sint date de dterte tipuri. Aeeste componente se numese dare membru. Parte care defineste operate asupra dtelor tipula expect contine fanet numite fimet! membra. * Prima inceicire de a face legatura dint reprezentarea datlor unui tip si ‘operate asupradatclor respective a condus la extinderea construct’ siruer, asa ‘cm sa vizut in cupitolul precedent. Astfel, eomsiructa srucr permite defnirea teprezentrii datslartipulsi care se introduce de tilizator (date membri). precum si enumerarca funefilor eie definese operatii eu datcle respective (famet membray ‘Acestfapt nu este ina suficient pentru implementaree tiusilor abstaere de date deoarece nu se asigura protejares datelor mennbra, Ele pot fi accesate direct si de eatre ate fimett dest fanctise membru Lipsa une! protectii a datelot, fice ca tipurle de date introduse prin consiructia src! sa nu pont fi supuse unor controle eu pevire I aporatil cae seexceuta asp or De aceea, pis urmator in implementarea tipurlor abstracte de date este avela de a introduce protsjres datclr si funetillor membru, Acest ver a cond ln noiunea de elas aceste concepte se poate defini un tip abstract de date prin 8 Protejateadatchor si fnetilor membra se reatizenza wizind modificatort de provectie: = private; = protected: = public AActsti modificatori sint urmati de doua puncte. Modificaorii private si protected protejcaza clementele (date si fntit memnbru)aflate in domeniul Tor de actin. Domeniul de aetiune al unui mod rotefie sine din punctul in care rodificatorul respacty si pind la sfiyiul definiy mn alt modificator de proiecie. Cabsii din domeniul 6eaciune al moificatorulu public mu sit protejati st ei pot fi folosit fara restrict an tot programma unde ci sin "vizibili. xed implicit, membrii unei else sintprotcjat.ca sn. afta in domentul de actiune ali privafe Despre un astel de ms Tar ET poate fuilizat-de eatre o funetie membru dae nu si into funetie avbitras. Vom spune ca aecesul la un astfel de membra au se fi i indirect prin intesm mmemini. Nw acest i jue definite cu ajorul construct sruct. Mt caz, mrembri dasa fit sot in mod implicit public, deel la et feels diet, Aceastaexplica de ee in progranml cin exereliul 21.2 itor membra)expresit de fora ‘alabil pute se pot folosi direet (in afara fun} areal ainag unde: a - Este 0 variabila de tip complex. Jntr-adevar, constructia struct nu protejeaza datele membru red si imag, deci ele pot fi folosite in mod obisnuit, laf cain limbajl C, De acees, compilatorul hu poate realiza nici un control asupra operasitor realizate cu datete de tip Complex, definite cu ajutorul eonstructici struct, ca in exercifiul 21.1. Cu total data este situatia daca definim tipul complex ew ajutorul wnei clase. ‘Mentionam ca pentru a defini o clasa se utlizeaza weclug Format ea iim eazul constructci struct La definirea lipului complex eu ajutorul clasei vom proteja datele membra, adica rea! si imag. ‘Formatul clasei pentru tipal complex va fi class complex | 1 date membre private double rea double inc 16 1 funetii membru hs In continuare, ptem defini date de tip complex in mod obignuit. De exempt conplex as Gofinejte pe a de tip complex. In acest caz, a este 0 data care are doud compcnente: real si imag , ambele de tip double dar ele sint private si deci mu putem avea aeces direct la ele. De aceea, instructiunile de mai jos sintinterzise in afara funetitor membre: evreal = 2 prints (tactged* (Rg) \n* areata imag! ; Mai mult decit atit, datele de acest tip nici mu p ot fi initializate in bignvit, Deci, o dectaratie de forma: ~ complex a= (2,-1) este imerzisa, funetilor membru, rezulit ‘una ale nae ae “Coriplexe (modul, argument, adunare, ~ iniiatzare; } = atvibuire, = 4 = afisare ¥ Teste nocosar ea toate aceste funeii mem st fipublig) Rezulta co prima variants pentru definirea pul complex ar putea fi elas mai jos cisse complex ( {dae mab pte double reat; double inag public: {i fat emia publice ateibuiretdeuble x = Q,double y = 6) Mmalsbhinay = e4ity real = x: imag + ¥s double retrea () if seca prta tala a rumariul complex t return veal 1 double retimag () (/tetumenea pata imaginara 3 numarali complex c cd 8 void afisconplex(char *foreat) "afiscaza rumueu complex confor formatull dein 8 plntral forma peint£ (format, real, imag): > void adconplex(complex *x,complex *y) /ealeulewa.ty c real = x -> veal + y > veal; ) void neaconplex (complex *e} //eatolewa x ‘ veal = -x -> real imag © “x -> imag > void sccomploxiconplex *x,complex *y) Mealeulesza xy C veal = -> real-y —> reals imag = x > inag~ y -> imag. ' a void milcomplex (complex ‘x, complex *y} /!esleueazaxty real = x -> realty <> real-x -> imagty -> inag: imag = % > realty -> inagix > imagry > eal ’ int diveomplex(complex *x,complex "y): /*eslevleaza xs (0 Taipan ew 20, 1 ake 14 sfiritl doin las’ complex int complex 1: divcomplex(conplex “a, complex *) (rs esleulaza a (fe ipantien ou or; si ” ‘ double ay d= b> realth -> realeb -> imag > imag: if(@ == 0.0) return 9; (a> realth -> realsa -> inagth -> imaa) /d (@ > Amag*b ~> real-a -> real*h > inn) Funetiile membru sint funetii infine, exceptind functia divcomplex, care, Continind mai multe instructiuni decit celelalte, a fost definita in afara detiniticd casei comptey si deci ea nu este o functi inline. Jn antetu! fanetieidiveompler sa utiliza numele: complex 1: diveorpler constrit eu ajatorul operatoruli de rezoltie, Aceast regula se uilizeaza pe ‘pate functiile membra care ou se dfinese in interior denies clase penta we ele sin hiner membru, O elas defineste un tip care a fst numit sip abstract, Parteaprivata 9 unei clase defineste modul de inplementare al datelar de ‘inul abstiact defini de“ casa respectiva. Paria publica definese intrfita acest date ca rest programu. Aeeastajnterfita contine, de obice, a fost nuts func vem. Funevile membru se mai numes $i aetode>) In general, partea publica poate contine si date membru, dar atunci datéle fespective nu mai sot proteat,luent eare pe cit posi rebuie evita, Ast cum Sa subliniat mai sus, lipse une’ proteeit penta datele membnu nu permite compilatorului so controleze operate realizate eu datele respective tn enzul clsei complex de mai sus. programatonil nu are acces divect la Boolean empty) rumeava nae daca ia ete vidas fe altel ‘ roturn Astack == 0? true : false: 1 joean ful |) etumenva tra da stvn este pin alse all 100 ? true ) Io continuare, se pot instantia obieete de tip stiva stiva stivel, ativa2, La instantierea obicctelor stivat si stiva2 se xpelears in mod automat constructorul cksei. Acesta realizeaza atribuirea: ietack = 0: fn felul acest, stivele sival si sriva2 sint vide la instantiere Datele membre stack si istuck sint“incapsulate” (ascunse) in casa stiva, find private. Ele nu por fi accesate direct ea sin cazul modulului definit in capitolul private Stivele se pot gestiona simyplu cu ajutorul finetiilor membru, Astfel, pentru a puine un element pe stiva seve, utiliza apelul functie push stival push fexpeesiey In mod analog, punem un ust ea mai jo: cment pe stiva stiva2, apelind acceasi funetie stiva? push (expres ie) In felul ncesta,fanctite membmu gestioneaza simplu oricite stive de tip sfiva ‘Acest lucru nu este posibil prin intermediol modulului deseris in eapitolul 7 Evident, se poat2 construi un modul care sa gestioneze mai multe stive, dar acest lucra nu se realizeaza atit de simplu si clegant ea mai sus, prin ulitizarea claselor Acest fapt expliea afirmatia lui B, Stroustrup: daca intr-un program este suficient tun singur exemplar a unei date de un anumit tip, atunci este suficéent un modul pentru fucrul eu data respectiva, Altfel, se defineste o clas pentru tipul datei respective si astiel se vor putes instamtia oricite exemplar, In a 1 saltului realizat prin trecerea de la pro modular la stlul programasii prin abstractizarea datelor. Tar Feaumat, programarea pein abstractizarea datelor are Ja Baza utilizarea tipurilor abstracte de date, In sees! scop, se porneste cu stablirea conceptelor 83 nevesare la reatizarea unui program, O parte din aceste eoncepte se realize ‘jutoral tipuriter predefiite, existente in Timbajul de programane wtiizat (in ccazul de fata limbajul C+-#), Celelalte concepte se reulizeazat sub forma de tiputt labsttacte de date care se definese in limbajul C++ cu ajutonl claselor Un tip abstract de data prezinta doua aspecte: unul legat de implementarea tipului si eelataltlegat de wilizarea tui, eare defineste intefata tipului respeetiv cu restul programului Implementarea tipului este partea Tul, ‘publica tipulu, wilizabila sn tot programa Despre parica protejata se spune c.contine informatia incapsulata in class ceare defineste tipul respectiv La definirea unci clase se precizewza: — reprezentarea datelortipului abstract; — funetiile care deseriu operafii cu datele tipului abstract. Reprezentarea datelor se defineste prin componente date numite date rotejata iar intefina constituie partea membru Funciiile care definese operatii eu datele tipului abstract, se numese functit membru, De obicei, partea incapsul ccontine si functii membru, lementcle publice sint funetii membru. Ele pot fi si date membru, dar atunei rncestea mu mai sint protejate, lucru care este bine i ie evi ‘Un tip abstract de date trebuie astfel defint, meit fa utilizarea tui sit se fea fabsiractic de implementare, Mai mult decit atit, utilizarca datelor de un tip abstract nu trebuie sa fie influenjata de implementare. Aceasta inseamtst ca implementarea tipului abstract poate fi oricind schimbata, fara a schimba si ulilizarea, in program, a datelor tipului respect. De exemplu, it implementarea tipului sta s-a fost un tablou de tip far de 100 de clemente si variabila istack de tip int. ‘Schimbind implementarea prin inlocuirea tabloului cu o lista simplu {nlanguita (vezi capitolul 11), interfata formata din functile membre in clasa contine date membru, dar ea poate push, pop. top. clear, empty $fill se ullizcaza in aceluyi mod. Evident funeile se moified, dar cle int. fel sau acclasi efect Daca acest lucri mu este realizabil, inseainna bstacl na fot bine defn, dcoarece la ilizarea hu nse poste fee abst de implementawe Datcle de un tp abstract sint numite obicst ale tipulrespoctv Obiecicle se declara.printvo declrajc asemanvoare cu deelatain datelor pent tipuripredefnite, Ble pot Fi initatizate la delaras or se exeeaza, de obicei,printeun constructor, cae este 0 funetie membre speci, al-carui nume coineide eu numele classi, Consiuctonul wet Eiee se apeleara automa In consivireavinwi obicct al easel respective, Despre tind clase se xpune en ese o instaniere else respestiv Ba Un obieet poate fi distrus print-o functie speciala numita destructor. Numele eeu ose ck sin pec de cer) rele membre pot define n into dfn sd setucie mens i ls daca sn foe sinless, aces cele dete ad nln ne O ‘ete mend in afore de ‘construit cu ajutorul operatorului de rezolutic: ‘ “ fein amet nume_functie_membra La apelul_unei_fumctii_ membru_se_eaif ape une nembru, s¢_califiea, numele funeyieicu_num biel psziucae se apseuz una za a “s Fac little obtinute cu ajutorul clasclor apropie modul de trata z obec dca dir despa pede SS diferent inte utilizarea obicetelor sa datelor eo st obiccteto sia datelor de tipuri predefinite apare la expres, Asa de exemplu,dtea se considera datle decarate ea ma int 1.3,%2 double a,b,c ‘Atunci se pot utiliza expresii de forma: er er av; functici membru adcomplex: aaa fasion dep comple: pin ape complex 2,4,¥) viadcompLex [62 64) De aceea, ar fi bine ea expresii de forma: 58 fie acceptate de compilator si pe ilator si pentru obiecte. Aceasta idee ne conduce la notiunes_de_supraincdrcare a operatoritor. Ints-adev pera epson ee supraincara pent up predfnte ¢ poate aplica la operanzi de tipuri numerice predefinite double, unsigned si long double fu a pln Vote oui long double). De aeeea, pentru a putea serie adunare objector complexe: sn sub forma expresis on * PuNe# Ste anarea = Se poate spune ca ca in cazul tipurilor numerice predefinite, este sufici fi suprancaret ev operand tp compl. ace upranearearca operator ete ofa are simpli ml operatiilor asupra obicetelor. Pe b; ct siicu obiecs ke lenet one sa i epost expres ou obit I leo cou date Ce tipuri predefinite. rn 85 Supraincarcarea operatorilor se realizenza prin constructii_asemanatoare finitor dar care aw un antet special in care este prezent cuvintul operator Jn sftsit_amintim 4, suprainedrcarea operatorilor pentru obiecte este completata. si cu diferite conversii care se aplica Ia operatii cu obicctele respective, In felul acesta se ajunge sé utilizam obiectele fa fel de simplu ea si atele de tipuri predefinite Jn incheiete putem afirma ca, clasele sint un instrument pentru a crea tiputi noi care pot fi utilizate tot asa de bine ca si tipurile predofinite. Ideal, tipurle noi (Cipurile abstracte) mu trebuie si difere, in utilizare, de tipurile predefinite, ci ‘rumai in modul in care sint ereate, 22.1. Definitia claselor © clasa dofineste un tip abstract de date, En are o definitie al earei format simplificat este indicat mai jos S¢ class nume {ista_elementelor_membru}; Ulterior 0 s4 vedem si un alt format mai complex, pentnt clase fn limbajul C++, formatul de mai sus poate fi folosit si pentru a defini tipuri noi cu ajutorul cuvintelor cheie struct si tgtion. Deci,in formatul de mai sus, se poate inlocui cuvintul class prin struct sau union. De fept, in cele ce urmeaza, ‘yom considera ea si formatele in care cuvintul cheie cfass $¢ inlocuieste prin (struct sa union definese tot clase. Diferenta consta in sevea c2, in eval utlizit cwvintuli class, clementele membru in mod implicit sin proteate prin protectia } oferits de modificatorul de protectie private, iar in cazul lui struct si union, in ( imod implicit elementcle membru sint neprotejate (publice). In cazul utlizarit cuvincului struct se poste modifica protectin ct ajurorul todificatoritor de protectie. In schimb, in eazul utitizarii cwvintult union, lementele membra pot fi sumai publice. Deaceea, se obisnuleste sa se spuna ca struet si union definese clase cu elemente membru public. Tn cele ce urmeaza vom intelege prin clasa de tip siruet o clasa definita cu ajutoral lui struct iar prin lana de tip union, o elasa definta ew ajutorul Iwi Numele aflat dupa class, struct sau union este tipului.introdus prin definitia respectiva. El se numeste si numele clase’ si un continuate poate fi utilizat pentru a declara (instantia) date de tipul respectiv, date numite si obiecte de tipul respect. Lista elomentelor membru poate contine: = declaratii de date; = definiti de functiis prototipuri de fimetiis = modificatori de protectie. Datele declarate intr-o definitie de clasa se numese dare membru 86 Functile definite sau pentru eare este prezent numa prototipal, in definiti clasel, se numese finest membray ' a : Amintim ca functile definite 1n del dooatece cle sc delines compl cle se definese ulterior, In acest c ajutorul operatorului de rezolut tia unei clave rebuie st fic simple, in. mod implicit ea funcuit dufine. Pentru fanetile mai ipurile Funetiilor respective si antetul functiet contine un nume Format ew nume_clasé:: nume_functie_membra |, oclasa are unul sau mai multi constructori preeum si un destructor, cesta int furepiimembra ce sume speciale, si anume, numete consiructoritor coincide ew numole clase, (daca sint mai multi eonsiructori,atunei acestin sit Tunctit supraincarvaie, iar numele destructoruui este numele clasei precedat de ‘aracterul~ (lo deauna exista cel mult un desinuctor)” Us alt az porticuar de functii membru sint cele care definese operatori si conversii pentru obiectele clasci respective. 7 a Ca modificsios de protectie am vazut case pot fotosi = private: ~ protected: ~ public: Primi doi asigura o protectie a datelor sau functilor membru din domeniuil e actiume al fo, iar ultimul se utlizeaza pentru elemente membru care dorim si nu fie protejate, Domeniul unui modifieator de protectie incepe din punetul in are este seris $1 pina la sfirsitul definitied clasei care il contine sau pina Ja intilnirea unui alt | Trodifeatorde pote De ob, ele membr sin potjte, dr aceasta na isearnac lem pt fi public " De asemenes, neti membru, nites metode, de biel sin public, dar ele pat fs prow Else por “definite incompet ncaa in cre este nevoe sane reli a ele, O atl edie incompetent = chasse = see me Datele membr se dear in mod abiymt, Daca este prezant 0 casa de smemorie, tune aceasta pote nua laa de memorestai Sh © data mem a une ease nu poate f de tpl dent prin casa respctva, | poate fi timai un pointer spre ipul resp a iy sau 0 refering la tipul respeetiv. Fie definita > ae class nume | rnume #ptr; Wf eorect numeS ref, Weorect | hnume object; I incorect hi Data membru object de tip mune nu este admis. In schimb, se pot declara date de tipi introduse prin alte clase DDomaniul de cxstenia al nummelui nei elase este din punetul defini i pina Ia sist Bloculu (insttutiuni compuse care o contne) [De obicci, definitia unei clase se serie la inceputul fisicrului sursa in care este: |) witizat sim alara oriarui bloc. Se obisnuicste adesea sa se construasca | fgice de tp care si contin defini de clase Fier respectiv se include ls \inceputul ficearui fisier care utilizeaza definitiile claselor respective. 22.2. Obiecte Un obiect este o dati de un tip definit printt-o clasa, Se obignuieste sit se spuna ca este o instangiere a clasei respective. Declaratia de obiecte este ascminatoare cu cca pentnt datele de tipuri predefinite in cea mai simpla forma, un obicet se declara foosind formatul ctori care se apelea7 automat fa intilnicea De obict declarafiel de instanjiee a unui obieet al classi respective ““Batele memibru se aloca distinct la fiecare instanjcre a clasei, Deci, datele membru exista in aitea exomplare cite obiecte au fost instantiate. O exceptic & constitu dts embry care au elasn de memore stare, Q-dat membru de 4) clast de memorie static (numita dara membru stata) ese 6 parte comuna pena [ foate instanterite clasei si exista inty-un singur exemplar, aaa geile membru sint Inui singur exemplar ricice instantien! at exista, O fancjie membru se apeleaza totdeauna in strinsa dependenta cu un obieet care este instantiere a clase’ pentru care funefiarespectiva este funetie membru. ‘Legatura dintte functit membro si obiectul pentru care se face apelul se realizeaza folosind operatorul punct sau sigeaté Exempla; Considerim tipul complex defint la inceputul capitotului. Fie declaratile: complex 2: 88 complex "pe; char ‘format = ‘¥q\ttg\n Atunei: 2.afisconpiex (format) afseaza componenicle numarul complex = (iv eazul de fa constructorul clase’ are purameti implicti zero), Acelasi fect se obtine folosind seeventa De -> afisconplextfornat); it 0 0 deoarece Programatonul poate utili id liza in mod explicit pointerul his, in corpul unet 12a valoare adresa obiectu i Bente Sates © excepiie dela aceste tego reprozinia Fnctile memibr care au clasa de Poate fi apelata in doua moduri: adel oc ii membru statice. O astiel de functie ore fant membry,floxind © Independent de un obiect : coe ea apell em ume élasa ume _functiec_membru_statica | Incest caz,pointerul shis nu mai poate fi utilizat, Exempla: Pie definitia de clasa: class de sso tamara 4h, Mind publ . Qetint zet-tne Let, int oot995) Bis a: luna = 1; ane 1 calendide +a} , : Datele membru static: deosebire de celclalie date care vurma 1 sin ome poss tinsel, m Se initializeaza cu ajutorul constractorului, oe andl clon veri dan elon define dele eb an fe . care Sint componente ale obicciului spre care pointeaza d, preci mg nt de dtle membres 9 aa Ea pate Wasnt eoe te 89 Boolean de i: v_ealendide *a) > vorfiea dat eaendaristin 2 luna an, ale obit se eae pinta dy laa fetureaza Truc daca ds sit core i Fase altel static tnret) = (0,32,28,32,30,31,30,31,31,30,31,30,31) ine 2) Leal Seta -> an < 1600 || 2 -> an > 6900) return False id os Tuna <2 || @-> Jona > 12) return False: Lita op rica || @-> ai > tnre{a ~> luna]+ (3 —e lanaee2 G6 (@ -Dantd==0 Ee G => anti00 || ‘@ -san¥400 == 0))1 return False; poder: zz: Lec: Us ade: aa ifta < 1600 || @ > 4900) return False; if( <1 |] 1 > 12) revurn False: 2 ke (abhe=0 & adiog || a24co==00)) ittect || eetnee(le( return False: ) Fie instangierea: de data calend(29,2) Pentru a vatida instantierea dara_calend se va apela functia v_calend ast: if {de::v_calend(édata_colend) =» False) { ‘data caendaristen crate 1 esol 1 data clondeisticncorecta , In acest eaz,functia »_calend a fost apelatfotosind operatorul de rezotutie Se verfien data ealendaristca definita de datele membra zi, luna si ava instantieriidata_calend, Construetorul acestei clase a initatizat_obicetul daia_calend cu valorile n=?! una = 2 1995 Datele membru statice(zz,Laa) exista in afara instantierilor clasei de. Desi aceste date sint private, referirea la cle se poate face in funetin v_calend care este © functia membru a clasei dc. Totusi, referirea la ele nu se ponte face direct, 90 deoarece in est cnz pointrul shiv nu este definit,fanetin elem netind apelaa pontr un obicet, De acces eferire ka datelestatce 25, 8 ans Fat folosind numele clase i operatont! de tezolutie: a) a si , | Be. debe. orvuchinn dobtey deze J! 22.3. Domeniul unui nume ‘Unui nwme ii corespunde un domeniu, Acesta se defineste prin declaratia lui sau este corpul unei fit da el este numele une etchete. Prin bide inflegem o insiictivne compu. hy limbajl C 0 decaratie poate fi in interion! unui bloc saw it afira blocuriler. fy plus, in limbajul C+ 0 declaratie poate fi gi in interiorul unei clase (in interiorul declaratiei de clasa), © declaratie, care este in afora blocurior saa claselor si care nu este @ dleclnttie de date exteme se spun c& ete 0 definite Pentru un nume vom distinge 3 tipuri de domeni, im funetie de pozitia Aeclaratied (definite) sale. Aceste spur sint: loca, ser class Un mume declarat inten bloe ate un damien de tp focal. Avesta ineepe in ] ponctl a cae ee declare pn a sisi lol espoctv Un aed de | nium poate fi wiliza 1p domeniu li, inelusi in blocaile inluse sw damental | respectiy, dae el neste redaclarat in acest bloc Exempl Fie instructiunile compuse imbricate de mai jos: ‘ int 44 inoope domeniul dip oss a ta 1 mu ineepe alt bloc i=10; — Patnibaire eoeeia ‘nw exit declaratie pena 555-2; Menpresic onectadoarec se ala in 1 doen i a fost edo Jona ay ong 1: ifeedechareatui ‘Wn ees blog nse poate wiizavaibila 91 2 declastIincep de tp in FE san, Ase uulneara de tip tong cst pnt se eins domi a dsc de ip ong mwa ila pou declaie a S100; iP seaiie 0 vrs de pi 1 tin acest pet se termina dorenio clara it {Un num declarat in fia orien bloe sa desta (el un donnie up fier, Aeest Coren ineepe peti in earerumele Evin ins pn asi fgets eave eonine dfn respostiva El poste Frain domenil respect fara miei reste dacd neste reli in Letecurteinluse mdomentul iu Dba. an mum eave are un dameniu de tp Ger este redefiniinteaun bloe a omen sau, atc el poate fi foios,in acl ble, &e opsravorl de rezoluti. Exempla: nw ete weet pa in a0 pet Jhker2a, vse uutizera tit mat ss ong 4: Mredectarave ut Ae tiploeal pentru i prin tong it fre: taming damon hl eae pi nt 0 clasi are © declarajie (definiti) care defineste un tip absiract de date, Awnele acestui tip este considlerattotodata ea find numele wnei clase. ‘Numele unei clase are un domeniu care se stabileste la fel ca gi domeniul oricarei variable. ‘Un ume de clasa poate fi redeclarat ea orice nume. In acest eaz, putem folosi numele respectiv intr-un domeniu inclus in care este redefinit folosind construct eloss :: nune_clasa iw locul numelui 92 Exempla: claee a ( ) (C(Ftstmetine compas fat in domi name 9 double a: JJuedcchruea lia = 3.1415; i anbuirecorecta classita x2 deste oinvantire alia ) Aceasta regula se utilizeaza si in cazul constructilor struct, union si enum. De apt, consituctile struct si union se considera ea definese clase ale earot elemente membru sint toate publice Un_oume al unui element donieniy ie fip elas. Xe funetiilor membru ale clas mbru al_unei clase care nu este public are un seamnia ea el poate Fi folosit numai in corpul tale clasei respective Elemaniele meibru statice vor i prefixate de numele clasi operators. de rezolutie (vezi paragraful precedent). © clas poate contin ¢ las; da ale lies respective. wat de antieri ale altel Exemplu: class claea 1 clase] obiect1; # obect exe instaier a clase elasal clase object; | /eroare; elisa pone contne ea ebice alee are sa fle pointeri sau Exemplu class claza [ elasa *pobiects J priterspre ua obit de tip casa elasai robiect; Vreleintalaun obiew dep clana , Clasele pot fi declarate incomplet. Oastfe de declaratie are formatul class nue; Astfel ce dectaraii se pot folosi gi in eazul constructilor struct si union, 93 Exempl clase a class > a tal 8 tps utp; 22.4. Vizibilitate Un nume este vizbil in domeniul sau daca nu este redefinitin blocuri incluse in domeniul respectiv. Un nume redefinit in blocuri din domeniut sau, devine temporar ascuns, Un nume cu domeniul de tip fisier poate fi facut vizibil in ‘domeniul in care este redefinit, folosind operatorul de rezolutie iar daca numele respectiv este numele unei clase. atunci el va fi precedat de cuvintul cheie ‘corespunzator: class, struct sau union, Domeniul de vizibilitaze a unui sung este acea parte a domeniului el poate fi utilizat, De obicei, domeniul de vizibilitate al unui mume coincide cu domeniul sau, n care 22.5. Durata de viata a datelor Durata de existenta a datelor este legata de elasa de memorie a acestora. Prin durata de viata a datelor se intelege perioada in care ele sint algcate in memoric. Exista 3 feturi de durata: statied, locald si dinamicd. - + Durata staticd —- Inseamna ca data respectiva este alocata in memorie pe perioada executici programului: de la lansare si pint ta terminarsa exeeutie programs Datele care au un domeniu de tp fsie sint date cu durata static. Datele care au un domeniv de tip fisiersint date globale sau locale fisieraul daca cle sint declarate cu ajutorul cuvintului cheie szarc. ln ambcle eazar, ele a 60 duratastatica. De asemenea, datele care au un domenin de tip Jocal suo durata static, daca sint dectarate cu ajutorul cuvintului chee static. In concluzic, datele globale, procum si cele declarate ev ajutorul euvintlui staric au o durata statics Durata local - Este durata datelor automatice. Acestea sint date ew domeniu de tip local si care sint alocaie, la executie, pe stiva ‘sau in registri, Ele nu contin, in declaratia lor, cuvintul 94 stati, Mlocatea pe stiva se face cind controlul programuli ajunge la locul in care sint declarate. Cind controtul programului iese din blocul in care sint deelarate , datcle respective se elimina de pe stiva Este durata datelor alocate in memoria dleap. Acesten se aloes si se elibereaza la execute prin funetit sau operator ccorespunzatori, Ea se realizeaza de catre programator, tn acest scop, in limbajele C si C++, se pot utiliza functile malloc si free De obicei, in limbajul Cr+ se utilizeazi operatorit new si delete (veri «apitolul 20) © Durata dinamied 22.6. Alocarea si dezalocarea obiectelor Alocarea obiectelor se face in functie de durata de viata a obiectelor. Obiectele de drat statica si loeala se aloca automat Obiectele dinamice se aloca de catre programator. In acest seop, de obie utiizeaza operatorul new. In mod analog, dezalocarea obiectclor se realizeaza automat daca ele au durata statica sau Tocala si de eatse programator daca sint dinamice. Obicetele locate cu ajutorul operatorului new se dezaloca cu ajtorul operatorului defer. ‘Alocarea obicetelor se mai numeste si crearea Sau construire obiccielor. Dezalocatea obivetelor se mai numeste si distrugereu obicetclor. Alocarea abiectelor statice care sint globale se realizeaza inainte de exceutia | functici mein programului, Ele se dezaloca la terminarea programului es parte a procedurit deiesire din functia main, Obiectele locale se aloct in momentul in care domeniul lor devine activ, died atunei cind controlul programuluiajunge la instantierea lor, Ele se dezaloca in momentul in care controlul programului iese din domenitl lor. ‘Alocarea obiectelor este 0 operatie mai complexa decit alocarea datclor de tip, predefinit sau definit de utilizator. Alocarea datelor de tip predefinit sau definit de utilizator se poate face impreuna cu initializarea datelot respective. In eazul biectelor, infializatea datelor membru este o problema mai complexa din eauza protectiei datelor respective, De aceea, se pune problema ca inifializarea obiectelor sa fie o operatie care se realizeazé la alocarea lor, prin funetii membra speciale. Aceste fumetii membru, care realizeaza alocarea si initiaizarca “obiectelor, se considera ca ele construiese obiectul care se instantiaza, De aceea, cle se nuimest constructori Un constrictor este 0 fimetie membru al unei clase care se apeleaa la fiecare instantieve, El are acelasi nume ca $i numele elasei Dezaloca‘ea unui abieet este si el un proces complex care se realizenza cu 0 functie membre special numita destructor. Destructorul unei clase se apeleazi . 95 7 i explicit de eatte ea obigetului, Else apeleaza automat sau uncori exp re prograiatr. Apelul explicit af destrctorului se face pent s distr obicetee 1, Pentru celelalie obieste, destructorul se apeleaza automat kr ineetarea cexistentei lar = a iesitea prin functia exit pentru obiectele globale, la iesirea din domeniul unui abieet de durata locala 22.7. Initializare Dats pt naz prin delat tint) or : In aie datcle de durata statica (globale sau care au clasa de memorie suc delat tor meepe pn wil she stave cap. 5 6) nciniializare, au valoarea initiala egala eu zero. Cetelalte eateyorii de date daca hs tliat to valor nial nea i Selvite de wilizator se inilzena Dut de tpn predinte s cle define do flosnd formate din Tiny C, cae a fs proszte in ep 6 5 raga 1. oa ePeomeral rete contol! popanull ange ne Exemplus int fink =) 7 pact recat vars cin contol poe ngs a vars 1 pth samme sles eisezachapremtlr fd anh f int j= roars; cate defnit a aint expres k2 ) Un fe pane it ocus naizareaobicsor. Asa cum so pus mi 8, cbicette se niceneh eu stra conttortr sae se apelesra 0 od jjutomat la instantierea lor a Datele membvut ale obieetelor slatice (obieere dle drata stated) eare mu sin 96. Datele membru ale colorlate obiecte (obiecte de duratd local sau dinumicd) care nu sint initializate, aw 0 valoare intial nedefinita, Datcle membru_statice_se initialize oareez 6 dati membru sialicd este 0 i spective _,Inilizarea une astfol de date se realizeaza la fel ca o data globala obisnuita,? adiea print-o definite a datei respective in care este prezenta si valoarea de | initializao, definite care se scrie in afaracorpului oricarei Funct ’ afara_constructorilor, Aceasta, are nu s€ mulled Ia Exempla: class de { int 24, tuna, an: Static Int a2, 12,aa; public: Datcle membru state. \ ine de ss 22.2 15 int de:: jnt de: an = 1600; 1, aa se vor initializaastfek Se observa prezénta numelui clasei si a operatorului de rezolutie pentsu a specifica faptul ca 2, i! si aa sint date membra ale elasei de. In absenta numelui clasel si operatorului de rezolutie, datelez, , a devin date globale iniializate cu vatorile respective, Atribuiri de Forma: de ti ee aes: 12a) de ss a = 2600; Sint positile, dar numai daca sintscrise in corpul unei funetii membru (datele respective sint protejate), Astfel de aribuiri, de obicei, nu sint considerate ff inigalia. Ele se realizeaza numai daca funetia membra care le comline este apelata, Caca datele membra statice nu se initilizeaza,cle mu tnebuie definite in ‘odul indicat mai sus. Ele sintalocate in mod automat si au valoatea initials egala cu ro 22.8. Constructor Datele de tip predefinit sau definit de utilizator se aloca in mod automat, in conformitate cu declaratia sau definitiaacestors, Odata eu alocarca datelor se pot face si initializari {In caaul obiectelor, acestea se aloca fa instantierea lor, De asemenca, obieciele por fi initializate ta instamtiere, In acest scop, ullizatorul poate defini constructor, eare sintfunetii membeu de aeelasi nume eu numele clase. Se pot ” defini mai mui constructori pentru o clasa. In acest caz, ei sint fine suprainearcate si dei ei difera prin numarul si/sau tipurite parametritor. Valorile de inifalizare se transfera constructorului si ele joaca acclasi rol ea _parametriiefectivi de la apelurile functiilor obisnuite. Ele formeaza o lista care se include intre paranteze rotunde $i sint prezente in declaratia (definitia) obiectelor. in felul acesta, o declaratie sau definitie de object poate avea formatul: _nume_clasa nume_obiect lista) unde: lista = Este formata dint-o expresie seu mai multe, separate prin viegul. Lista, impreund cu parantezele cate o includ, sint absente daca objectul nu se. initalizeaza say daca exista un constructor cu toti parametsi implicit. Exemplu: Se considera clasa complex definita ca mai jos: class complex ( douple reals Souble imag public: complex (double -doublery=0) 1 consretor penta nomers complexe implicit instan ‘unarul complex eu ambele pa egal eu 200 *7 c real = x: Exemple de instangieri ale clasei complex: complex 2 1 se nsaniaza mumarul complex 1 inilizat iets = 040% * comlex 13 ‘ise instantiazs nama complex : ne y= 30084 complex (0,2); /seinslantiza numarl complex iso complex @(1.5,=1.5) 8 instantiaza numarl complex yon hs-hsm La initialzare, se utlizeaza regulile de la apelurile fanctilor supraincareate acd exists mai multi constructor. Daca exista un singur constructor, atunei se aplica regula de la apelurileFaneyior din imbajul C, adi parame! cial de fata expresile prin care se fae inigalizarea) se convertese spre tipurile parametrilor formal corespunzaior ai constrctorutui cas ‘Aceasta regula se aplica sin cazulclasei complex, de mai sus, care are un singur constructor. Mai jos, dam un exemplu de clas cu mai multi constructor 98, Exemplu: clase de { int 23, 1una,ani public c0) Wi consrvtor fara prams decline 2,int ,int 4-195) * ceasrueter ei parametric ip int *) i luna , actint z,char ‘dent, int ab ‘eomirctor pet intalizare eu denuies ni calendars > Exermple de instantieri ale elasei de: Ge AL; Msc mpoteaa constuction fia parame |, ah 2, lune 1, an=1600 de «2 (35,9, 1995); (fae apeleaze constant oi param tip i i 2 2418, hna~9, a0 195 de €3(15,9); Ase apcears acca consrictore a 2s se obtine acca reat Ge 44.15, *septenbrie", 1997) se apeleara construct caramel char dil“ 7 se ypceact construct ea i exral bicolor d2 i Ss ‘sets aloe in memoria heap dale mom se initaizz ca In ose 9; Pare ea aloare adres de ioeput a ebeotl leat n emoria sap In acest exempht sa definit un constructor fara parametri. Un astfel_ de jelor Se mumeste conseructor implicit, In eazul ir eare exista un constructor implicit mu se ma ponte defini, pentru ~ clasa respect, un constructor cu tti parametrl implicit. Inr-adevar, un astfel de constructor conduce la ambiguitate la instangieres obiectelor. De exempht, daca alaturi de constructor! ded al clase de, am defini constructor actin act, Ant 21600) tuned instan ee a: este ambigua, deoarece se pot apela ambii constructori Prezenta constructorilor nu este obligatorie, Se pot defini clase si fri 99 constructori. In acest ex2, compilatorul C++ genereaza in, mod_automat_un ‘constructor fara paramets, adica un constructor implicit, Avesta are rol numai de alocare a obiectelor elasei respective. Constructorié definiti de progeamator sint |) nooesari numa in cazu in enfe se doreste jntializarea obigeilor Ia instantierea lor “in cazul in care @ clasa are cel putin un constructor. si, nici unul_nu este consituctorul implicit, alunei nu se pot instanfia abiecte neinifalzate. Accasta, “eoarece compilatorul nu erecaza constructor implicit pentiu cascle eure au col pusin un constructor. Exemplu: class complex ( doubie reals double imag? public ‘complextdouble x,double y} ) In acest ea2, se pot instantia numai obiecte cu ambele part intializate: complex 21,2): Complex 21 (erare:nu exist constrtor implicit Declaratia (definiti) obiectelor pentru care lista de initializare se reduce la un singur parametru, poate fi serisa int-un format care sa nu difere de eel wilizat la iniializatea vaciabilelor simple. Astfel nune_clasia nume_obiect = expresie; realizeaza instantierea obieetului mume_obiect al clasei nume_clasa, instanticre Ia care se apeleaza un constructor pentru care primal parameiru are ca valoare, valoarea lui expresie, Alli parametri, sau nu exista la constructor! apelat sau sint parametri implicit Exemplu: class complex ( double reals Souble imag: public: Complex |double %=0,double y=0) C eal = xi imag M Exemple de instantie 100 comlex 2 eomlex 21(2); id= 0 complex 2312.2) i/23= 142 In cazul in care dorim si instanfiem obiecte atit inigializate, cit gi neinitiaizate, putem folosi un constructor implicit vid, care se va apela ta 1 obieetelor neinitializate. Exemplu: int 24, luna, ans puslie 2e() sf eonstucir implicit vid {lf scutilizsaos pene instante obicetlor ciiislzae ) dctint z-int 1,int a) 2 constr weal ent inialzarsa obietlor*/ zy luna = 1; an =a ‘Se pot utitiza instantieri de forma: de di seapeteaza eostactora implisit de 41 (1,2,1997)" 1! se instantinzn obit dinar ‘ast el unae2,an=1097 Parametrii unui constructor pot fi de orice tip, cu exceptia tipului definit de clasa pentru care este functie membru, Deci, daca clasa este numele unei clase, atu! muse poate defini un constructor de antet: clasaiciaea pi Jn schimb, constructoral unei. cl referinte la obiectele clasei respective se poate ayea ca parametri pointeri sau Deci claca(clasa *D) |] si |e elaratelasas p) | Sint antete corecte de constructori ‘Constructorul: ) Blase iconst classe p) / in constructor special care permite copierea obiectelor. El se numeste Constructor de copiere. Constructor de copiere poate avea gi ali parametri care Ini trotuie safe implicit 101 Constructorul de copiere se apelewza into instantiere de felul celei de mai jos Fretesa et...17 instanton eu inializareobisuita % Leta e1's'G)tseapleum emus! deo: Hel estea copie lic Daca programatorul nu defineste un constructor de copiere, atunei compila- torul genereaza un constructor de copicte implicit, daca este neVaie de el. Exempl Mai jos, definim un constructor de copiere pentru numerele complexe OT goubte real Souble imag public: Complex(double x=0,double y=0) ‘ real 1 lomplex (const complexs ¢) —IFeonsrutor de copiere ‘ real = c.r0a): fl {mag = ¢.lmag? im Exemple de instantieri complex 202,21; 2-124 Complex 21 2; ifseapelesza constructor de copies ees F Lcomplex 22/211 ff seapeleazaconstracoml de copiere adsl Datele membru ale unei clase pot fi date arbitrate dar nu obiecte ale clasei respective. in particular datele membru pot fi obiecte ale unei alte clase ‘Un exemplu simplu este cel oferit de primitivele care se wilizeaza la definirea figuritor pe ecranul sett in mod grafic Consideram clasa Punct care defineste un punct pe ecran. Acestaareo pozitie definita prin coordanatcle sale (coloana si linia in care se afigcazé. punctul respectiv), Definim clasa Punct ea mai jos: class Punce { int x; olan Sint ys Miia public! Punt (int col=0,int linia = 0) 1 constructor: puta implicit este cel de coordonats (0.0) loz col: y © linia Un dreptunghi se poate trast daca se definese doua virfuri diagonal opus. De obicei, se considera virful din stinga sus al dreptunghiutui si cet din dreapta jos. Ur vitf al dreptunghiului este un obiect al clasei Punet, De accea, putem defini elisa Dreprungh cu ajutorul a doua obiecte ale clasei Punct: Constructoml clase’ Dreptunghi trebuie sa transfere valori pentru parametti cconstructorului clasei Punct. ‘Acest lucru se realizeaza modificind antetul eonstructorului, ca mai jos Fie class of definita astel class ef ( ell cl; e122; ln en; 8 unde cli.el2,..chm Sint nume de clase, in prealabil definite, care nw neapar sint toate distinete. Ele, au fieeare, constructor’ pentts initializarea obicctetor. Constructo-ul el transfera valorile de initiatizare pentru obiectele membru l,c2,..,en prin antetul siu de format: MoI eM oo eA Joun Mu) | Jn acest antet vor lipsi biectcle pentru care mu se transfer date de initializare, Reluind exemplul de mai sus, completam definitia clasei Drepuunghi cu doi constructor eles Drestunghi ¢ Punct dr_jos: pubitic Dreptuaghi (int de,int 3): de_jostar ise stanza depts eo vintite 1 stinga sis: (00) mpi 103 1 spin jos: ted iptunghi(int stint gus,int dr. int jos! St_sua (st, gus) ;dr_jos (dr, joa) ‘se insantiaza depict 1 singa ss: G55) it drt: dejo) Metoda de inifializare a obiectelor, care sint date membris ale nel clase, poate fi utilizata si pentru date membru eave nu sint obiect. ‘Astfel, un constructor de forma: complex double x, double ¥} tC , poate 6 seri si sub forma: tcl imag) * uble x,double ¥! complexe } in incheiorea acestui paragraf, enumeram caracteristicle de_bazi_ale constructorilot PP Consinictorii nu retutneaz nicl o valoare la revenirea din ei, Mai nvult decit ait, antetul lor constituie o exceptie, deoarece nu este admis cuvintul ebcie void, Cavin’ care trebuie $4 Fie prezent in antetul functislor eare nu retuneaza o valoare: in eazul in care o clas aze obiecte membni care au constructori, acestia Se apeleaza inainte de a se apela constructorul claset respective Shetty easlor cae a el putin th consular nu pt componente se ge eeu Peeencercebite de funaile cbimut, adres constuctrul 8h $6 poate derina, ) De obicei, constructorii sint functii membru publice, dar nu se pot apela cxplic fel ca elle uneis membra Mn constructor poate Fi apelat explicit penta situagi de fe ce de ma jos camplen z= complex(2y + (-Hehanie df> Oras, dt ope) Taba! eaza Fst pelt consruetorul clase complex pent a ee 10 ase itza cu valle 1 peir para tela st 2 per parca Havin Apoi obicetul respect ete copia in obec 22.9. Destructor Deitruetorii sint fa ee constructor ci exis si diferente. Nunele unui destructor este numele clasei precedat de caracterul "=", Un desiruetor iu are parametri si el este unie pentru 0 clasa. Daca programatorul nt a definit un destructor, atunci compilatorul penereaza un destructor pentru clasa respociiva, Antu! destructorilor nu confine cuvintul void, desi ei nu returneaza vatori De aceea, destructorié au antetul: inetii_eare pot fi mnsiderayi_c@ aesionenza. in sens inve leristii in comun cu constructor, dar intre ~nume_clasa in interiorul definite: clasei nume_clasa, In afara definitici clase, antetul destructorului nume_elasa :: ~nume_clasad) Ccasiincazl constructor, adtsndesirictoru nu poof eter inat Objcteleune lass care au un desiucior y/su cel pln un consrctor mu se va uf biel su apelat mai mul constructor tunel la a hy, desist 3 vor apela i odin avers anu un abie! global, desiritorl se apeleaa ca parte a proce exit de taterinaen excel funclet main De aceea,unasfel de destructor nu rebuie Sa apclene funetia ex dconrooe sei fat-on Ge ini Peait_un obgetlocaldestructou| se apeleaa cind cgntrolulprogramuls lc fl (else din Boca eae este eclrt, ! ‘tics dnamice nu pot disuse automat. Disrugetea se realizaza de caure programatordeoaressmumai elie ind un ate de obeet nu mal este ese, Desirctoral poate fapelat de programator ait dct, cit indie prin ‘onal delete Noa ulllaam opertGrl delete petra a disirugeobieee create dnanie cu sini operator new (obietedinanic), % Exemple: 1. Fie tipul complex definit in exemplele precedente, complex pz ba = new conplex(1,2); 1 memota heap 36 conscsto un bie do tp complex en parca real gas 1 eu Usipateaimaginara cyala cu pz pointaza spe cbcctulrespetiv 105 delete par ifsedigeobiectn creat mai sis prin new 2. Se defineste clasa szring ca mai jos: class ing ( char ‘sir: ine tuna public. string ichar *) sstring(! > String 1: stringichar +s) (/delin i dung = strtenis) + 1 pir = new char[June! ) string :: -steing() Hf dfiniia destuctorli delete sir: , Exemple de instantieri: string sirde_caractere(*Aeasta, este un sir de cavactere"); 1 se ccesza obit sr de_caactre in mira heaps inlizenza cu texul W/*Reesta ete wn sir le cata delete sir_de_caractere; 1! seuisiugeobicctal apelind-se indict desiter Apelul direct al_destructorului se poate face.mumai_daci_qumele_tui_este precedat de numeie élasei care este urmat de operator string #(exenple*) ring); sfapel diret destructor 22.1 $a se defineasea tipul abstiact de date compen cave sala Fanetii membra Pentru modul, argument, pentru accesul la partes reala si imaginara a ‘obicctelor de tip complex, pentru afigarea obiectelor complexe, precum cconstructori pentru initializare i copier. FISIERUL BXXII1.H class complex { 1 date mem potejats(ivate) double veal; i/partea wala double imag; panes ineginara public: i fimeti membuu nepctejane complex (double x=0,doubie y=0); 106 1 couse floss nrc complexe(const complexe ‘eomtryetor de copire Souble modul (); J mrodalal mara complex double avai) ‘segue nara complex Gouble retroal (1; s/ameses parca wits Souhle retinag()! —/fretueneara para negara voie afiscomplext| : Wafiseara numarul complex 1 Hsien clss comptes FISIERUL BXXII1 ifndef _pextT i Binclude”pxxtTE He Bdeeine _pxXIT1 fenait #itndef _warn_e finclude Rdefine _NNtH. tt fendit Wifndee er Haotine Pr 3.1¢159265358979 Wdetine PT fenait ‘const sent iilizar bigot Jnline complex 1+ complex double x,double y) ‘ real = x; , J corstrstor do copits inline corpo ‘ veal = z.real; imag = 2.imag, ’ complex (coast complext 2) inline double complex + modul(} 1 caleulears modu asmamlui complex return eget , ‘altreal imag’ imag) double complex +: ara{} if ealeeaza argument naman complex 0 && imags=0) return 0.9; 0) ifteeal > 0) return 0.0; else return PT; if treal==0) iEGnag > 0) return PL/2 107 case return (3°98)/2: Jetcoat « 0} lneal0simag <0 Areal Ds inag> 0 yt stare inline double complex i+ retreal 0 1 renanssen porte ealas numer complex i retuen real , retina () inline dovble complex ‘returns pte gina & nul eos fl intine void complex +5 afSscorpex0 ‘ + (hq) Ant real, imag) 1 22.2 Sa seserie un program care realizenzamatoaele; ‘+ citeste pervehi de numere care reprezinta, fiecare, partea tiv partea imaginara a unui nunnar complex; lasi respec © afiseaza: = pumarul complex citit, radeina patrata din fieca = suma numerclor complexe citite PROGRAMUL BXXII2 Hinclude #include Binclude “EXXITL.CPP* re numa complex eitit; Bee cat imaginara a wr Jeet pore dente ac rsa pare rl i espety oe nae complex and comp ted pata nar compte i 108 sma mumereler complexe ett ‘oubli double y; ouble Bx = 0; Jouble sy = 0; printf |-partea reala ="); if (scant ("811",6x) t= 2) break; mu mai sin ounere printE(parcea'imaginara =")3 Eflscant "#10" gy) = 1) Hecowe printf ("partes inginara eronata\nt} Printf(*so reia citirea mumarulul ine) Eflush stdin); videaza zona amon de antares anand continue, (ise wiacicll de ete 1 1s insumeara pte rela s cea imaginars a numerlor complexe cite come: 2 (ey) ffs consuiete numa comple avi patie cite ‘se apelsaza constrstoral ere realizeta inal zaen obit Weewsity z.afiscomplex(); //ufseaza numarul cit Souble m = z.modul 1)7 1 ealevleaca niall a2 Gouble'a=2.3rg1); | Healuleara apumental i Houmarui compen double wi = sqrt ta); if radacina otra din modula 2 Gouble at = a/2, !seniarguncatl amar 2 rat sgn) Print! (*nodulvl = g\cargumentul = ¢g\n*.m-al; double preal = mi*costatl double pinag = mivsin(all complex raI = complex preat,pimag) 2 sane complex r22 = complex(-preal.-pinag) printf |*radacina patrata\n'| printé(-sarte1 =") Fel.atisconplex |); printé ("sgrtz2 ="); re2.atiscarplex(); whilens; complex sz * complex(sx, 27); Printf("suna nonerelor complexe citite = *) f2,efisconplex()? —/fafisaza suma numcielor complexe cite Si se extinda tiput abstract complex, definit in exereitul 22.1, asa incit sa '8¢ poata realiza urmatonrele operatii asupra obicetelor complexe: = auunare; 109 seadere; negativare; ~ inmulsire; = iimpaeice: ~ citirea de la intrarea standard a componentelor unui obiect complex. FISIERUL BXXII3.H enur Boolean (false, true) class complex { 1 date mem protjte (vate) Gouble realy Souble imag? public I funti membma neprotjate complex (double ¥=0,double y=0); constructor complexiconse corpiexk) ; 1! eonsnutor de copier: Aoubie modi (); if modal namarali complex Soule azg(); argument numeral complex Gouble retreal (); ff teiumenra paste wale Goubie retinag(); ff retumeaza pts i void afiscomplex() 1/alleara muman complex 1 met mambo a Boolean citcomplex(); «+ 1 esse components nuarlu complex; 1 atures fale la FOF . void adcorplex (complex *21,complex *22); Uealelesen = 21422 void scconplex (complex *21,comlex *22) Uealeueara = 21-22 void neaconplex (complex *21); Uealelesra y= =rt void milcompiex (complex *21, complex +221; Vealeleara 2 = 21"22 Boolean diveouplex (complex "21,complex *22) ealeulesza = 2142; etrmcaza false la impartiea ch 2%0 » Fisierul de mai jos, contine definitile funetiilor membrw noi. Definitile functiilor membru vechi se preiau din fisierul BXXIII.CPP. FISIERUL BXXII3 Niengot extra Hineluge *BaXIT378 Adefine _OXXI13_H fendit Hdefine _mxxrri_t Hitngee —oxie_cer include “Bx22,CEP* Haefine _BxIB_CeP. fenait 110 Hitndes _gro10_n Vinetde stato he Adeline store. henaié 1 seaefinsde BXXIL_H pentru ama mal ince isin 1 BXXILA prin ineladerea sie BXNIN CPP include “RxX211 .CPP* ss prviau define imetile memes vicki i H detinitilefnetior mentor no Boolean complex +1 eiteomplex() (+ etete exmponcitle miami ennlex: False sisi ser eve al ” ‘ double 2real ‘Souble Sima: ittpeit double(*Partea reala:",gpreal) = 0) retire false; EO ittpcit doublet*Parten imaginara: *,spinag) == 01 retin false; (FOF pealfejraei > inline void complex +: adcomplex(conplex *21, complex +22) Meakeslearar = elo real © 21 => realen? -> rea! imag = 31 <3 Snagit? > image , inline void couplox ++ seconplextcomplex *21, complex “22h iresleulearas = 11-2 i real © 21 => veal ~ 22 —> real fnag = 21 + imag - 22 -> inags ) inlino void complex :: negconplex Wealcslet2= 2b t veal = -tl => real: 1 nm inline void complex 1+ nulcomplex|conplex *22, complex *22) | Wealeslsirae= 12 real = 2t > coaltz2 > real - 21 -> imagts? -> imag? Bios reais? - imag + 22 -> imagre2 -> real; ' boolean complex ++ divconplex(complex ‘21, complex 722) Wesleuleza = 212 4 double d = 22 -> real ¢22 => real + 22 -» imagt22 -> imag: fla = 0} sPdwizornul return false] | real s (el -» fealta2 -> real + 21 -> inagtz? -> imag) /d: Smeg 2 (al > images? -> veal = ol -> realta? -> imag)/d: ) 22.4 Sa se serie un program care citeste numerele complexe a, b, ¢, ezolva si | afigeuza radacinile ecustici de gradul 2: atetatbtxte=0 PROGRAMUL BXXIl4 Finciude eetabid-e HStndet _S9D10 Ninclude Haetine __STDr0_H erat Hindet __pootean enun Boolean (false, true); teetine “Boolean engi Hider poss include “BKXTIS.#* //definta casi de define pou 17 tenait {Wtitizarce datlo statce int dessminge = 1; implicit data clentisica fet deviminl = 1; minima este int de:sminaa 21 Vianuari 1600 Sat es maxes elicit, data calendarisien Sat dc imaxt] i maximacste Ane dc:imaxaa = 4800; 1/31 decembvie 4900 “initatizacatblonui cu numaral ier din unl clenitce Ane @ersterz{13] = {0,31,28,31,30,31,30,31,32,30,31,30,31)7 “initia textelor de eoare char *de:serde = ‘data calendaristica eronata\nt; char ‘*dc:sermin = ‘data minima eronate\n"; char ‘do: iarrax = ‘data mauina exonataln*; ‘nialzaca table eu denemiilelniloe clentsisice char ‘do: :tdenduna(i3} = ( “iuna ilegala* sfabruarie, saprilie*, vise, . siulier, raugust, sseptenbrie* soctonbrie®, snotenbrie* seocenbrie Me ‘fate obisruita flosia de uncle membre inline int biseet (int a) Prete Trac a defineste un an bis Date *” ‘ return atde=0 6 ati00 || at400 == 0; ) fame meme Boolean det :v_calend(int z,int 1, int a) rtmcaze: trv dca data calendars defnta de parame, sete valid; 118 Fase in car comar. #1 ft if(a < 1800 || a > 4900) return false: fla © ds:eminga || a > de:emaxaa) return false itd <4 || 1> 22) return fatse Eflastder:minaa && Lege: iminld || a: return false: if(e © 1 || 2 > tnre(i}+ile=2 46 biseetia})) return fal Stlascder:minas Sa ls=desiminil eae < devimings || ascde:simauaa Sa lode: imaxll 44 2 > desman) return false; , inline vo.d de: :afiser (char ‘sir} 1 afiscaza en spe ete pointe Si fl printf(*ts\n", sir); ’ Inline Boolean de::valid_de() vere eorctinines date alendaristice a abcetuhs cure *hcerare stam fase. "2 ‘ veturn v.calondtei, luna,aa): , intine foclean de: vail dental) (vei ewcetnes dats mivime: ta erare etme fle. ‘ veturn v.calondide: imines, de: saint de , inline Boolean de: :valld_ée_maxi} = verifie ercetinines date moxie Ineroareretareza ls */ t return vicalend{de: :naxz2,de::mmx11,de: swaxaal : Boolean de: :bisect_éet} reumnena eda anu calenritc al obiclu cuenta bie! */ ‘ if(bisee:lan)) return crue: else retarn false: , Boolean de:=bisect_ée_mint} 2 retumesca mae dae anal ii et bist *F t if {bisec: {de::minaa}) return true: else return false: ) dct imavaa bk ode: smaxL1) 9 boolean des:bisect_ de mast) roiencea rve de an asi este biseet*F f if ibisect {de::maxaay) return true; else return falser ' void detiverif min.maxt) verifies date mina si mavinas, Assi dal exe eronata eda un mess de eroare se frteaza data implicita eonesptzatoat, c SE tde::validde_min() == fatso)( fae? sat ieee (de: ermin) + fs fra da mini inplics oe: emingz = 1 Se:iminit = 2 Sc:sminaa = 1600; ) S€(de::valid.demax() 2s faise) ( Hct saLiser (de: ermax) ; se ortenea da maxins inp ‘det inaxee = 31; fet maxll = 12; Ue: naaa + 4900, deitdetint x int Lint al 2 enssuctr pointe obicetlor Se veritiea da mina, maxis coca se inantaza,* ‘ 1 iilizaea obit cane xe wamias Tuna = 2 Evalic aco, nfisor (de: erde) 2k = des omings: Tuna = de: smintd an = desiminaa: , ‘ de::verit min.max0 1 de:de(const de ka) /* cnsieor de copiers *) i nis Qe: | Inline des:60) / connor pein obec ninitiliat*! Tuna ='d- Luna 120 on = dan; Stiwaliddet) == calser( aflser (de: serde); Bi = des mines, June = der:minil: on = de: mina, 1 ’ Inline int deysretzi () ifrewmeaza zis obo eure tC , Saline int de::rettuna() J retumeaza ha obicctuhi core a roturn luna: , inline int de::retan() —//rumeacaanul obisctlu ewent ‘ : 2 Inline void de::afisdatat) iafscza data obictla curen fi print (tei: wd\eluna: td\tan: Sd\n*, =i, tuna,an} ) Be tees sdatamin(] —retumcaza yn pointer spre data minima de “min = new de[de::minze,de: mint de: rminaa) eturn din; , de “Ae: datanaxe() sfrewrneaza ua poner spre data maxio 1 de teLmax = new de(de: mange, de: :maxl, de: :maxaal return dmax: ) vyoid de. smoat fin () /(sbinba data caenornce minima ey data obietau creat c de: sminaz desemintl = Luna de: sina de: veri f_min mat) 1 void de::modi fmax ()_(/schimba data eaendarnicn maxims cu data obits creat t cevinavee = 2b fe:smaxll = Luna 12 eet sverif_minmaxt ) int de::eitdatat) ‘7 eese oda calendaistien 1 Gta shirt de isin, Wa fi fort: forts peinte(*xive: "97 EEL (esseant ("aa* 4i}) break: if|e == Bor) return print (*ziue eronata\n") fElush(seainy ; ae peinte(*tuna: “1; Eel leeseant ("ea" 411) break; ifte == BOF) return o; print (*luna eronata\n")s ffiush(seainy 1 Ge i> 0 ak $e 12) ) Fortsi14 peinte(‘anul: *); 1 Ge 4 >= 1600 66 4 <= 6900) scant ("aa"ki)) if|e 25 Bor) return 0, peint®(vanul eronat\n") Telushiseainy Hert ) ants Lf(vatia_dety == crue) break: prineflsdsta ealendaristicn: te /d/%d\ eronata\n*, 2i,luna,anl+ , return 1; ) fae deriel_ala_ant) ‘i stumeaza civ din an pent data obit cent ¢ int b = bisect (an); ine goat 264) for(int fh < dunas ists 2 ssderstnre(s)+¢ , Boolway des:zinasilunatine x, int a) ‘determi daa ealendisie di i neaivadinan isin Hasan i Ant b = bisect tad: Sf le > 3654) ( i? ziaadia an erent printf ("ziua = 4d eronata\nt,2) return false; ) Lela © 1600 || a > 49001 anu eonat printf (vamul = d eranac\n*,al return falee: int i= ay aot int j = Gcisenes (il (ise? 6& b) sete <= 9) break por: ywontbery; ai= a; luna = iy an» a: Fetura valid det; ) inline char *de::deniinal) "i etureara un pointe sre derma luni osc eaent ‘ rotura lunai2 7 de::tdentuna 0} ‘de: tdenluna (ona); > soolear de:: adzi(1ona #) aha le data abet arcu numarul dele dt de prams 1 long tobzile = 24 ainen i; toteile += ey J mumand ttl dele canes considera dae Sl decembie din anul precedent elu cont *7 int sledinan = 365 + bisect (an: ifleotzite >= 0) white |eoteile » zbledinan) {spo ani */ toteile -= giledinan AEC an <= 4900) ziledinan = 365+bisect (an! , elset Filedinan = 365 ¢bisect (en! while(-totzile >2 2iledinan! (se socotese ani *) totvile += riledinan; edinan = 265+bisect ian): 1 deternina nunacl dezle din nel determina *7 Le(tateile == 0) vi Wy luna = 42) an-~ return valid_det}; return 2iva_si_tuna(totzile, an); ) dong de: dit i ecurncna iere ‘aendrstica cure | ‘ atde *a) im puma de ie ine dats se pe ces poitcaza JY 1 paar de ile din al eure “ans :/* nual de ie dia anu dit de long sidinant = zi_din_an long 2idinand © d—> ia pointeral d™! tong dif2i = zidinand ~ xidinan2; sn snl,an2 if(an am 6 d alee fant = a> an and = fn: , long difzian = 0; while(ant ¢ ana) ine b = bisect ian): Aifeian += 365+0: 1 ifton <-> an) difzian = -difzien: poturn difeit difsians ) Observa 1, Pate mesa, de ois plea elif numer 2 aoe eee acpi desta Matas etapa ea Beane vice ai necmte: ben Acae anal Pana ae delunl se rermands tse spore rane pvie ce alos meniscus eas ua | pera de elt Funetiile membru care nu sint statice se apeleazt numai in legatura eu un bicet al elasei pentru care ele sintfunctii membru, Apelurile unci astfel de 124 Funeti au forma: obiectaume_fimetiel ..) sau pobiect > nume_functie( ..) unde: ‘pobiect - este un pointer spre tipul implementat prin clasa pentru care ‘nume_functie este functie membru Mai sus, s-au apelat functit membru nestatice ale clasei de in corpul altor func;ii membru nestatice ale acelecasi clase fir a respeeta regula de mai sus. De exempl,in corpul funetiei membru citdara se apeleaza funetia membru valid de astfal if(valid_dc() © true} break: Acesta este corect deoarece in mod implicit apelul de mai sus este realizat folosind pointerul ris: if(ehis -> valie_aet) 22.6 Saseseric un program care citeste, de la intrarea standard, 0 suecesiune de ate calendaristice gi afigeaza fiecare data calendaris a zilei urmatoare. PROGRAMUL BXXII6 Hendet _srazoa Hinelude Hefine _srora # fends Alindes _conto_s Hinelude Seanie.a> Hetine _CONTO.# fendi Hnelude *Bxxrr5.cPP’ true) break ‘cites o suecesune de date ealendarstice si afiscacadatle citte lnmpreuna cv data lei srmatoar* Lesa: citita.citdata() == 0) presk; —/saimilnit EOF Gata_citita.atisdacal); —/fatseaa dita ciita = data_citite; | i/opiere ats_urm. aces (14) 7 (determina data ie urotoare Gata_urm-afisdata(); //afieaca daa zl urmatoare , 22.7 Sa se scrie un program care realizeaza urmatoarele: — citeste date calendaristice care sint situate intre doua date limitas ~ afiseaza ficcare data citita impreuna cu diferenta, in numar de ile, dintre 15 data citta gi datete limita, Cele doua date limita se definese prin argumente in linia de comanda a rogramului. Data minima este prima data calendaristica din linia de eomanda, PROGRAMUL BXXII7 sitndet _sro10_H #inciude Zetdio.h> fdefine _stDI0_H fenaie fitndes _stouta_e Hinelude Adotine stDLTB Hitndef __conto_H Hinclude ine tabaral6}; forlint se1;i < Tisee char *p = argelil: For (int 4=0;*p:i++.p+41 EGR <0" [| sp > 9994 printf (*argunent eronat:te\tta\n", *p,*p) exie(: Sed > 400 beluiiCargument evonae: ve\n",argvlil): exietly; ) tabarg{i-1] = atoilargv(il: “conversa srgumentlut de Limin€ (tabarg{0}, tabarg{1, tabars{21); de Linsup(tabarg(3)/tabargi]/tabare (51); Limin€ .afSsdata()2 tafiseazn imi inferioara Limsup.afisdata(); /afiseara limita superioara Liminf.modifmin() ; 1 deinst data stalica minima imsup.nodi fax (); 1 dfinete data statics supetioar 126 1 iinea doer ealendaritice fortis ac cataeres if (ata_ert.citdata() == 01 break; saint Gato_crt.atisdacaiy; /Vaisera daca tong difi, ifs GifisLinint oi fdata(sdata_crt} Gifs = Linsup.difdata (edaza_cet) prince (*dsterenta in mimar de zile = Q1d\n‘.difi,difs) Qe "Dink bint = pint -> datamin(|; Se *peup + Pour = Bsup -> datanaxt) print ("limica inferioara\n"); Bint ~> afiedatac) print |*Linite superioara\n") Deup -> afisdata()s Belete pints aelete peup: , > 22.8 Sa se defineasca tipul abstract punct care sa se utilizeze la instanfierea punctelor din plan prin coordonate rectangulare, FISIERUL BXXII8.H clase puncte double x2 Gouble ¥2 public! Dunct (double abs=0,double ord=0) int =Ltpunct (}; eteste coonloatele peti his EOF 1 att ” void afsepunct (1; /*atiseaa coouinatle pct“ void xtrans(double di): J vansate pediectiaabscsc void ytrans (double dy); /*ansae pe dvetia ordonate Gouble reext); /retumeara aici double recy{); //etumara onlonata Funesiile mambru se definese separat intr-un fier de tip CPP. FISIERUL BXXII8 figndes _punet_# Haclude Ta 18.8 fdefine _puNeT. fenait Lnine puret:epan sable ord > -consruclo- ent instanton obser tip pune 7 npc se istantiaa oigiaca axe. */ inline double penees:zetst) etumears abseisa ‘ fi ee ales y = ord: return a ) 1 nine punet: :punct (const puneeé p) fntine double punct::zetyt)/reumeae oubnats ‘eons de copie t ‘ return espa y= py : , 22.9 Sa se serie un program care genereazi obiecte de tip punct ule caror dnt punee: seitpunct coordonate se yenerexza aleator, Programul afigeazd punctele case apastin 7 see coool peu: ernnulu, iar in final se indica: = numarul mal punetelor afigate: ~ numanul n al punctelor generate; ” = raportul min ‘ PROGRAMUL BXXII9 sitndet _sro10 Vinelude Ndetine _-SrDI0-1 fendi iejessH0r} return’ 0; Hitndee —_conzo_a printecin eva tastat un mumas\nt): include FSusncsesia) Hdet ine —CONTO_# , wens Fortrsit Wundet _sroue peint£(*Ordanata=") : include Te tfesseant 1*,4y) }ee1) return 1 Hoefine _sTouiB_H . itte=sfor) eecurn’ ds Hens pelntfltnu soa €astat un nomae\n") Witelude “Baxtr8..cPP" Felushistaial 1 maint) 2 sonst puncte eu eooronate slestoate iscara pnetele cae parti ceraruls (8D cone Miscwariemrel mal pnctelo afte: afiseaa numarul auger pontslor gener inline void punct::afispunct () 1 atncara coord panctuls i : 1 Intine void ounct: xtrans (double ai) Ine m-0,m0; eeelar ) Gouble waleat = randi)$100, Souble yaleat = rand() #100) punct pet (waleat, yaleat LeGialest > 0 6k xaleat <= 80 65 yaleat > 0 fb yaleat <= 25)( Matias puncte Aline void punct::ytrans (double dy} ‘translate in isso ase y a yo ay pet afiepunct (1 , Setmaza == 0) 128 1 print£(Actionati o taste pentru a continua\n') print£(Rctionaté aero pentru a termina\n"): iffgetcht) == °0") break: d printf(*numarui punctelor afisate = td\n‘,m): print£(*nunarul punctelor generate = ¥4\n" nl; print€(*raportud n/n © Sg\n", (double) /n} } 22.10. Sa se defineasea tipul abstract vector. Un vector este definit de dous puncte, Unul este originea veetorului, iar ccelalat este vieful li FISIERUL BXXIM0.H fimdet _ponct_ Ninelide’ Sexr78.cPP define _PUNCT_H endif class vector punet origine Bunet virt> public: //eonstracton vector (double x0, double yo, double xv, double yb vector (double xv/soubie yy) Goudie modui (); /fmeulul vector Gouble axg(l; argument vector (nghia wi eu axa Os) void x Vian fans [double a); ris in dnetin sxci Ox void y_trana{double ay) 1 ranean deta axel Oy retvirf(}; i seumeara vilul vecorului double prodacslar {vector *v); ‘ etumeaza produsl Sele dst vector cure sca spe ete poimcaa Observa Modutul si argumentul vectorior se caleuleaza asemanator eu modulul si argumentul numerelor complexe. In acest cuz se face diferent dinte caor- donatele extremitatilor vector Functiile membru ale clasci vector se definese in fisicrul de mai jos, de 130 extensie CPP, FISIERUL BXXxII10 Hitndet _vector_H #include *axxt710.4 define _vECTOR Nenait Niindet wari include matin, he fdetine MATH fendst Wenges _ex foetine FE 3.14159205350979 fdetine — pr fendi t inline vector::vector {double xv, double yw) wwirt (v,yv) ‘orginca ar coondonatlecgle eu ev (ale implicit) i } inline vector: :vector Wouble xo,double yo, double xv,double vw) or igine (x0, yo) viz £ Ox, 7) ‘eonseutor pont inialzaten origins vinta en vettor ‘ } vector: :vector (eon! Heossteutorde epiors ) double vector: smodul ()retuneaza mod unui vetor double a= virf.retxi) ~ oxigine.cees(t: Gouble # = virt-rety!) ~ origins: roturn sgrt(atasbeD} , double vector: :aral) —(reucara argument uno vector c double a = virf. Souble b= viel. ifta i txt) ~ origine.retxt); fla» 0) return 0.0; else recuen PT eta Let > 0) return Pr/2 else corurn(3¥P1)/2) yist=osibi=o double © = atan{b/al; tla <0) return Prey MasOsb vectors v): arigine v.origine) ,virt (v.virt? Br return 2+PT4e; Ha>Osibeo ith < inline void vector: trons (double ‘ Yar xtzons (de) , 2). uals in diretia ancl OS inline void vector: :y_trane (double dy) translate in dsetia aei a origine-ytrans (dy! rebereranet inline punct vector: :rakorig( | //reiumeszs onginea veto , Line punct vector: :zervirt() J/reumsnza vil veetonui lector :prodacalarivector "vi * rtumeaza piso seaar dines vectra coe el spe care pinteazav 7 double ax = v -> vire.retx() = v -> origine.retx(s double ay = v > vine rety0) ~ y “> origine.eety 0); Gouble by = virtretxi}'~ origine.cetx() Gouble by = virflrety!) ~ originesretyO) 22.11 Sa se serie un program care citeste coordonatele a doi vectori din plan gi afigeaza modulul si argumental figcarui vector, precum si produsil lor scalar PROGRAMUL BXXII11 Hlindet _sro10. include’ Setdio.he foot ine vena t fitndet _srousn. a Fendi Nincls maint! * cette eaodontle 3 doi veto, “ealeuleaa atic ‘moduli agua sar vectors presalsclaral lor dv vector t panct ovis ifovigine ponee ws fv Panet ov2; Worigine punct w2) U/vitt eétete rial vector ovleitpunct() vo leitpunet 0) eiteste a doites vector ovz.eitpunct (07 wa eitpune Heonsinieste vector vector Vilov!.retx() ,ovl.rety (), Wt. xetx() wwh.rety(} vector v2(ov2 rete(] avd rety(} /wv2 retail) wa cotyU) (fiscuzn modal i agua i vi v2 printf |-Veetaru) viva") PeintEItmodul = Sg\t argument = te\n*,vimoduli).v1.aeg1)); Brinté(-Vectobul vain") rmodul:= 8g\t argunent, = tg\n",v2.modul(},v2.azg1})s 2 afc produ salar print ("ivi.w2) = tg\n*,vi.prodscatar (év2)): , 22.12 Sa se defineasca ipul abstract sir pentru instanticrea sirurilor de caractere, Acest tip este definit in cele mai multe Iucrari relative fa limbajul C++ Interesul manifestat pentru acest tip rezulta din faptul ca sirurile de earactere Sint tiizate freevent in aproape toate programele. Mai jos, prezentam implementare a tipului sir analoga cu cea indicata in lucrarea (7) ‘Cadate membru alegem un pointer spre zona de memorie in eare se pastreaza ccanieterele sirului si lungimea acestuia in numar de earactere (fara earactenal mul dela sfirsitulsirului. FISIERUL BXXII12.H class sir { pblies Sir (char +) ( consimtor pen initrare abiectoli cu pointe spe sia Ale caretere: nes separa in memoria heap"! 133

You might also like