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

You might also like