You are on page 1of 218
Success with C++ Kris Jarnea Copyright © 1994 Jamea Press Succes cu C++ Kris Jamsa ‘Traducere: Ion Fatu Copyright © 1997 - Bditura ALL EDUCATIONAL S.A. ISBN 973-9229-56.0 ‘Toate dropturile rezervate Buiturii ALT, EDUCATIONAL $.A. [Nici o parte din acest volum nu poate f copiata {ara permisiunea serisi a Béiturii ALL EDUCATIONAL S.A. Drepturile de distribute in strainitate apartin in exclusivitate editur Copyright © 1997 by ALL EDUCATIONAL 8.4. All rights reserved. "The distribution ofthis book outside Romania, without ‘the written permission of ALL EDUCATIONAL S.A. is strictly prohibited Edura ALL EDUCATIONAL S.A, 34, Timigoara nr. 58, sector 6, cod 76548 ‘@ 912.11.46, 912.43.2), 311.07.44 Fax: 81.05.65 Departament eifuzare: 9 912,18.21, 91.15.47 Rodactor: poof Usorice Fate i Mihai Ministers Tehnoredactere computerzaté: Roxana Cornelia Nistor PRINTED IN ROMAN SUCCES CU C++ KRIS JAMSA Traducere: Ion Fatu HUIWLU sei Incolectia SO WaTE a editurii ALL EDUCATIONAL ‘Au apinst: 1. Microsoft Access pentru Windows 95, Ghid de referinta - James B. Powel © Sybex 2, Ghidul secret al caleulatorului - Russ Walter © Sybex 3, Word pentru Windows 95 - usor si rapid - Christian Crumlish © Sybex 4, Bxcel pentru Windows 95 - ugor sirapid- Gerald B. Jones © Sybex 5. Microsoft Excel pentru Windows 95. Ghid de referinta - Douglas E. Hergert © Sybex 6, Primii pagi in Internet - Christian Crumlish ore Vor aptrea: WED AUTOM, | aoe $2883) 1. Biblioteca programatorului ActiveX - Suleiman Lalani, Ramesh Chandak ‘© Jamsa Press 2. Ghidul programatorului in Web - Kris Jamsa, Suleiman Lalani, Steve Weakley ‘© Jamsa Press 3. Biblioteca programatorului Java - Suleiman Lalani, Kris Jamsa Odamsa Press ee 4, Programarea in Internet - Kris Jamsa, Ken Cope (© Jamsa Press CUPRINS ‘Sectiunea 1 - Acomodarea Capitotul 4 ‘Acomodarea cu tastatura gi ecranul SSA Inielegem strear-urile /O ‘Sa Injelegem cin $i cout Redirectarea stream-urilor VO Folosirea altor stream-uri vO Rediijarea iesii programelor Sa Injelegem stream-urie VO Sa injelegom stean-uile de inrare giiegre Caractere speciale LCucrut cu manipulator Stablirea bazei de conversie Control &timii zonei de aliniere oe Stablirea caracterului de umplere sn : 4 BeDDODODARO™ > Controlul aig valorlor In virgula mobila 2, Golirea butfer-ulul 8 Ignorarea spatilor aibe ce preced datele de intrare B Controlulindicatorilor streamului WO. a 14 ‘Afigarea valoriior hexazecimale cu majuscule tS Alinierea rezultatelor la stanga sau la dreapta 16 - Gontrolulafigri cu punt fix si cu exponent. 16 Fortarea afigari punctului zecimal Mnninnnnanncne Nt Fortarea afigarii semnului unei valori : 18 Refacerea indicatorlor stream-urilor VO ann 18 Folosirea indicatorior WO... : 19 Faciliat oferite de functile membru ale stream-ului de intrare 19 Determinarea numarului de caractere extrase snr Cities unel ini de la tastatura sau de la stdin E20) Folosirea funetilor membru ale stream-ului cin ems] Realizarea operatilor de intrare caracter cu catacter 22 ‘Anticiparea urmatorului caracter [a intrare a 23 Readucerea unui caracter In buffer-ul de intrare one Detectarea sfarsitulul de figier : cS Ignorarea caracterelor din stream-ul de intrare - 25 Gitrea 51 salvarea difertelor valor ale parametrior VO... 26 : e ete s ‘$8 infelegem parametri stream-ulul de 1egif@ oe ennnnnene BT . . Faciitat oferte de functile membru ale stream-ului de iegire 2 Folosirea functilor membru ale stream-ulul cout... 28 ‘Testerea reusitei operatilor 1! 28 83 intelegem starea unui stream iO... 30 Vil Succes cu C++ Intrar-iesiri cu gi fra buffer Golirea unui buffer de lesire i Folosirea functilor membru pentru controlul indicatonlor de stream VO Rezumat Capitotul 2 ‘Acomodarea cu clase gi obiecte Primul contact cu programarea orientaté pe obiecte Sa infelegem promovarea orientatd pe obiecte Sa simpliicam defintile unel clase ‘38 intelegem mostenirea ..... Ingineria programelor $i folosirea obiectelor ‘Sd infelegem obiectele si clasele Diferenta intre clase si cbiecte Analiza unui exemplu complet wn. Cand se folosesc clasele gi cand structurile ‘Accesul la membriunei clase . Folosirea functor inline Definirea functilor membru in afara clasei Rezolvarea confictelor de nume Intre membri si parametti Rezolvarea conflictelor de nume : * Sa infelegem membri de tip private ai unei clase ‘Sa infelegem membri de tip private ai unei clase 'S8 infelegem camufiajul informatie ‘Sa infelegem constructoni i destructori unei ciase ‘Sa Injelegem functile constructor 8 intelegem functile destructor Sa infelegem functile destructor Folosirea functilor constructor multiple Folosirea argumentelor prestabilte la functile constructor Un alt mod de a intiaiza membrii unei clase : Atribuirea valoril unui obiect alt object Obiecte gi functi Folosirea obiectelor si a functilor ‘Sa Infelegem membriiunei clase Folosirea unui tablou de clase Rezumat Capitotul 3 ‘Acomodarea cu fisiorel a Intelegem operatile UO cu fisiere + Deschiderea unui figier pentru iesiré Deschiderea unui figier pentru iesire Folosirea functiei constructor pentru deschiderea unui figier Folosirea manipulatotilor gia functilor membru de iesire .. Vill 30 31 31 33 Cuprins Realizarea operator de scriere formatata a fisierelor 7 Sofierea formatata a figierelor ee 78 Controlul modului de deschidere a fgierelor de lesire ..... 78 Caractere speciale gi fsiere VO 73 Ati specificatori al modului de deschidere a fsierelor 79 Controlul operajwor pe fisiere 80 Deschiderea fisierelor pentru operatii de intrare at izarea operatilor de intrare pe fisiee ... semen OF Deschiderea unui fisier pentru intrare see 83 Testarea reugitel unei operafi YO 84 Realizarea operatilor pe figiere binare : eta Realizarea operatilor pe fisiere binare een BQ Aeentie la operatile de insertie/extractie cu fsiere binare 89 Desch derea fisierelor pentru operat de citre gi SCti@7@ .snronnnnenn nn 92 Figiere cu acces aleator 92 Recaptularea modurilor de deschidere a unui gier 94 3 Intelegem figierele cu acces aleator 97 Realizarea iesii la imprimanté snr snes ST Rezurat nn 8B Capitolul 4 ‘Acomodarea cu mostenirea claselor Conceptul de mostenire o ‘Analiza unui exemplu simplu . SA intelegem mostenirea Clason y...nsnnnssnennnnneen. 108 Folosirza functilor constructor la mostenirea claselor : 107 Analiza unl ex2MplW on . 110 'S8 Infelegem cuvantul-chete public’... 112 Analiza altul exemplu see errs Un ultim exemplu de mostenire pe un singur nivel 116 Prototipur,revizil finalizar sminnnoannanannnnnanan AY Sa infelegem mostenirea muttipla 122 Sa Infelegem mostenirea muttipla .. 125 'S3 Intolagom mogtenirea pe mai multe nivele ree 125] Sa Intelegem membril de tip protected ai unei clase semen 1B ‘Sa Infelegem membrii protejai ai unei clase 131 Rezumat 7 . 131 Capitotul 5 ‘Acomodarea cu suprapunerea functillor gi operatoriior 133, ‘Sa Inteegem suprapunerea functillor . 134 'S8 Intelegem suprapunerea functilor.. sonnei 135 >) pentru a atribui variable firstname iterele introduse Hinclude > Firstar cout << “Hello, * <« first_nase } Programul foloseste operatorul de iesire pentru a afiga solicitarea de introduce- re a numelui ullizatorului, dupa care, folosind operatorul de intrare, atribuie va- rlabllelfirst_narne lterele tastate. Apo, foloseste Inca o data operatorul de iesire pentru a afiga mesajul ,Hello*, urmat de numele introdus: cout << “Hello, * << first nane: Cand tiparitiinformati folosind operatorii de extractie mulipla in acest «nod, (C++ afigeazd inforshatia aga cum apare in instructiune, dela stanga’Spré dreap- ta. Rulat! programul anterior si introduce prenumele, urmat apoi de numele dvs. Veti vedea c& programul afigeaz numai prenumele, indiferent de informa. 4: Tastatura si ecranul Hinclude vyotd maixvoid) char frst_nanef64]: char Vast fiame( 64]: cout << “Type your first and last nanes: Cin > first_nane >> Tast_nane: cout << “Hello, * > first_rane >> Tast nane: Cand folositi doi sau mai multi operatori de extragere in aceeasi instructiune, C++ alribule variabilelor valorile de la intrare, incepind de la stanga spre sreapta, Observati, de asemenea, folositea ghilimelelor in mesajul de iesire, pentru a separa prenumele de nume. Daca indep&rtaii ghilimelele, numele va fi seri, fa pauza, in continuarea prenumelul cout << “Hello, * << Firstname SUCCESS > OUTPUT.OAT Urmatorul program, LINE_NBR.CPP, afigeaza un intra redirjate. war In faga flecdrel Yinil a include LINE NBR < SUCDESS.CRP 2 3 void masn(votd) 4 ( 50 . ne pets 5 cout CUTPUT.OAT «Enter FOLOSIREA ALTOR STREAM-URE I/O Majoritatea programelor C++ pe care le vet) intalni folosese stream-urile de YO cin $i cont. Asa cum se va vedea, fisieru IOSTREAMLH defineste gi stream-urite VO cerr gi clog. Tabela 1.1. deserle pe scurt diferite stream VO" Stream _ Sop. Exemplu cin rare tata (stn) cin >> name cout iepreecran stdout) cout <<“iello, woe etree spent ero standard (der) com <<"Broate ced dog__epre buferiata pe spony era standard (stden)_clog <<"Meso)eroare Tabla 1.1, Rezunat al stream-arilor HO dis C++ "REDIRUAREA TESIRI PROGRAMELOR Cand se ruleazi un program, C++ asdctaza streamate WO fn si cout ca ckpoztivele standard de inirare, respectiv iesie. In rod prestabiit,sistemul de operare asimileazs fispoctivul standard de inrare cu tastalura, iar dispoztvul Standard de iesite cu ecranul monitoruti, Daca se apeleaz tin program C++ folosind operator de redinare VO fn linia {ge comands, se ponte rein nara gi exiea program Cu ate cuvinte 86 ‘poate reita streamal de iesie cout de la eran spre un fgler sau un alk pro- lg! in mod asemanitor, se ponte redira stream de-inirare cin de a asta Cand wm program canta st proceseaza erorile crtice, mesajele de eroare nu pot Fredinjate de la ecrantl monitorului. In acest caz trebuie folosit stream-ul cert pentrt afisarea mesajelor. De exemplu, urmatorul program, USE_CERR_CPP afigeaz2 un mesa) folosind cerr include Incercaji s4 Compilalj $1 sii executati acest program, folosind operatorii de redirjre ai sistemului de operare, Vet sedea c& mu este posbi redirarea 5 Succes cu C++ ‘mesajelor scrise cu cer. Mal tarziu, tot in acest capitol, vel! examina iesirea prin buffer folosita de cout gi clog. aa =r: iNTELEGEM STREAM-URILE 170 ] | {in cel mai simplu sens, un stream VO este o suecesiune de| caractere, sctise pe ecran sau ctite de la tastatur, Fisierul anlet OSTREAMH defineste patra streamer VO: cou cy cem si clog. Strearm-ul cow permite afigarea rezutatelor i fcran sau pe dlspostivul de_iegre standard, In mod asemnator, cin realzeazd crea caracterelor de la tastlur8 [sau de la dispocttval standard de intrare. In sfrsit, cer si clog determina) Iprosramele si afigeze tesirea pe disposiival de eroare standard. Pentru a irea spre un stream I/O, se foloseste operatorul de extragere (<<), 1 | cout > nune>> prenure: ‘SA INTELEGEM STREAM-URILE DE INTRARE $I IESIRE (>), ca, ‘Multi dintre manipulatorii si funcfile discutate tn acest capitol corespund strearrvurilor de intrare si iesire. La examinarea fisierulul |OSTREAMH veti gsi unele definiii ce folosesc ios $i altele ce folosesc istream si ostrearn, Definite ce folosese fos corespund stream-urilor intrare $i iesire (de aceea apare pre- scuriarea jo). in mod similar, definitiile bazate pe istream corespund stream- urilor de intare, iar cele bazate pe ostream - streanurile de iesire. Prin exami- area definiilor stream-urilor se poate infelege mai bine flecare manipulator sau functie membru in Capitolul 11 se vor trata mai detaliatrelalleintre clase, CARACTERE SPECIALE Unul din programele precedente a folosit manipulatorul endl! pentru a genera 0 _secventi CRLF. (retut de.car_- avans hartie). in mod asemanaior, urmatorut pro ‘gram, THREELIN.CPP, foloseste un manipulator endl pentru a afiga lesirea pe 1: Tastatura si ecranul include ‘oid main(void) cout < “Successn << endl: cout < “with, << end?: cout ce “Cet void mat (void) cout < “Success” << endl << “With” << endl << "GHel” << endl: } in mod similar, un alt program prezentat anterior in acest capitol folosea caracte- rele \t pentru a genera tabulatori, Cand se realizeaza iesirea pe cout, cerr sau clog in streamul de iesire se pot folosi caracterele speciale prezentate in Tabela 1.2. Caraceral _ Semnifiea « ‘ert sau clopotel » Backspace v Inceputde pagina w Inceput define novs (ehivalent cu end) v Cariage tum Gneeputul inet curente) fra avand hare nefeed) “ Tebulator oizonta wv Tabulatorveetia v Backslash v Sern de itvebare y Apostrot hitimete ” Ccoracter mt ‘000 Vatoare in octal, 3033 : ‘uhh ___Vatoarenexazecial ca 6 1B Tabeis 1.2. Caractere speciale flosite cu cout, cert si clog, Succes cu C++ Urmatonul program, SPECCHAR CPP, foloseste aceste simboluri speciale pentru a sterge ecranul si apoi pentru a emite un semnal sonor prin difuzorul calculatorului, Pentru slergerea ecranului, tebuie s& fie incarcat driver-ul de dispozitiv ANSI, Prograsmul foloseste secventa speclald ANSI Ese[2J pentru a sterge ecranul Hinclude void maincvotdy { Corr << “\aSome error message\t\ K-11 0": 3 Dupa cum se poate vedea, programul foloseste caracterul \a pentru semnalul sonor si caracterul \t pentru a genera un tabulator. In Capitolul 11 veti invata um s8 crea proprli dumneavoasiré manipulator ce corespund acestor crac: lere speciale LUCRUL CU MANIPULATOR! Un manipulator de stream V/O este un element prin care se fitreaza iesirea unui stream /O. De exemplu, manipulator hex, oct si dec determina afigarea net valori in hexazecimal, octal sau zecimal. Urmatorul program, MANIPULA.CPP, ilustreaza modul in care sunt folositj acesti manipulatori. Hificlude void main(votat ‘nt nusber = 1001: cout << “Decinal: * << nurber << "\tHeradecinal: * << satbase(16) << number << endl: cout << “Decinal: * << setbase(10) << runber << “\tOctal: * << setbase(®) << runber << end: y Observatie: Dacd compilatonil pe care il folositi nu include manipulatoral setbase, pute(folosi manipulatorul setlosflags. De exemplu, pentru a selecta baza hexazecimalé, folosii setiosflags (Ios::hex). CONTROLUL LATIMII ZONEL DE ALINIERE Céteva din programele anterioare au folosit spai in interior sirurilor de carac- tere pentru a formata afisarea acestora. Pe langa aceast& metoda ,brutala de spatiere, programele pot folosi manipulatorul setw care specificé numarul minim de poziti ale zonei de alinere, Daca 0 valoare necesita mai multe carac~ tere decat numérul specificat in sett, atunci pentru afigarea ei vor fi folosite atatea caractere cite sunt necesare. Daca o valoare necesita mai puyine ca- ractere, atunci spali suplimentare vor finserate inaintea valor afigate. Spre de- osebire de manipulator dec, oct, hex si setbase prezentati mai inainte, manipu- latorul setw are efect numai asupra valoril urmatoare. Cu alte cuvinte, alinierea stabilta prin setw nu este permanent’, Urmatorul program, SETW.CPP, ilustrea- 24 folosirea manipulatorului setw: include include void main(void) ¢ int: for Gm 1:18: 14) cout << setw(i) << 1 <« setw(s) << 12 << setw() << 123 << endl: ) Deoarece latimea zonei de aliniere selectata prin setw influenteazd numat turmatoarea valoare afigaté, programul foloseste manipulatorul de céteva ori in aceeagi instructiune. La compilarea si execulia acestui program, pe ecran vor fi afigate urmatoarele: Cap Seni “sem” 5 (pSantene iueiz3 setw(i) m2iz3 setw(2) 10 1: Tastatura si ecranul qin Lie 1 setw(3) setu(4) Dupa cum se poate observa, dao valoare are mai multe caractere decat cele Eelectate de ser, ea va fl afigata cu toate caracterele necesare,[n cazul primel Tl de fesie, toate cele tei valor contin cel putin o cif. Ina doua lnie sunt locate dous caractere penirs fecare valoare, in a trea line - tre, at ina patra Tine - 4 earactere. Se observ clin uma line, valoarea 1 este precedaté de 3 spa, valoarea 12 - de doua spa iar valoarea 123 - de un spau. STABILIREA CARACTERULUI DE UMPLE! ‘Aga cum afi invatat, manipulatorul setw permite specificarea lagimii minime a zonei de aliniere. In mod prestabilit, stream-urile /O folosesc spatiile pentru ob- {inerea unei spatier corecte intre caractere. Cu ajutorul manipulatorului sei! Se pot specifica si alte caractere de completare a zonelor dintre valori. De ‘exemplu, urmatoarea instructiune dirijeaza strearn-ul cout pent a folosi punc- tul drept carecter de completare: cout Yeid main(void) € int: cout << sat 711 for (i= 1: 4 <5: 44) out << setw(i) << 1 << setw(i) << 12 << setw(i) << 123 << endl } Prototipul pentru manipulatorul setil se gaseste in fsierul antet IOMANIP.H, La. ‘compilarea si executia acestui program, pe ecran va aparea: C:\> SETFILL : ss M2123 112123 1.12123 eed nd212 Succes cu C++ (© ulilizare frecvent& a manipulatorulul serif este la crearea unui menits sau a tunel table de cuprins, dupa cum se vede in continuare: Cuprins Capitolul |, Iniierea in intirviesii cu tastatura. . Capitolul 2. Initierea in clase. Capitolul 3, Inifierea in figiere.... CCapitolul 4, Injierea in clase template Capitola 5 Intierea in mostenire. Urmatorul program, TABLE.CPP, ilustreazé modul in care mani ccreeaza tabela precedenta: Hinelude «iostrean. tr #inelude void main(votd) { cout << setfNC."): cout void maintvoid) eam 6 eset * Dupa cum se gle, sistemul zecimal anglo-saxon foloseste virgula in lou punctulut slinvers. -NR 12 | 1: Tastatura si ecranul PR fon Ci = 0: 1 < 10: H4) | ‘cout << Setareciston(#) <= 22,0 / 7.0 << endl oe ‘Asa cum se vede, programul cicleaz’ de la 0 la 10, folosind setprecision pentru ‘controlul nurndirului de cifre afisate. Prototipul manipulatorului setprecision este > ws >> camp: Succes cu C++ eee De exemple, urmatorul program, SKIL_WS.CPP, foloseste manipulatorul ws pentru ignorarea spatilor albe plasate inaintea textui ipa include #include void main(vord) € char text{128): cout << “Type in a word preceded by one or more blanks” << endl: cin >> ws >> text: Cout << "You typed 97 << text <¢ * endl; CONTROLUL INDICATORILOR STREAM-ULUII/O ‘Asa cum afi invatat, 0 parte din manipulator stream-ului YO rman activ) st dupa incheterea unel operaii de intrare‘iesie. De exemplo, manipulator des, hex sh oct selecteaza baza de afigare a valoilor numerice. Pentru a implementa acesti manipulator, stearurile YO au un cmp indicator (fag field) care. Specificd valorile curente ale parametilor. Un fisier antet defineste aceste valor, cca flind de tip enumerativ, dupa cum se vede mai jos: enn { skipws = 00001. eft = ox0002, right = 0x0004, ‘nterna) = 0x0008, 11 Skip white space during input 11 Left Justify: output 71 Right. justify outout 11 Pad after sign or base indicator dec = 030010, 11 Decimal base ‘oct = 0x0020, 17 Octal base. hex = ox004o, 17 Hexadecimal bese 1/ Use base indicator on output 71 Fores dectnal point for floating point 1/ Uppercese hex output W/ Add‘ te positive intesers 1/ Use 3.1415E2 floating notation 11 Use 314.45 Floating notation U1 Flush all streams after insertion I Flush stdout, stderr after insertion showbase = 0x0080. showpoint ~ 00300 Uppercase = 0x0200, showpos = 0x0400. setentific = Ox0800. fixed = 01000, unitbuf = 012000. stdio = Ox4000 y Prin folosirea manipulatorilor setios/lags, programele pot controla o buna parte Gintre acest indicatoriDe"exémplu, urmatorul program, 1OSFLAGS.CPP, fol * este indicator dec, oct, hex si showbase pentru a afiga un mumar in zecimal, ‘octal si hexazecimal 14 | | 1: Tastatura si ecranul include void main(vord) ‘ cout <« setiostlags( ios: showbase); cout << setinsflags( fos: idee) cout << “Id in decimal is." << 10 << endl: cout << setiasflags( ios: :oct) cout <€ “10 in octal is * << 10 << endl: cout << pe NE ees La compilarea si executia acestui program, pe ecran va aparea’ Ca\> TOSFLAGS tare 10 in decinal 15:10 10 in octal is 312 10 fn hex 1s Oa In acest can, indicator iosishowbase deans sear cout 8 prefiere sao ote or cle hexneca a Or. une cant pont neve ‘area mai multor indicatori simultan, Aceasta se poate realiza printi-o operatie OR (SAU) intre indicatorii dori, cum se vede in continuate: cout < include void main(votd) { cout << “Lowercase: ~ << hex << 265 <<" << 10 Lowercase: ff a Uppercase: FF A ALINIEREA REZULTATELOR LA STANGA SAU LA DREAPTA In mod prestabilit, stream-urile VO afigeaza tesirea aliniata la stanga. Prin folost rea indicatorilor ios:left§\ios:vight, programele pot controla alinierea iesiri, De fexemplu, urmatorul program, LEFTRITE.CPP, foloseste indicatoril mentionati penini a alinia iesiren ata la stanga, cat sila dreapla: Hinclude void main(voia) { cout << sec‘astlags(ios::fixed) << 128.48 << endl ‘cout << 12545,6789 FIXELOAT 123.450000 12345.678800 1.23a600e+02 .2aassuer0e Dupa cum se observa, formatul os:fixed dirjeaza stream-ul V/O pentru afigarea punctului zecimal tn pozitia sa actual, In timp ce indicatorul iost:scientifie dirjjeaza strearm-ul VO sa foloseascd formatul exponential. FORTAREA AF.SARII PUNCTULUI ZECIMAL ¢ Cand programele afigeazé rezultatele unor operaiii in virgulé mobil, nu fintotdeauna punctul zecimal este tiparit, in spectal cdnd rezultatele sunt exacte (fara parte zecimala). Sa consideram, de exemplu, urmatoarea instructiune: cout <<10.0/5 << endl: Deoarece rezultatul imparyril este exact, stream-ul /O poate tipari valoarea 2, in loc de 2.0. Daca se doreste si tiparirea punctului zecimal, se poate folosi Indicatorul ios::shoupoint, Urmatorul program, SHOWPOIN.CPP jlustreazd folosirea acestul indicator pentru fortarea afisarii punctului zecimal. include void maincvoid) cout << 10.0 / 5 << endl cout << setiosflags(ios::showpoint) << 10.0 / § << endl: y 7 18 Succes cu C++ La compllarea si execulia acestui program, pe ecran va aparea’ C:\> SHOKPOIN, 2 2.00000 FORTAREA AFISARH] SEMNULUI UNET VALORE in mod prestabilt,stream-uile YO afgeaza numai semnul valorilor negative. In funcile de scopul programilui, uneori este necesara afigarea semnultl plus in fata valorilor pozitve, In astel de situa, programele pot foosi indicator fos::showpos. De exemplu, urmatorul program, SHOWPOS CPF, ilustreaza folo- sirea acest indicator Finclude include void nain(voie) { cout <¢ <1) ee ee Gee eeQ ee ecb ee 10 << endl ‘cout << sotiostlags(ios::showpos): cout <1 cet ee Seen eeD eet eh eet ae 10 << end d Dupa compilarea si execulia acestui program, pe ecran va aparea: ccs\> sHomPOs 10 5.05.10 219-5 045 +10 Hinclude ~ characters” << endl: 3 Observatie: La contorizarea caracterelor unui string (sir de caractere), functia gcount include si caracterul CR (carriage return - retur de car) - adied, dacd introduce siral 123, valoarea lui geount va M4 Compilati $i executati acest program. Experimentatl funetia gcount introducénd siruri cu numar diferit de caractere. Avet| in vedere c& gcount include si caracte- nul de sfarsit de linie CR, << cin.geount() << 7 %CITIREA UNEI LINDE LA TASTATURA SAU DE LA STDIN Cand programele realizeaza operat de intrare folosind stream-ul de intrare cin, acesta separa valorile prin spati albe (spatii simple, tabulatori sau caractere sfarsit de linie). In functie de valorile pe care programele trebuie sa le introduc, poate finecesara citirea unei lini intregi de text, ca apoi parti ale acesteia sa fie relucrate, Pentru citirea unei linii de text, programele pot folosi functia ‘membru getline. Urmatorul program, GETLINE.CPP, foloseste funcjia membra getline pentru citirea unei lini de text de la tastatura. include ‘void nain(void) te char Tine( 122) ‘cout << “Type in a Tine of text and press Enter” << endl in.getlinetline, sizeof(1ine). 1°): cout << “First Vine: " e Tine << endl: in.getline(T ine, sizeof(Tine)): cout << “Second line: * << Tine: } Compilati si exacutati acest program. Dati la intrare o Serie de cuvinte separate de caracterul X Programul va afisa textul ce precede caracterul X pe prima linie sitextul ce urmieaz dupa X pe a doua nie. Observatie: Coracterul X in acest program este dependent de tipulliterei (case- sensitive). Litera micd 'x' nu va determina oprirea intrarii la primul apel at functiei cin.getline. De asemenea, pand la introducerea caracterului X, puteti tasta ENTER or‘ de cdte ori dorit férd a opri operatia de intrare ta primul apel al lui cin getline; aceasta se va tncheia la prima tastare ENTER dupa introducerea ccaracteralui X. ‘TOLOSIREA FUNCTILOR MEMBRU ALE STREAM-ULUI CIN ‘Asa cum s-a spus, cin este un obiect de tipul istream. De ‘aceea cin suporta mai multe func{i. Urmatoarea instructiu- ne, de exemplu, foloseste functia membru getline pentru a citlo linie de text de la tastatura cin.gotline (line, sizeof (1ive)): “in din figierul IOSTREAM.H, putett determina| cn 22 ‘Succes cu C++ -REALIZAREA OPERATHLOR DE INTRARE CARACTER CU CARACTER in functje de cerintele ce intrare ale unui program, uneor sunt necesare operat de introducere a céte unui singur caracter. In astfel de situati se poate folosi functia membmu get. De exemplu, programul urmator, YES_NO.CPP, invté ui- zalorul sé introdued un rispuns prin una din alterativele Y sau N. Programul foloseste functia membru ger pind cind intlneste caracterul ¥ sau N: #include void maincvoid) char letter: ‘cout << “Typa a Y or Wi: oof etter = etn. get0) 11 Read a character letter = toupper (letter): 11 Convert to uppercase }owhile (letter {= 7") BR (letter I= "N')): cout << endl << “You typed: “ << letter Frnclude TO_UPPER < TO_UPPER.CEP ANTICIPAREA URMATORULUI CARACTER LA INTRARE in functje de cetintele de intrare ale unui programm, uneori este necesara citirea tunor caractere pan la un anumit caracter, cu exceptja acestuia. De exemplt, S& presupunem ca un program citeste un fisier ce confine nume urmate de rnumere de telefon, ca mai jos: Joe Smith 555-1212 John Davis 222-2323 Betty Lou Johnson 333-3943 In acest caz, programul ar putea atribui caracterele ce preced numérul de telefon unei variabile de tip sit, Pentru a citi caracterele pand la un anumit caracter, se poste folosi funcjia membru cin.peek. Functia citeste un caracter din bulferul ce intrare, fara a4 scoate din buffer. Urmatorul program, 7O_DIGIT.CPP, va cere s4 introduceti cuvinte, urmate de un numar. Programul foloseste functia membru peek pentru a localiza prima cifra, atribuind caracte- tele care precec numérul unul sir de caractere denumit fine: Finclude Hinclude void main(void) : { char letter, string(12é]: int 1 = 0, done = 0: cout << “Type ina string terminated by a nurber* << endl: dof etter = cin.peek(): Af (1 isdigitcletter) stringCite] = cin.g2t( else one * 1 } while ((1 done) && (4 < sizeofstring))): stringCi] * WLL: cout << “String input: " << string << endl 23° 24 Succes cu C++ Observatie: Majoritatea programelor ce folosesc functia membru peek pot five- scrise pentru a elimina necesitatea prograrelor de a folosi functia, tmbundté- Jindwle astfelclaritatea. Dacd folosif in programe functia peek, trebuie sd aveti in vedere si modalitaji de a rescrie programele, READUCEREA UNUI CARACTER IN BUFFER-UL DE INTRARE Programul anterior folosea functia membru peek a stream-ului de intrare pentru a determina urmatorul caracter din buffer-ul de intrare. In functie de operatile efectuate de un program, uneori poate fi necesara plasarea unui caracter in buflerul de intrare sau plasarea in buffer a altui caracter decat cel citit. In astfel de situatii, programele pot folosi functia membru putback. Urmatorul program, PUTBACK.CPP, citeste caractere din buffer-ul de intrare, afigand numarul de ca raclere cite. Programul contorizeaz numai caracterele majuscule. La intélni- +a une’ litere mici, programul plaseaz4 Inapol in buffer majuscula echivalenta: Hinclude = 'a") ab Catter = °2")) ‘cin. putback(toupper (letter)): else if ((letter > 'A') Bh (letter = °2")) countLTetter = *A'Je# } while (letter = “\a"): for (= 0: 1 < 26: i) ‘cout. put (char) (*AT + 4D): 7 : cout <<” <© count] << endl: £ y ) Dupdcum se obser’, dar programul.intélneste 0 Werd mcd el foloseste iunctia membru purback penta plasa itera majusculé echivaenta ‘in bufferul 4e intrare. in acest mod, programul va contoriza nurmailterele majuscule. Tastatura si ecranul : Majortatea programelor care folosese functia membru putback pot ff rescrise fard a folosi aceastd functie, imbundtatindu-se astfel claritatea ‘acestora, Daca foiosit! in programe functia pulback e bine sd ud gdndi la modalitat de a rescrie acele programe. DETECTAREA i RSITULUT DE FISIER Capitotul 3 examineaza in detaliu operatile cu fisiere C++. Veti afla atunci c& sulte programe citese fisierele de fa inceput pana la sfarsit, folosind functia membru eof de detectare a sfarsitului de fisier. Cand scrieti programe ce folosesc redirectarea VO, putel} folosi funciia eof pentru depistarea sfarsitulul intrariiredirectate. De exemplu, urmatorul program, LINE.CPP, citeste dintr-o intrare redirectata si apoi afigeaza numarul de lini citite: include void main(votd) { oh char Vine( 266): | Tong: count = 0: ote (1 cin.eof) ‘cin. getTinetline, sizeof (Vine) count: y cout << “Lines read: uh _Dupa compilarea acestui program, << count << endl putetl rediria intratea, ase: * ‘Ge\e LINEENT. < LINECKT.CPP. Uires read: 15 Dupa cum se vede, acest program, ca $i altele prezentate In acest capitol, cicleaza pind la intdinirca efargitului de fisior. IGNORAREA CARACTERELOR DIN STREAM-UL DE INTRARE La realizarea operatilor de VO, pot exista situa cind se doreste ignorarea caracterelor din stream-ul de intrare, De exemplu, sa presupunem c& un program trebuie 58 citeasc& urmStorul fisier gi are nevoie numai de numerele de asigurari sociale’ ‘Smith,John —111-22.3333, Lewis, Bill 222-33-4444 Jones, Mary 333-445555 26 Succes cu C++ Folosind functia membru ignore, se pot ignora caractere din stream-ul de intrare. De exemplu, urmatoarea instructiune dirjjeaza cin s& ignore urmStoa- rele 10 caractere de la intrare: cin, tgnore (10): Programele pot, de asemenea, si dirijeze stream-ul VO pentru a ignora caracte- rele pana la intdlnirea unui anumit caracter, De exemplu, urmatoarea instructiu- ne determind cin sa ignore primele 10 caractere sau caracterele pana la litera A inchusiv: ein.ignore (10,.°A')s v ‘Inacest caz, cin va ignora cel mult 10 caractere. Cu alte cuvinte, dac’ litera A apa- re In primele 10 caractere, cin nu va mai ignora caracterele ce apar dupa litera A. CITIREA $I SALVAREA DIFERITELOR VALORI ALE PARAMETRILOR I/O Asa cum af! Invatat, stream-urile VO furnizeazs cétiva manipulatoi si funci ce permit controll unor parametti YO. De exemplu, manipulatorul senw permite definicea limi unui cmp de afisare, Cand programele folosese acesti manipi- lator penini a controla difrite valor ale unor parametri, poate fnecesara de- terminarea valorilorindicatorilor curen atfel incat programele sé poa f e- constitute mai taru, In asfel de situati, se pot folsi functile din tabela 1.3. pentru citrea valorlorcurente. Func membru Revultatul returmat fags ‘valoareaindleatoror eueny wien lajimea eémpuii curent de afgare ‘a caractral de completare precision ~valoarea precise curente Tabela 1.3. Funcyiile membru ale stream-ulul YO ce returneaz® valori ale paranetrilor de stare Urmatorul program, SHOWINFO.CPP, foloseste aceste funcli pentru a afisa valorile prestabilite ale parametrilor unui stream: include : void main(void { tong fags: Mags = cout. fags); cout << “Default flags: cout << “Default width: << hex <« flags << endl; << dec << cout.width() << endl: | | | 1: Tastatura si ecranul “cout << "Default FiNI: >*°<< cout. 110) << *e* << endl cout << “Default precision: " << cout.precision() << end y La compilarea si executia acestui program, pe ecran se va aflga: G28 SHENINFO. < Default precision: 6 ‘Si INTELEGEM PARAMETRIT STREANF-ULUI DB IESIRE C++ dispune de o serie de functii membru ce permit controlul spatieril sl formataril unui stream, Cand folosit aceste functii pentru a schimba o valoare de parametru, schimbarea rmane activa pana la terminarea programului sau efectuarea altei schimbari. Dac examinafifisierul antet folosit de compilator pentru defintile de stream-uri veti afla lcd aceste functii corespund variabilelor membru ale unei clase de stream V/O. La invocarea functiei, valoarea variabilel membru corespunzatoare este schim- bata. Ulterior, la realizarea unei operatii /O cu acel stream, operatia va folosi \valoarea stabilita a variabilei membru pentru controlul intr i FACILITATI OFERITE DE FUNCTILE MEMBRU ALE STREAM-ULUI DE IESIRE ‘Asa cum afi invatat, stream-urile de intrare furnizeaza céteva funetit membru pentru realizarea unor operatii VO specifice. Acest paragraf examineaza functii membru ale stream-ului de iesire cu acecasi finaltate. De exemplu, urmatorul program, PUTALPHA.CPP, foloseste functla membru put pentru a afisa pe ecran literele alfabetului, una cate una: Hinclude void nain(void) € be char letter: for (letter = letter <= "2": letter) La compilarea si executla programulul, pe ecran va aparea: ENS PUTALPHA «Eure ‘ABCOEFGHT KLANOPORSTUVWAYZ, Succes cu C++. Poate va intrebati de ce in programul precedent s.a folositfunctia membru put, in loc de cout, ca mai jos: for (etter "4° cout << letter: letter 4 + Tetteny) Daca in program variabila leter este declarata de tip char, se pot folosi ambele tehnici pentru afigarea literelor. Ins daca variabila letter este de tip int, atunci prin a doua metod’ pe ecran se vor afiga_numerele intre 65 si 90, in loc de literele A pand la Z. FOLOSIREA FUNCPILOR MEMBRU Th ALE STREAM-ULUI COUT Asa cum sa vazut, cout este un obiect de tip ostream, Ca| alare, cout suport mai multe func membru. Urmatoarea| instructiune, de exemplu, foloseste functia membru put} pentru serie un caracter la dispozitivul standard de iesire: cout.put(7):// seanal sonor prin difuzorul incorporat Prin examinarea definitie clasei cout din fisierul IOSTREAMH, se pot gist rapia| functile membru disponibile, prin consultarea listei de prototipuri, TESTAREA REUSITEI OPERATILOR I/O Fiecare din programele anterioare au realizat operatii de VO, presupundnd c& acele operatiis-au derulat cu succes. Cand programele scriu mesaje simple pe fecran sau citesc una-doud lini de la tastaturd, in mod normal pute presupune ‘ch operatille se incheie cu succes. Insé, pe masuré ce programele devin mai ‘complexe, ar trebui vericaté finalitatea operatillor, folosind functille membru 4g00d, bad, fail si rdstate. Fiecare din aceste func{i membru examineaza biti de stare din indicatorul de stare al stream-ului VO, pentru a determina dacé a avut Joc 0 eroare. In funclie de compilatorul folosit, valoarea si semnificatia biilor de stare poate fi usor diferits. Totus), dacé examinatifisierul antet al definitilor legate: de stream-ur, vet gst o defintle de tip enumerativ a acestor biti, ca mai jos: ‘enum to_state { goodbit = ox00 eofbit = Ox0l, 1/ Set 4 1/0 operations fave been successful © © 1/ Set $f currently at the end of the file faiTbit = 0x02, // Set if last 1/0 operation failed “ badbit = 0x04," // Set if an invalid operation was attenpted hardfan) = 0980 // Set 4f an unrecoverable error occurred, ; Fahd hl acienticts Pentru a vedea dacé a avut loc 0 eroare YO, programele pot testa difer stare. De exerplu, urm&torul program, TEST_10.CPP, foloseste functia membru fail pentru a determina dacd operatile VO sau incheiat cu succes: 28 1: Tastatura gi ecranul Hielude A:UPPER.CPP cen Inacestcaz,TEST_10 va tt coninutul ser FILENAME.CPP, seid majuscule echivalentefeciraisracter pe fsieral UPPER.CPP de pe urilatea A Dacd apare 9 eroare cand TEST10 cteste ser de intare sau sere sen de isie (de Pia, spat insuicient pe die), programa va fie un mesaj de eroae in steam ul fgieruutstandarc de eros se va termina, Deoarece programnele pot testa Corecttucinea opeatilor V0 In moe chismit, stearate WO definere sere de fxciamare ca un operator ‘ce detectenzi 0 operate UO nereusi Atel uurmtoarele instruct sun identice din pune de vedere funcional He cein.east0) if dein In cazul cand un stream YO intélneste o eroare, bitul de eroare rimane selat pind ‘cand se sterge indicatorul prin functia membru clear, curn se arata mai jos: i (cout. 10810) * © cerr << “Display sone error message” << endl 5 sout.clear(); Succes cu C++ Tn functie de modul in care un program manipuleazi erorile VO, se poate cere examinatea indicatorilor de stare in vederea determinarii tipului de eroare aparul, Pentru aceasta se poate folosi funciia membru rdstate, ca mai jos: 40. state = cin.rdstate 3 a Penin a infelege mai bine definiile acestor functii membru, puteti examina figierul antet folosit de compilator pentru definitile legate de strearr-urite YO. “SH INTELEGEM STAREA UNUT STREAM 1/0 La realizarea operatilor cu strearn-urile VO, se poate testa in! programe finalizarea cu succes a unei operatii folosind! functile membru ale clasei YO. Daca examinati fisterul antet) pentru definiile legate de stream-uri, veti afla ca stream: turile YO contin o varlabili membru de stare ai cArei biti ccorespund stérii curente a strearn-ului. Analizand biti acestel variabile, programele pot determina incheierea cu succes a operaliei VO anteri | ‘care. Majoritatea programelor, tolusi,folosesc funeji membru incorporate pen- iru a realiza aceste teste z INTRARI-IESIRI CU $1 FARA BUFFER ‘Streameurile VO cout si clog folosesc iesirea prin buffer, adicd jesirea ru este ‘aligaté decat cind buffer-ul se umple, programul se inchele, buffer-ul este golit intentional , sau, In cazul stream-ului cout, cand programul cteste din stream-ul cin. Urmatorul program, BUFFERED.CPP, scrie iesirea la cour si asteapta apoi 3 ‘Secunde pand la terminare, Cand programul ia sfarsit, buffer-ul de iesire este afigat, ca in urmatorul exemplu: Finelude void main(vosd) € ‘eine t start_time, current_tine: cout << “HeTI0 G++ world!” << endl: timecestart_time); wt ‘ine(current_tine): while ((current_ tine - start tive) < 3): 3 Sb Bugee BS Programul foloseste functia time pentru determinarea timpulu introduce o intarziere de 3 secunde. 30 | | | | | | | curent si 1: Tastatura si ecranul GOLIREA UNUI BURFER DE IESIRE fn functie de operatile efectuate de program apar situatii cand buffer-ul de jesire trebule golitinainte de a se umple, inainte de incheierea programului, 2 ‘sau inainte de a realiza o operatie de intrare. in astfel de situalii programele pot : folosi functia memoru flush. De exemplu, urmStorul program, FLUSH.CPP, scrie tun mesaj la cout, face o pauza de 2 secunde, goleste stream-ul de iesire §/ apot ‘mai intirzie 3 secunde pan la incheiere: Finelude Hinclude yeid main(void) i ‘tine t start tine, current. tine cout << “HeTlo Or herd!” << endl z ‘ine(astart. tim): of © tme(Bcurrent. tine): }ovwhile ((eurrert. tine - start tine) < 2) ‘cout. usti): ‘tine(Qstart. tire) oo { ‘vime(current. tine): }owhile ((current-tine - start tine) < 3): cout << “Done!" <¢ endl: : y Jn Capitotul 11 voli aprofunda stream-urile /O prin buffer cand veti examina clasele sireambut i lebuf. FOLOSIREA FUNCTILOR MEMBRU PENTRU CONTROLUL INDICATORILOR DE STREAM I/O Aj invétat ceva mai devreme, in acest capitol, cum se controleaza iesirea unvi stream /O folosind manipulatoriisetiosfags si resetiosflags. Pe langa acesti ma- nipulatori, progranele pot avea un control mai precis asupra parametrilor aces- tot indicator folosind funcjille membru ale stream-urilor VO ce vor fi discutate in continuate. De sxemplu, urmitorul program, [OFLAGS.CPP, foloseste functia ‘membna flags pert aligarea valorilor parametrului indicatorului de stream: Hinclude 32 Succes cu C++ votd taintvord) cout << “cout Starting flag settings: * << hex < cout. flags() <© en cout << settosflags(os::stonbase) cout << "eout ending flag settings: * << cout. flags() <« endl: y “ Dupa compilarea si executla acestui program, pe ecran va apdrea un rezultat ‘dependent de compilatorulfolosit, avnd urmatoarea forma generala: 2\ IOFLAGS. g : ‘cout starting flag settings: 1 cout ending flag settings: Oxcl Folosind functia membru flags, un program poate salva valorite unui diferite momente, pentru a putea fi ullerior readuse Ja forma initial’. De fexemplu, programul SAVEFLAG.CPP, foloseste functia membru flags pentru a citi valoarea curenta a unul indicator $a 0 restabili ulterior. Hinclude Hinclude SAVEFLAG Hexadecimal values: ff a Decinal values: 255 10 Pe langé folosirea functiei memibru flags pentru configurarea indicatorilor stream- Urilor VO, programele mai pot fos! si functle membru set si unset. Pentru a crea sia sterge parameti indicatorilorfolosind aceste doua funciii membre, trebuie cu- ‘Roscut ili ce corespund flecdrut indicator. Prin folosirea tipulul de enumerare al in- dicatotilor prezentati anterior In acest capitol, se pot determina valorile corespunzé- toare ale biflor. De exemplu, urmatorul program, SETCLEAR CEP, foloseste Functile ‘merribru seff siunsetf pentni a crea’ sia Sterge indicatoriistream-ului VO: Finelude 80): // Clear the base display = gout << hex <= 255 <<" "<6 10 << endl: d Programul foloseste functia membru setf pentra a activa afigarea in bazii hexa- zecimals, Dupa ce afigeaz dou’ valori, programul foloseste functia membru lunseif pentru a dezactiva afigarea in baza respectiva. La comnpilarea si executia prograrmului, pe ecran va aparea: EW SETCLEAR tire Ont O33 ffa REZUMAT Fiecare program pe care il crea indiferent de destinata sa, va folosi operat de intrare sau iesire. De aceea, injelegerea stream-utilor VO si a posibiltailor Jor sunt esenijale pentru succesul in programarea C++. inainte de a continua, in Capitolul 2, asigurat-va c& al invatat urmatoarele: ¥ Imaginea optima a unui stream VO este o serie de octeti ¥ Compilatorul foloseste un fisier antet pentru a defini strearn-urile YO - ios, istream i ostream, precum $i functille $i variabilele membru. Ti- Paritio copie a acestui fisier sI studiati-o cu atentie. ¥ Operatorii de insertie (<<) si de extractie (>>) permit programelor ‘SA introdued si sd extraga caractere in/din stream-ul de VO. Y Manipwlatorii sunt elemente pe care le puteti plasa intr-un stream de intrare sau de iesire pentru a controla formatarea W/O. Fisierul antet IOMANP.H defineste manipulator disponibitt. Y Cand un program foloseste un manipulator pentru a configura formaterea unui stream, C++ stabileste valoarea bitilor din cémpul indicatorului Ge stream ce controleaza configurarea. Pentru a intelege mai bine acea configuratie de bit, consulta figierul antet folosit de compilator la definirea stream-uior. ¥ Streamurile de intrare/iesire contin diferite metode (funciii) ce per- ‘mit coatrolul formatului iesirt sau realizarea unei anumite operatti VO. Compilatorul defineste prototipurile functilor membru ale streamului int-un fisier antet, ‘ ¥ Streamuurile de iesite cout si clog realizeazi Iesirea prin buffer, cea cee inseamna c& iesirea este scris& numai atunci cénd buffer-ul se ‘umple, programul se incheie, programul goleste bulfer-ul, sau, ccazul lui cout, cind programul realizeaza o operalje de intrare. 33 foare adauga concepte pe baza inform: tet! invata pe rand pirile importante ale notiunii de obiect. Ca si mai inainte, trebuie sa aveti rabdarea de a experimenta programele prezentate prin schi Fut, vel incel mai simpli sens, un obiect este un lucru. Un caine, o carte, ct ~~ puter, toate sun: obiecte. in trecut, programatori isi concepeau programele ca pe liste lungi de instruc{iuni pentru realizarea unei sarcini specifice. La crearea CAPITOLUL 2 IMODAREA CU Este posibil sa puteti scrie o multime de programe C++ fara a intelege cu adevarat sau fari a folosi obiecte, desi obiectele si clasele sunt esentiale pentru utilizarea la masimum a limbajulul, Dar nu va speriati! Acest capitol incepe cu it pasi $i prezinta regulile de baz ce trebuie cunoscute. Capitolele urmé- F prezentate aici, In acest mod, pu Chiar si ibarl smple, puteti invata foarte mult. La incheierea terminarii capito- injelege urmatoarele: + Ceeste un obiect + Cum un program complicat, de mari dimensiuni, este mai ugor de conceput si de redactat folosind 0 abordare orientata pe object in Jocul uneia conventionale, orientata pe functie ‘+ Cum un obiect poate economisi timp gi efor . + Ceeste mostenirea ‘+ Avantajulfolosiri objectelor + Cum se creeazi un obiect + Avantajele si dezavantajele functillorinfine + Cum se folosese doud variabile diferite cu acelasi nume in acelasi program ‘+ Ce sunt functile constructor si destructor de clase + Cum se atribuie valoarea unui obiect altui object PRIMUL CONTACT CU PROGRAMAREA ORIENTATA PE OBIECTE un com- 35° 36 Succ es cu C++ de programe orientate pe obiedte, accentul se pune pe obiectele componente ale programutu Sa presupunem, de exemplu, c& scrieti un program ce implementeaza simplu lun procesor, Dac vi gandila toate functie realizate de un procesor de texte, vel fi repede coplesit de acestea. In schimb, daca va imaginali procesorul de cuvinte ca o colectie de obiecte distiete, programul va deven! mai putin intimi- dant, In figura 2.1 sunt iustrate obiectele principale ale sistemului de procesare de texte. [Veteare oo crogates ‘rie Figura 2.1. - Structura unui procesor de cuvinte ca o colectie de object. Pe masurd ce examinati flecare obiect, vet descoperi ca acesta este, de asemenea, compus din obiecte, cum se arata in Figura 2.2. nd incepeti sa identificati obiectele din sistemul dvs., veti vedea cé diferite Arif ale programului folosese acelasi ip de obiecte. De aceea, scriind programul vostru in termeni de obiecte, veti putea usor (si repede) 58 refolositi codul scris pentru o anumita secven{a intr-o alta parte a programului, sau chiar in alt program. In aceasta rezida o parte din puterea limbajului C++ Primul pas in crearea programelor orientate pe obiecte este de a identifica obiectele ce formeaza sistemul. Pentru a intelege mai bine cum se identifica obiectele sistemului, puteti face referintS la urmatoarele cérfi de analiza si prolectare orientate pe oblecte: + Object-Onented Design and Applications - Booch, Benjamin/Cummings, 1991 + Object-Oriented Analysis, Coad & Yourton, Yourdon Press, 1990 + Object Data Management, Cattel, Addison-Wesley, 1991 + Object-Oriented Reuse, Concurrency, and Distribution, Atkinson, Addison-Wesley, 1991 + Object-Oriefted Mettiods, Graham, Addison-Wesley, 1991 “ + An Introduction to Object-Oriented Programming, Budd, Addison- Wesley, 1991 2: Clase si obiecte + Object-Oriented Software Construction, Meyer, Prentice-Hall, 1988 + Object-Oriented System Analysis: A Model-Driven Approach, Embley, Kurtz and Woodfield, Yourdon Press, 1992 Figura 2.2, Idemtficarea obiectelor adijionate in cadrul procesorului de cuvinte. Dupa identificarea obiectelor, trebule sa determinati scopul flecérui obiect. Pentru aceasta, ganditi-va la operatile realizate de un obiect sau la operatiile efectuate pe acel obiect. De exemplu, daca fisier este un obiect, un program poate copia, sterge sau redenumi fisierul. Este important de observat 4, in general, aceste operat se aplicd fiecdrul fier de pe disc, indiferent de continu- {ul sdu, Aceste overatii vor deveni funcfile membru ale obiectului, pentru care ulterior veti scrie funciii C++ in programul respectiv. Apoi trebuie identificate informatile despre obiect. In cazul unui obiect fisier, trebule cunoscute numele fisierului, dimensiunea, gradul de protectie, eventual data la care fisierul a fost creat sau modificatullima oars, Aceste date vor deveni variabile membru ale obiectului, Conceptual, obiectul fisier se poate vedea can Figura 2.3. ee 37 - Succes cu C++ Tigler =} uml obec epee steere 1 funchile membru ale obiectui imensione Le cariabioe membeu ale Proocte sbieculu arorens date Figura 2.3. Funcpiile $i variabilele membru ale unui obiect fier. SH INTELEGEM PROGRAMAREA ORIENTATA PE OBIECTE | = Programarea orienta pe obiecte este bazaté pe scrierea de | programe cu referize la obiectele ce intra In componenta| tunui sistem, fn cadrul unui sistem, obiectele memoreaza| Lipurispecitice de informati i executa operat specific pe| acele informati. Primul pas In crearea unui program orientat| | pe obiecte este identificarea obiectelorsistemului, informa- [bile de baza referitoare la fiecare obiect si operaile realizate pe obiecte. La |scrierea primelor programe in C++, constructia lor se va opr, probabil, alc. P| | masura ce deveni mai experimentat, vei cSuta rela intre obiecte ce vor per- | mite constructia unor obiecte noi dn altele mai vechi. Pentru moment, ins, daca |cineva va cere sA defini un obiect C++, spunelile pur si simplu c un obiect |reprezinta o entitate alumi reale, poate contine date (Variabile membru) si are un {set concret de operati unctii membry) ce se efectueazd asupra acestora Uneori este necesara afisarea sau tiparirea unor fisiere; alteor, fisierele contin. programe executabile de care aveti nevoie. Ca atare, la defintia obiectelor trebuie adugate metodele de efectuare a operatilor respective, ceea ce nu este gresit.Totust, exist o varlan(a mai bund de a prelucta cazuile speciale. De exemplu, daca fisierul contine un document, conjinutul acestui fisier poate fi tipatit, operatie care nu ar avea sens dacé fisierul ar confine un program execu- tabil; in aceasta ultima situalie execufia continutului fisierului este operatia dorita. La incercarea de a executa conjinutul unul fisier document va rezulta 0 eroare, Solutia consta in identificarea a doud noi clase obiect, denumite docu- ‘ment si program, O modalitate de a crea aceste noi clase este adaugarea com- ponentelor respective la fiecare clas, aga cum se araté in Figura 24 38 2: Clase si obiecte dosumont program wopiere ‘copiere stergere stergere Federumire afgare dimensiune protecte ‘dimensione pratecie amprenta date amprenta date sistem de operare format Figura 2.4. Crearea ior clase document si program independent. Dupa cum se peate vedea, la obiectul document se adauga functjile membre display si print si variabila membru format (care specifica formatul inter al documentului, cum ar fi Word sau WordPerfect). in acelasi mod, la obiectul program se adauga functia membru run si cémpul sister de operare, care specifica daca programul ruleazi sub DOS, WINDOWS sau UNIX. “Aceste doua noi clase practic dubleazé clasa fisier definita anterior. De aceea 0 solulie mai buné este de a consirui cele doud clase bazate pe clasa figier, cura se aratd In Figura 2.5. Figura 2.5. Crearea noilor clase pe baza clasei fisier Céind programul dvs. construieste o clasti derivata dintr-o alté clasé, noua clasa mosteneste funeiille $i variabilele membru ale clasei de baza. in cazul claselor document si program, obiectele create cu aceste clase pot sa foloseascé nu 39° Succes cu C++ umai proprile functil si variabile membru, ci si pe acelea ale clasei fiser. in acest mod, programul dvs. poate s& execute cu usurinfé afisarea, tipdtirea, copierea, redenumirea sau stergerea unul fiser document, ‘SA SIMPLIFIGAM DEFINITIILE UNEI CLASE Pe masurd ce definiticlasele, incercati s& dati definitilor un} caracter general. Cu alle cuvinte, variabilele si functile ‘membru care apar in clasa de baza trebuie sa fie folosite de fiecare din clasele derivate (constnuite) din aceasta. Daca| teste nevoie sé adéugati la 0 clas mai mule variabile i functii membru, puteti defini o alté clasa, mai specializata bazald pe clasa generala. Constructja claselor in acest mod este esenta conceptului de mostenire a claselor, concept ce va fi tatat in detaliu in Capitolul 4. S-ar putea s& va miraji de ce e nevoie de acest procedeu. Primul motiv pentru folosirea mosteniii este refo- losirea, adica posibiltatea ca un program sé foloseasca codul scris si testat pentru alt program. De exemplu, s4 presupunem ca ali creat clasa fisier pentru un program de buget, intrucat clasa exist, aceasta poate fi rapid folosité in interiorul ‘unor programe noi. Existenta unei clase nu numai c& diminueazd efortul de programare, dar reduce si volumul testarllor necesare, intrucat functile membra ale claseifisier au fost testate siverificate anterior pentru programul de buget. ‘Si INTELEGEM MOSTENTREA Mostenirea este capacitatea unei clase derivate de a mosteni funcyile si variabilele membru ale unei clase de bazd cexistente. Pe masurd ce identifcati si examina} obiectele ce| ‘compun un sistem, veti gisi deseor relat si asemanari inte| obiecte. in multe cazuri, aceste relalii va permit s construiti tun ohiect din altul, care confine toate metodele originalulul. Cand proiectati clasele obiect, Incercati s& dati claselor un caracter cat mai general, Dac& numrul functilor si variabilelor incluse In efinitia unei clase creste, atunci posibiltatea de a refotosi acea clasé, sau de a| deriva alte clase din aceasta, scade, ING! ERIA PROGRAMELOR $I FOLOSIREA OBIECTELOR De ce ar trebui sa ne bazém pe obiecte In activitatea de programare? Exist cativa termeni de inginesla programelor care sunt folosii frecvent:pentru a deserie acest lucru, Cu toate c& existé dezacorduri in domeniul ingineriei de programe in privinga folosiri optime a obiectetor, sunt clar recunoscute cateva avantaje oferite de acestea: 40 | J 2: Clase si obiecte Usurinta proiectarit $i refolosirii codutui. O data ce codul func- sloneaza corect, folosirea obiectelor mareste posbbilitatea de a refolosi codul creat intr-o aplicatie pentru o alta aplicatie. Flabilitete crescuta. Deoarece bibliotecile de obiecte au fost anterior testate, folosirea codurilor existente (de lucru) va Imbu- nata{ifiabiltatea programulul, Usurinta intelegerit. Permitand proiectantilor si programatorilor 8 se concentreze asupra partilor componente ale unui sistem si fumizind un cadru in care proiectaniii pot identifica obiectele, operatille efectuate cu acestea precum si informatile pe care un object trebuie sa le contind, ulilizarea obiectelor ajuta programa- tori si nteleagé componentele importante ale unui sistem. Grad inalt de abstractizare. Abstractizarea permite programato- nilor sa aibé o vedere de ansamblu, adic s4 ignore ansamblul temporar detalile nesemnificative sis lucreze cu elementele de sistem ce sunt mai ugor de infeles. De exemplu, prin concentra- rea asupra obiectelor procesorului de cuvinte din exemplul ante- rior, imp ementarea acestula a devenit mai putin stresanta, Grad ridicat de incapsulare. Incapsularea grupeaz’ toate partile unui obiect intr-un modul compact. De exemplu, clasa figier def nitd tn exemplele anterioare combina funcii si campuri de date cu care atogramul lucreaz& intr-un fsier. Programatorul care I ccreaza cu clasa fisier nu trebuie s& cunoasca fiecare component a clasei, ci numal cum se foloseste clasa in program. Clasa, la randul ei, include toate componentele necesare, Ascunderea informatiel. Ascunderea informatiei reprezinta capa- citatea unui program de a trata 0 functie, procedurd, sau chiar un object, ca pe o ,cutie neagra", adica de a le folosi in anumite ope- ratii fara a cunoaste structura lor interioara. in Capitolul 1, de exem- plu, prugranele au folosit oblecte tip stream YO pentru intrare s1 iesire, férd a necesita injelegerea modului de functionare a stream-urilor VO, Pe masura ce vom examina conceptele de programare C++ In aceasté carte, vet} invata care sunt legaturile dintre aceste concepte si definitile de mai sus. SA iNTELEGEM OBIECTELE $1 CLASELE in decursul discutiei precedente, termenil obiecte si clase au fost folosi foarte “vag. In’general, 0 clasd furnizeazi un sablon folosit de program la crearea obiectelor. De exemplu, clasa fisier descrisa anterior specifica variabilele si funcyile membru ce vor Fi folosite pentru obiectele fisier pe care programul le va crea ulterior. Un object, agadar, este o instanfa (instance) a unui gablon de Al Succes cu C++ clas, Cu alte cuvinte, un obiect este o entitate, un exemplu specific, un articol cu care programul lucreaza, Definitia unei clase este similard unei definitii de siructurd in C. De urmatoarele instructiuni definesc clasa fgier: exemplu, class file ( public: char fiTenaneC64]; Tong size: unsigned protect ion: Tong datet ise: ‘int copy(char *target_naze): ‘nt renane(char *target.nane): int delete. filevotd): h Dupa cum se poate vedea, efiniia clase! indic&functile si variabilele membra Observati eticheta public ce apare la inceputul clase. Singurul mod in care prosramele pot avea acces direct la membrul une clase, fe aceasta functie sau Yariabila, este ca acel membru sa fie precedat de eticheta publi, Mat trziu, in acest capitol, vellinvaia cum sa foloslietichetele public si private pentru a Conirola modul in care programele pot avea acces Ia membrt unei clase. In Capitol 4, vei invja cum clasele conciijonate folosese eticheta protected pentru a furniza o cale intermediara de acces la membri. Deocamdatd, ins, pasa eticheta public la inceputal fiecdrei clase; astfelto{i membri casei vor eveni disponibiltn tot programul. © clasé defineste un sablon pentru creareauiterioard a obiectelor.Clasa insisi nu creeaza un obiect. Pentru crea un obiec, se declara variable de tip obiect, ‘cum este artat mai jos: void main(void) fe file source, target: // Declare two file absects 17 Other statements here } ‘DIFERENTA INTRE CLASE St OBIECTE Dacé citi articole gi cérti despre C++ si programarea orien- tatd pe obiecte, veli Intalni termenti clasd si obiect. O clasd fumizeazd un sablon ce defineste functiile $i variabilele’ membru necesare obiectelor avand tipul clasei. Un obiect, pe de alté parte, este o instanfd, un exemplu concret, de fapt! © variabild obiect. O clasa trebuie definita Inainte de decla-| rarea obiectulul, Pentru a declare 0 variabilé obiect, speci variabilei obiect, ca mai jos: iicati tipul clasei, urmat de numele Procesul cre unui obect este adesea denumit instantena und |crearea unei mos're de obiect, Ke ache nuse_clasa —nume_obiect: ANALIZA UNUTEXEMPLU COMPLET Cel mai bun miloe de a inflege clase gf cbectele C++ este de a crea un program spl, Umer progam, NOMIESCP, creed elas dvr movie apol creesza 2 obiecte de tip movie, cu humele histbe wt secoler Programul defineste clasa dupa cum urmeaza: aes ee class novie Variable membra public: " oe sesie ee char first start]: char second stari64]; void show movie( 01d) vofd initial ize(char *nane, char *first, char *second) Func memos Dupa cum se poate vedea, clasa movie foloses i a vedea, clas movie floseste tel variable membru i dou func{ii membru. Dupa definitia cle i, prc i nia clase, program trebue i deffreasl net membru show_movie $i initialize, astiel: ae Nei move: show movie ‘ cout << “Hovie rane: cout << “Starring: = endl <= andl; 7 << name << endl: << first star <<" and “ << second star << Wold movies:inttial:ze(cher *movie name, char *first, cher *second) strepy(naze, movie nere); strepy(first star, first): stropy(second star, second) Definiva functitor clasei este asemanat i 4 este asemanatoare definite! functifor standard ‘existand totusi doué diferente. Mai intai, numele functii ‘sunt : « fumele clasei si de simbolul " lnailor sunt Drecedate de Nume cls ee wid movie: :initialiae(char movie nane, char *first, char *second) ume tanto 43 Succes cu C++ jn al doilea rand, instructiunile din corpul unei functi ale unei clase pot face referin{é directa la variabilele membru ale clase: void movies;initiel ize(cher *movie_nane, char *first. char *second) strepy(rane. savie nave): strepy(first_star, first) strepy(second star, second) > No sure vasa net ete Name membriclasd Urmatoatele instructiuni implementeaza programul MOVIES.CPP: snclude void novte::show novi void) sa eee nam cc pirat str ce 2 and“ <¢ second star eat ee eat } void novte:sinitfalize(char movie name. char *first. char *second) { strepy(nane, movie name): strepy(first star, first) Strepy(second star. second) vols sain(votd) novie fugitive, sleepless: fugitive. nitialize("The Fugitive", “Harrison Ford”, “Tomy Lee Jones"): : sleepless, initsalize("Sleepless in Seattle “Wag Ryan”) “Toa Hanks”. fugitive.shew movie” sleepless. show movie() } 44 2: Clase si obiecte Dupa cum se poals vedea, programul creeaza dou’ obiecte de tipul movie: ume elas povle fugitive. sleepless; hie ele ‘Accesul la membriiunei clase este asemanator accesului la componentele unei structuri in C: se specific’ numele obiectulul, urmat de operatorul .’ si de ‘numele membrului corespunzator. De exernplu, pentru a apela functia initialize, obiectul fugitive fcloseste operatorul ‘si numele functiel membru, cum este aratat mal jos: Name obiect ramet fete ee fugitive. initial ize(“The Fugitive", “Harrison Ford", “Tomy Le eres") Na func In acest caz, progamul a folosit functia membru initialize pe variabilele membrs ale clasel, Mai tirziu in acest capitol vel folosi ru a inijaliza invata cum 8 i functiile constructor pentru a iniffaliza variabilele membru intr-un mod ‘maf natural CAND SE FOLOSE! CLASELE $I CAND STRUCTURILE —T {= JP Daca ati programat in C, probabil ati recunoscut faptul c& ‘S> —_sintaxa pentru lucrul cu clase este similar cele foloste in C Pentru structuri, V-afi putea intreba, cAnd trebule s& folositi clase, si nu structuri sau uniuni. Dupé cum sti, acestea permit programului sa memoreze date dependente, Progra- mele dvs. ar trebui sa foloseasca clase ori de cate ori asupra datelor au loc opera concrete. De exemplu, dacé avetinevoie de 0 ats, atunct pute loi srctura. Dar dacd dorf ca programa sa formateze sist afigeze daa 8 weacd data intr ger, au s& compare doud Cate, este ecesarautizarea nei clas, Silay, daca trebue sf opal te o stuctra euniune, decisie tobe hat in Rune le numaal Ce val pe cae suture Ge date congine un moment dat In slg, inl cont ca, mod presablt, membri uel clase sunt de tp priate, lar mem une! unr sau strat sunt eetippublc Daca experimentatistructurile din C++, veti descoperi c& ele suport multe din. Jconceptele clasei din C++, precum date publice si private, functii membru etc. Cao regula, daca creati obiecte, atuncifolositi clase, ACCESUL LA MEMBRII UNEI CLASE ‘(In progiamul precedent, ati folosit operatorul de acces pentru a apela funetille membru initialize $i show_movie. Cand programul plaseazi membrii 'unui obiect dupa eticheta public, el poate avea acces la membrii acestula 45 Succes cu C++ : Clase si obiecte GAP PUBLIC Hinclude class movie { Net ‘char namef 64]: char first_start64]: © char second star {6d void shaw movie( void) Declarei de func ‘membru ining cout << “Movie nane: "<< name << endl: cout << "Starring: << first_star << " and " << second star << end] <2 endl: } void initialtze(cher ‘eovie_nane, char *first, char *second) a { strepy(nane, movie_nane) Declare e functi strepy(first star, first ————— ‘membeu inne strepy(secone star, second 2 ) Un avantaj al declararii functiilor membru inline este acela ca intreaga clas ocupd un loc compact in program. Din pacate, folosirea funcyilor inline in acest ted mareste dimensiunea 31 complextaten definiilor clase. Mat simphu =pus, cu cat definita casei devine mai mare, co atat devine mai dificil de inteles. In Plus, codul pentru functiile inline nu este partajat Intre tipurile de obiecte Sirilare, asa cum se va vedea in continuare. Cand se definesc functiile membru in afara clasei, compilatorul C++ creeazio copie a corpului functiei ce va fi ulterior folosita de fiecare obiect al acelei clase. Cu alte cuvinte, dacd se creeazi 1000 de obiecte, fiecare obiect va folosi o singura copie a codului functiel. O astfel de partajare a functiei este indicat deoarece reduce semnificativ consumiul de memorie al programult 49 Succes cu C++ DEFINIR LOR MEMBRU IN APARA CLASEI | Cénd defini functile membra avell doud posibilta. Mail ESZIE ia putt ett nie inne in terol clase, ase >= i. in al © neat instructiunile functiei s& apara in definitia clas: doilea rand, puteli defini funcille In afara clasei, In majorita- tea cazurilor, aceasta este varianta optima, pentru a reduce Baclude PRIVATE Movie rane: The Fugitive Starring: Harrison Ford and Tomy Lee Jones Movie nane: Sleepless in Seattle Starring: Ton Hanks and Meg Ryen S& observam ca acest program nu mal afigeazd mesajele programului prece- ‘dent PUBLIC.CPP: votd main(void) novie fugitive, steepless: fugitive. initialize("The Fugitive". “Harrison Ford” “Tomy Lee Jones"): . sleopless. initial ize("Sleepless in Seattle”. “Tom Hanks’ “Weg Ryan”) The last two mavies I've watched are: 7 << fugitive.nane <<" and * << sleepless.nane << endl: cout << cout << “I thought " << fugitive. first_star << "was great!” << endl d Deoarece variabilele membru nu mai sunt publice, programul nu mai poate avea acces direct a acestea prin operator‘. Daca se dorese accesul la aceste variabile, trebuie create funetii membru special in acest scop. in cazul ‘cand credeii ca scrierea unor astfel de funciii membru e prea dificil si preferati accesul direct, nu faceff allceva decat sa marti posbilitatea aparitiei unor UI UNEI CLASE Sq INTELEGEM MEMBRII DE TIP PRIVA nd deca last, pute dein membre ca pubic eu priate Sau protected, cum vet aan Captotl, Memb Pubes ure ase sunt csponibi nt prota lesind hovel oblectu operator puns (ease member) sau opeatonl ae Indhecare (ase p-smembar. Memb prin Tunetite tembru ale clasei. Prin declararea intr-o clasd a unor membri 54 = private, ai ynel clase, pe de alté parte, pot f-utlizati numaite , 2: Clase si obiecte _ [clase sunt de tp priate Memb pubic se pot specifica scrnd in sla br] echeta publ, Dac ulleior se deste declaarea unor membr pricte e+ | bul inseratéecheta private, cum se aratan continuare: Jelass some class { public: void sone_function(cher *parareter); void Sone_other_functionCint a, int b. private: ' | | Sy tenonae | ©) | a te we: Mente pat | char petoartiag; | y | in acest caz, functile membnu ale clasei sunt publice, in timp ce variabilele| membra ale clesei sunt nonpublic. Tous, n funciie de class, pot exsta func rembre nonpublic, sau variable membru publice. a proiciarea castor ie bule determinat care dintre membri tebule sf fie de tip public, si care trebuie si ramand de tis private. ‘SH INTELEGEM CAMUFLAJUL INFORAMATIED Cemuflajlinformatiel este procesul de proiectae a func lor sata claselor dreptycuti negre”. Cu alte cuvinte, pentru a flo o fun sat o clas, programatorl nu treble <8 cunoascd toate amdnuntele inteme de funeionare ale cute, ci mai degraba operatiarealzaté de cutie «i modelul de] inet cu cia In progam C++, menby np ai unel clase realizeaza camuflajl informatie 1 | ‘SA INTELECEM CONSTRUCTORI $1 DESTRUCTORI DE CLASE Cand se creeazi obiecte, este céteodata nevoie de a aloca memorie pentru zonele tampon (buffers) folosite de obiecte. Si presupunem, de exemplu, c& hucrati cu un object figier care memoreazé numele fisierului intr-un gir de Caractere. Cand creati obiectul pentru prima data, veti dori ca obiectul s& aloce memorie in mod dinamic pentru a memora sirul de caractere, Mai tarziu, cand obiectul va fi desfintat, veti dori sd eliberati memoria alocata. Pentru a ajula Programele si realizeze asttel de operatil de fiecare data cand un obiect este Construit si apot distrus, imbajul C++ introduce funciille de tip constructor si destnictor. O daté ce v-ati insusit acesti termeni, veti vedea mai larziu ¢4 un Constructor nu este altceva decat o functie ce se executa automat de fiecare data cénd creati un obiect, iar un destructor este o funclie ce se executd automat cand ob ectul este distrus. 55 56 Succes cu C++ Ai folosit mai devreme, in acest capitol, funcjia membru initialize pentru a iniyaliza varibilele membru ale oblectelor apartinand clasel movie. Folosind 0 functie constructor, puteli elimina necesitatea ca programele dvs. sa apeleze functi ca initialize. in schimb, la crearea obiectulul programele vor specifica pur sisimplu valorile parametilor, ca mai jos: novie fugitive(“The Fugitive", “Harrison Ford”, “Tomy Lee Jones"): novie.sleepless("Sleepless in Seattle", “Ton Hanks", “Mog Ryan"); La randul su, C++ va apela automat functia constructor. in cadrul constructo- rului, pute{iatribui parametrii cémpurilor membru, la fel cum ali facut cand att folosit initialize. O funetie constructor este specialé prin aceea c nu returneaza o valoare si nut are tipul void. in al-doilea rand, functia constructor foloseste acelasi nume ca $i clasa. In cazut clasei movie, functia constructor va fi denumitd tot movie. class movie { public: void show novie(void) : movte(char *nane, char *first, char *second): private: char nano(4): char first_star{64]: char second star(s]; b Dupa cum se poate vedea, functia nu specifica o valoare de intoarcere. Ca sila functile membru ale unei clase, puteti defini functia constructor fein interiorul clasei (in line), fie in afara acesteia, Urmatorul program, CONSTRUC.CPP folo- seste funcia constructor movie pentru initjalizarea obiectelor: Functii constructor ‘include class movie { public: void show novie( vote). rovieCchar "are, char “first, cher *second): private: char nene[68); char frst_start64] char secaed star{64): wo: doe 3 Sh wie void novie::show_sovie(voia) { 2: Clase si obiecte cout << “Movie mane: * << nane << endl: cout << “Starring: “ <« first_star << * and * << second star << endl < endl 3 Deciarata functiei constructor movie::novie(char *nase, char *first_star, char *second star) strepy(novie: name, mane): strepy(novie: first_star, First_star): strepy(novie:: second star. second star) y void main(votd) movie fugitive(The Fugitive “Tomy Lee Jones”) movie sleepless("Sleepless in Seattle", “Ton Hanks”, “Meg Ryan”): “Harrison Ford fugitive. show novie( sleepless. shov_novie(): d Folosindfunciileconsructor,programele dvs, po inal obiectele a rearea tcestcra,elmindnd ale! necesatea unor full de inilalizre separate, is Cate Cor oexecthsuomat defecate data nd cea On Me obiec at une amunke clave, Funcia canstucor este spech| ald prin aceea ca foloseste acelasi nume cu al clasei. De! exemplu, pentru o clas denumita dogs, functia constructor se va numi tot dogs. In plus, functia nu returneazd nici un re-| ‘Si INTELEGEM FONCTILE CONSTRUCTOR | 0 fnecontrcer eo frie membrs a une case pe zallat sinu este de tip void. lass dogs { | public: dogs(char ‘breed, int height, int weight): — Funct constuctor | Void show_dogs(votd): | private: ‘char breed{ 64): | int height: ‘nt weight | fae Succes cu C++ ‘SA INTELEGEM FUNCTILE DESTRUCTOR Un destructor este o functie ce se execut’i automat cand obiectul este distrus. Ca sila functia constructor, functia destructor are acelasi nume cu clasa. De asemenea, functia destructor nu returneaza vreo valoare si nu este de tipul void. Programele nu pot transfera parametri la o functie destructor. Functia destruc- tor se deosebeste de cea constructor prin faptul cé este precedat de semnul tilda (-) class dogs { public: dogs(char ‘breed, int height, int weight): dogs(void): ‘vid show_dogs(vot private: char breed(64) Sint hetght: ‘nt weight: Functie destructor h Urmatorul program, DESTRUCT.CPP, adauga 0 funclie destructor Ja clasa ‘movie. Cand obiectul este distrus (in acest caz, cand programul se incheie), este apelata functia destructor: include include class novie { public void show movie(vord): ovie(char *rane, char *first, char *second): ~tovie(void) : private: char nane(64): char first_starLéd] char second_star{64]: void movie!:show sovie(votd) { cout << “Movie nane: ‘cout << “Starring: << name << endl: Movte nane: The Fugitive Starring: Harrison Ford and Tommy Lee Jones Youre nane: Sleepless in Seattle Starring: Tom Harks and Weg Ryan 1m the movie dest-uctor for Sleepless in Seattle In the movie dest-uctor for The Fugitive 59 Succes cu C++ Dupa cum observati, ul destructor, ‘Sa INTELEGEM FUNCTILE DESTRUCTOR eS Un destructor este 0 funciie ce se executi automat cand sunt scrise de functile obiectele unei anumite clase sunt distruse. Functile des- tructor au acelasi nume ca al clasei in care sunt definite, fiind precedate de semnu! tilda (-). Un destructor nu retur- neazi nici o valoare si nu este void. Programul nu poate| transmite parametri unui destructor. Urmitoarea clasé, employee, foloseste o funetie destructor: | i class exployee { public: | Pntayetchar anne, int a5): employee void) oid show eaplayee (void): private: | char nant: {int aoe: De: Functiile destructor, ca si cele constructor, trebuie si fle membri de tip publi FOLOSIREA FUNCTULOR CONSTRUCTOR MULTIPLE in Capitolul 5 veti examina suprapunerea functillor, adica folosirea unor funeti diferite, dar cu acelasi nume. in timpul compilétii, compilatorul C++ determina cce functie trebuie apelata, finand cont de numarul de parametri sau de tipul valori functiei. Cnd definiti functii constructor intr-un program, puteti specifica ‘mai multe functi, din care compilatorul va selecta funetia corecta in funcjie de necesititile programului. De exemplu, urmatorul program, MULTICON.CPP, fo- loseste doua functii constructor pentru clasa message. Primul constructor atri- buie mesajul specificat de parametru, in timp ce al doilea constructor foloseste ‘mesajul prestabilit Hello, world” #include Hinclude MULTICON ‘The message ts Hello, world The message is Success with CH FOLOSIREA ARGUM CONSTRUCTOR NTELOR PRESTABILITE LA FUNCTULE 4h Capitolul 5 vet nvata cum s& speciicay) parametri prestabliti pentru functi In cazul apelatiiunor funcii fra a specifica valor pentru fiecare parametru, se ot specifica vali prestablte, Urmétorul program DEFPARAMLCPP, foloseste ‘un pararetru pres abit pentru functia constructor a clasel message: Finclude Finclude less nessa public: soge(char *user_nessage = “Hello, world”) AY Succes cu C++ Void show message void); private: char secret _massaget64]: message: imessage(char *user_nessage) stropy(secret_nessage, user message): void message: show message(void) cout << "The message 1s ~ << secret_sessage << endl: y woid nain(votd) { sessage greeting: ‘sessage book("Success with CH"): greet ing.show_nessage(): book. show_message(): ? UN ALT MOD DE A INITIALIZA MEMBRIT UNI CLASE ‘Asa cum ai invatat, funcile constructor va ajutd 4 inilializayi membrii unei clase la crearea acesteia. La examinarea programelor C++ se poate intalni tehnica de initializare mai speciala. De exemplu, s4 presupunem ca doriti sa initilizati prin constructorul counter variabila count la 0, ca mai js: ‘counter: counter (votd) t counter = 0: 1/ Other statenents Asa cum se va dovedi, C++ permite initializarea variabilelor membru ale unei clase prin intercalarea numelui variabilei $i a valoril dorite intre simbolul *: corpul de instructiuni al functiel: counter: seounter(votd) + counter), "> Numele variable gi valoarea iniiala 11 Other statenents ee oes : i ne ‘Unmatorul program, CON_INIT.CPP foloseste acest tip de initjalizare penta alribuirea a trei variabile membru ale clasel object valorilor 1, 2 respectiv 3: 62 2: Clase si obiecte Finclude contains 1 £ b contains 2 contains 3 ATRIBUIREA VALORH UNUI OBIECT ALTUI OBIECT ‘Asa_cum intr-un program putem atribui valorile unel variabile de tip int altei Variabile de acelesi tip, similar putem atribui valorile unui object caitre alt obiect. Yeti vedea ca C++ simplificd foarte mult atribuirea de valori obiectelor. De fapt, se foloseste pur si simplu operatorul de atribuire (=). De exemplu, urmatoarea instruetiune va atibui valoarea unui obiect date altui obiect: work. day = taday: Presupunand c& obiectul date contine membrii month, day si year, operatorul de atribuire va atribui automat valori tuturor membrilor obiectului. Ca urmare, Instructiunea anterioard este echivalenta cu instructiunile urmatoare: 63 Succes cu C++ ‘work day.nonth = today.nonth: work day.day = today. da workday. year = today.year: Urmatorul program, ASSIGN.CPP, foloseste operatorul de alribuire pentru atribui obiectul movie altui obiect Hinclude ASSIGN Finclude class essage { public: rmessage(cher *user_ngssige, char owner): void show nessage (void): char nessage_ower[64]; private: 5, BAT ateen eauanon: ressage:smessageichar *user message, char *owner) € 65 Succes cu C++ ‘strepy(secret_nescage, luser_s2ss290): strepylnessage ower, owner): d void message::show_message( void) « cout << "The message owner 15." << message owner << endl; cout << "The message is " << secret message << endl y vod sane function(eessage nate) note. show message(): ? void change_ovner(nessage *rote) strepy(note-paessage omer. "Fred”): void sein(void) ssore_funct toncbook); ‘change _owner (book) sone_function( book) ) Dupé cum se observa, programul transmite obiectul book functiei some function care, la randul ei, afigeazA membrul obiectului folosind functia show _smessage. jn acest caz, funetia nu poate afiga valorile variabilelor membru deoarece secret_message nu este public. Singurul mod prin care programul poate objine acces la 0 variabilé membru este de a folosi o functie membru. Mai departe, transmiténd prin refering obiectul book funciiei change owner, functia va putea modifica membrul message owner. Ca si tnainte, functia nu poate schimba membrul searet_message deoarece acesta este private. ‘FOLOSIREA OBIECTELOR $I A FUNCTIILOR Obiectele din programe, ca $i structurile, pot fi transmise} functillor drept parametri. De exemplu, daca o functie are| nevoie s& alba acces la membri unei clase, obiectul poate fi! transferat funcjiei prin valoare. Daca functja trebuie si mo-! difice un membru al clasei, obiectul trebuie transferat functi-| ei prin referinta. SA nu uitém c& 0 functie poate.avea acces, direct ndmai la’membiii publici ai uriei clase."Péhtru a mo- | difica un membru nonpublic al clasei, functia trebuie s& fo- l loseascd o funetie membru a clase —— 66 | 2: Clase si obiecte fh Capitola 10 voli Invdja cum se tansferd clase functor, folosind referinte| te Prelimindnd astel necestatea de a aplica operator de indirectare (~») in fa nel fone in schimb, programele pot avea acces la membrii une! clase folosind operatoralpunet ().— SA INTELEGEM MEMBRU UNEI CLASE {In fiecare din programele anterioare, clasele au folosit tipuri simple de membri ‘caint, float sa.m.d Pe masurd ce clasele devin mai complexe, membril lor pot f tablour, structuri, sau chiar alte clase sau pointeri la clase. De exemplu, urma- torul program, NESTED.CPP, include un pointer la clasa date in interiorul clasel employee: Firclude Finclude class date { public: date(int month, int day, Int year): void show datetvoid): private: ‘int month; nt day: int years class employee { public fenployee(char “rane, int age, int month, int day. int year): ~enployee(void): void show_enplayee(votd) : private: char nane( 64] int age: cate *hire_date ay date::dateCint month 11 Nested class nt day, tnt year) date::nonth = month; ddate::day = day: date::year = years } void ate: : show datevotd) { cout << month << °/° << day << '/ y e year << endl: 67 Succes cu C++ enployee! employee (char *naime, int’ 868, int wonth, Jat day, ‘nt year) t stropylenployee: :nane, mane): employee: 290. age = date = new date(nonth, day. year): ‘employee: -employee(void) { delete hire date: 2 votd enployee: show enplayee(votd) cout << “Haine ‘caut << “Age: cout << “Hire date: bnire_date->show dated): } void main(void) t * exployee manager(“Joe Sxith", 33, 12, 25, 1994); “<< nase << endl << age << endl: manager. show_enplayée(): } : = z Daca nu infelegeti inca alocarea gi dealocarea memoriei din constructorul si class date { public: dateCint month, int day, int yeer): date(void) 4 ~tate(void) void show_datel void); private: 68 2: Clase gi obiecte ; ‘Gee:sdtectnt month, in dey, Amt seer © gate: month » nenth: ~date::year = years © out << “In date constructor: ‘Gate: sdate(void) cout << “In date constructor with no date” << endl datecvoid) cout << "In date destructor: show_date(: d etd date: :show date(vosd) cout << month << */" << day << “16 year << endl: 5 ; ‘oid wain(vord) Fe date holidayslEl: date christaasti2, 25, 90): date halToweenti0, 31, 94): date fouruit7, 4, 98: date new yearsit, 1. $5) date birthday(@, 30, 94) hoticayst0] = christaas: holidays(1] ~ bat Toveen: holidays(2] = fourth; holideys(3] = new years: holidays(4] « birthday: ? Dupa cum se observa, programul initalizeaza tabloul in main, Cand se folosesc tablouri de obiecte, trebule infeles c& C++ apeleaza functile constructor $i 69 Succes cu C++ destructor pentru fiecare element al tabloului. In acest caz, functile constructor si destructor afiseazi un mesaj pentru a va insliinta cd au fost apelate. La compilarea si executla programulul, pe ecran se va afiga Cake ARRAY void nain(votd) £ fofstrean alphabet (ALPHABET. DAT"): for (nt letter = "A"; letter <= 2"; Tetter#) alphabet. putt (char ietter): » jin acest caz, programul foloseste functia membru put pentru a scrie valori de: tipul int sub forma ASC Urmatorul program, ABC_INS.CPP, realizeaz4 o procesare identicd, scriind caractere in fisier cu operatorul de inserte. finelude include pid main(void) ‘fstream report “EMPLOYEE. RPT"): & struct [= char naneteay: = int age: char ssanf64): Aloat salary; ae Yemployeest) = {{-Robert Jones". §1, "11-22-3333", $5000.00). ‘(Betty Smith”, “43, '~333-22-1111", 60000.00), : ‘(Reggie ATlen*, 30,,"111-11-0000", 9900.00)};, report <= “Home\t\tage\tSSAN\e\esaTary” << endl: © for Cint i= 0: 1 <3 ty = ( : IE report < setanfiagatis: -employees[i]..nane:; * report

You might also like