Sunteți pe pagina 1din 9

L1 LIMBAJUL DE PROGRAMARE C++ I OOP. CARACTERISTICI C++ este un limbaj de programare orientat pe obiecte.

. Acest limbaj constituie o versiune mbogit a limbajului de programare C (o extensie sau un superset al lui C). Pn n 1983 el se mai numea C cu clase. S precizm cteva din elementele specifice lui C++. Ele constau n extensii ale lui C cu privire la:

a) limbaj: 1. pentru o parcurgere facil a codului surs, se folosete un nou mod de prezentare a comentariilor; 2. se utilizeaz tipurile referin, care simplific, din punct de vedere sintactic, transmiterea parametrilor prin referin; 3. se folosete suprancrcarea operatorilor, cu scopul de a permite, n C++, s acioneze asupra tipurilor abstracte de date definite de utilizator; 4. se folosete suprancrcarea funciilor, care permite utilizarea mai multor funcii cu acelai identificator, dar cu aciuni diferite; 5. se utilizeaz funciile cu parametri implicii. b) o tratare la nivel superior a tipurilor de date definite de utilizator ce const n: 1. folosirea prototipurilor funciilor, care permit o bun verificare a tipurilor parametrilor, la apelul lor; 2. folosirea operatorilor de alocare dinamic a memoriei, care dau o precizie mai mare, n aceast operaie; 3. verificarea transferului de parametri, printr-un control al tipurilor, la editarea de legturi; 4. o nou interfa intrare/ieire (I/O), care d o mai mare flexibilitate, a operaiilor de citire / scriere; 5. existena unor rutine care permit conversia tipurilor definite de utilizator. c) 1. 2. 3. 4. programarea orientat pe obiect (OOP) reflectat prin: gruparea de date i operaii ntr-un acelai tip de date numit clas; un acces selectiv la elementele interne ale unei clase; reutilizarea sau motenirea unor clase prin clase derivate; utilizarea funciilor virtuale, care dau un mijloc mai puternic de apelare al funciilor, n timpul execuiei programului i nu n timpul compilrii lui; 5. utilizarea funciilor friend, care permit accesul din exteriorul unei clase, la elemente protejate din acea clas; 6. utilizarea unor funcii speciale ntr-o clas numite constructori respectiv destructori, necesare pentru a iniializa, respectiv a distruge, obiecte ale acelei clase. Necesitatea introducerii lui C++ se datoreaz i creterii complexitii programelor (trecnd de 25000 de linii de cod, un control n C devine anevoios). De la apariie, C++ a trecut printr-o serie de revizuiri (1985, 1989, iar n 1994 se obine standardul ANSI C++). C++ fiind un superset al lui C, permite compilarea unor programe ANSI C cu un compilator C++, lund n considerare unele aspecte specifice.

1) Evitarea utilizrii unor identificatori n ANSI C care s fie identici cu unele cuvinte cheie din C++. ntr-un program C se pot utiliza drept identificatori de variabile cuvinte cheie ca: this, new, public, dar nu n situaia n care compilarea surselor se face cu un compilator C++. 2) Domeniul de vizibilitate al identificatorului unui tip enumerat declarat n cadrul unei structuri n C coincide cu cel al identificatorului structurii respective. n C++ el este vizibil doar n cadrul acestei structuri. De aceea este bine ca atribuirile s fie nsoite de conversii de tip corespunztoare. Exemplu: struct alfa { enum cod {cif,lit,semn}; }; ntr-un program C, instruciunea: cod c1=semn; este corect. n C++ ea trebuie rescris sub forma: alfa::cod c1=alfa::semn; (asupra operatorului "::" vom reveni). 3) n C este permis conversia implicit a pointerilor generici (void) n alte tipuri de pointeri, pe cnd n C++ nu este permis o astfel de conversie. n C++ toate valorile zero sunt codificate prin 0, iar n ANSI C, unde sunt referii pointeri, este adesea utilizat constanta NULL. Dei diferena este pur stilistic, ea este adoptat permanent. 4) n ANSI C se presupune c orice funcie nedeclarat are un prototip de forma int id_functie(.); n C++, nu se poate apela o funcie nedeclarat, i se va semnala eroare la compilare. 5) Declaraia unei funcii n care lista parametrilor lipsete, este diferit interpretat n C++ fa de ANSI C. De exemplu, void func ( ); n C++ este interpretat sub forma void func(void); cu o list vid de parametri. n ANSI C este interpretat sub forma void func(); ceea ce nu indic lipsa definitiv a parametrilor. 6) Exist diferene ntre lungimile unor tipuri de date. Astfel, n ANSI C, sizeof('c'); este acelai cu sizeof(int) (=2 oct); oricare ar fi caracterul ASCII, 'c'. Compilatorul C interpreteaz constanta caracter 'c' ca o constant ntreag. Prin urmare, n ANSI C, sunt sinonime apeluri de funcii de forma: putchar(10); putchar('\ n'); n C++, sizeof ('c'); este sinonim cu

sizeof (char)(=1 oct); Funciile, n C++, difer ntre ele prin argumentele lor. n cazul de fa un apel de funcie solicita un int iar cellalt apel un char. 7) O linie de comentariu n C++ ncepe cu "//". Exemplu: // acesta este un comentariu Rmne valabil i construcia din C /*comentariu */ Un programator trebuie s in cont de faptul, c pentru a fi portabil, un program C++ trebuie s aib acelai efect, indiferent de maina fizic sau mediul de lucru care au fost folosite. Un program C++ portabil nu depinde de factori ca: a) ordinea de evaluare a parametrilor funciilor; b) ordinea de evaluare a operanzilor operatorilor binari; c) numrul de poziii binare shift-abile la stnga sau la dreapta; d) modul n care se efectueaz operaia de complementare ~ n funcie de maina utilizat; e) precizia de reprezentare i ordinul de mrime al variabilelor de tip float i double; f) ordinea biilor ntr-un octet; g) restriciile cu privire la alinierea datelor n memorie; h) setul de caractere utilizat (ASCII,EBCIDIC,); i) valoarea iniial a variabilelor automatice rmase neiniializate; j) ordinea n care se construiesc obiectele globale (definite n exteriorul oricrei funcii) etc. Funciile normale C, adic cele care sunt compilate i depozitate ntr-o run-time library, se pot utiliza n programe C++ cu condiia ca ele s fie totui declarate ca funcii C. Majoritatea diferenelor de stil, ntre programele redactate n C i cele n C++, se regsesc n avantajul pe care l are C++ cu privire la capacitatea sa de orientare pe obiecte. De aceea este bine a gndi i programa n C++ fr a apela la C. Trebuie s avem n vedere caracteristicile specifice programrii n C++. Se tie c un stream (flux) reprezint o colecie de octei care servete ca model abstract pentru dispozitive de intrare/ieire ca: fiier pe disc, tastatur, ecran, buffer pentru memorie. Borland C++ include biblioteca iostream care trateaz operaiile de intrare/ieire prin intermediul unei clase de obiecte. Reducerea duratei, n trecerea de la stdio (C) la iostream (C+ +), se bazeaz tocmai pe faptul c biblioteca iostream conine obiecte predefinite de tip stream (cin, cout, cerr) care au un rol similar din punct de vedere funcional cu stdin, stdout, stderr din C. Operaiile de intrare / ieire la nivel de consol, specifice lui C++, se bazeaz pe aceste fluxuri predefinite: a. cin un flux de intrare conectat la intrarea standard - tastatura (analog cu stdin din C); b.cout - un flux de ieire conectat la ieirea standard monitorul (analog cu stdout din C); c.cerr- un flux de ieire care furnizeaz o ieire fr a folosi buffer la dispozitivul standard de eroare (analog cu stderr din C); d. clog- un flux care folosete buffere la fel ca cin i cout (analog cu cerr).

Cnd i ncepe execuia un program n C++, se deschid automat aceste patru stream-uri ncorporate. Implicit, stream-urile standard sunt folosite pentru a comunica cu consola. n mediile

care admit redirecionarea I/O (DOS, Unix, OS/2,Windows),stream-urile standard pot fi redirecionate spre alte echipamente sau fiiere. Standardul ANSI C++ mai definete urmtoarele patru stream-uri:win, wout,werr i wlog. Ele constituie versiuni ale stream-urilor standard pentru caractere mari ( wide caracters). Acestea sunt de tipul wchar_t i, n general, au mrimea de 16 bii. Sunt folosite pentru seturile lrgite de caractere necesare anumitor limbi. n loc de a defini funcii membre ale unei clase, care s realizeze operaiile de intrare/ieire, biblioteca iostream are n vedere suprancrcarea operatoriilor << i >>. Aceti operatori conlucreaz cu fluxurile cin i cout. ecran buffer operatorul << reprezentare intern (binar) cout este conectat la ecran; bufferul este asociat fluxului de ieire cout; operatorul << convertete reprezentarea intern n caractere; tastatur buffer operatorul >> reprezentare intern (binar)

cin este conectat la tastatur; bufferul este asociat fluxului de intrare cin; operatorul >> convertete caracterele n reprezentarea binar intern. Biblioteca C++ iostream constituie o implementare orientat pe obiecte a unui flux de octei de la o surs la o destinaie. n aceast bibliotec se afl fluxuri de intrare (clasa istream similar, din punct de vedere funcional, cu scanf i fscanf (din ANSI C)), fluxuri de ieire (clasa ostream similar, din punct de vedere funcional, cu printf i fprintf (din ANSI C)) i fluxuri care pot trata att operaii de intrare ct i de ieire (clasa iostream).

Stream-urile de intrare / ieire suprancarc operatorii binari de shiftare >> (EXTRACIE, adic preia de la), << (INSERIE, adic pune la). Ei realizeaz un transfer al informaiei cu formatare. Operatorul >> este util pentru intrare (cin), iar <<, pentru ieire (cout). Operandul stng, la care se aplic un astfel de operator, reprezint un obiect de tipul istream, respectiv ostream, iar operandul drept poate fi de orice tip pentru care operatorul a fost definit. Cei doi operatori sunt predefinii pentru tipurile de baz ale limbajului (int, char, float etc.) i se pot suprancrca pentru orice tip de date definit de utilizator. Dac un astfel de operator a fost suprancrcat, avnd operandul drept de tipul T (definit de utilizator), atunci el se va numi T-extractor, respectiv T-insertor. Exemplu: char car; cin>>car; cout<<car; Prin aceast secven se va citi un caracter car din stream-ul de intrare (tastatura), care va fi scris, dup aceea, n stream-ul de ieire (ecranul). Ambii operatori au proprietatea de asociativitate de la stnga la dreapta i returneaz o referin (nume alternativ pentru un obiect) la primul operand al lor,adic un istream &, respectiv un ostream &. Aceti operatori se pot nlnui sau concatena (vezi asociativitatea) formnd operaii multiple de tipul, cin>>v1>>v2>.>>vn; cout<<v1<<v2<<..<<vn; Nu se accept dect nlnuri cu operatori de acelai fel.

Exemplu: #include<iostream.h> void main (void){ int x,y; float z; cout<<"Introduceti un intreg /un real\n"; cin>>x>>z; y=x+2; cout<<"x+z="<<(x+z)<<"x&y="<<(x&y)<<"\n"; } Parantezele sunt necesare avnd n vedere precedena operatorilor utilizai. Tipurile datelor citite de la cin pot fi tipuri aritmetice i iruri de caractere. Tipurile datelor transferate ctre cout sunt aceleai ca la citire. n plus, ele pot fi i pointeri de un tip oarecare, cu excepia tipului char.

Extragerea unei valori numerice nseamn: ignorarea tuturor caracterelor spaiu, adic acele caractere pentru care funcia de bibliotec isspace(), returneaz o valoare nenul (blancul, '\ t', '\ v', '\ n' etc.); - un text, dac primul caracter diferit de caracter_spaiu este o cifr, un semn sau punctul zecimal (la float); - extragerea tuturor caracterelor consecutive pn la ntlnirea unui caracter invalid pentru tipul de dat respectiv; - efectuarea, la final, a conversiei string-ului obinut la tipul de dat respectiv. S analizm urmtorul exemplu: #include <iostream.h> main ( ) { int k=5; cout<<"IESIREA\n"; //comentariu n C++ cout<<"Introduceti o valoare:"; cin>>k; cout<<k<<"la cub este:"<<k*k*k<<"\ n"; return 0; } a) Se observ c este inclus fiierul antet iostream.h, util n admiterea operaiilor de intrare / ieire n C++. Acest fiier conine definiiile claselor care implementeaz obiectele fluxuri i permit folosirea bufferelor. El joac un rol similar lui stdio.h din C. b) Se va reine faptul c lista de parametri din main( ) este vid. n C++ aceasta nseamn c funcia nu are parametri. n acest caz, n C++, utilizarea lui void devine superflu. c) n urmtoarele linii apare suprancrcat operatorul <<, respectiv >>, n sensul precizat mai sus, specific lui C++. d) Se poate utiliza i printf( ) din C, dar cu includerea lui stdio.h. e) Operatorii de deplasare, atunci cnd nu sunt folosii n operaiile de intrare / ieire, vor indica operaiile de deplasare stnga / dreapta corespunztoare.

f) n linia de cod cin>>k; nu este necesar & n faa lui k (detalii la stream-urile definite n C++). g) Pentru k=5, prin penultima linie, se va tipri valoarea 125. h) Returnarea valorii 0 unitii apelante (de obicei sistemul de operare), indic o terminare normal a programului. Altfel, n caz de eroare, se va returna o valoare diferit de 0. i) Exist dou posibiliti, n C++, n ceea ce privete tipul returnat de funcia main ( ): - nu declarm nimic, ceea ce nseamn c tipul returnat este void; - returneaz o valoare ntreag. Nu este obligatoriu ca o astfel de funcie s returneze o valoare. j) Un astfel de program nu apeleaz la construcii din C, ci utilizeaz numai construcii specifice lui C++. Exist o serie de funcii care pot fi utilizate n combinaie cu operatorii de intrare / ieire. Iostream posed, dup cum am mai menionat, o serie de rutine pentru acces la nivel de caracter. Majoritatea acestora aparin clasei istream i sunt asociate operaiilor de intrare (intrri neformatate). Exist o metod, mai des ntlnit, folosit pentru operaia de ieire, put( ), care face parte din clasa ostream. Intrarea unui singur caracter se poate realiza cu ajutorul funciei get( ) a clasei istream. int get(void); Se extrage urmtorul caracter de la intrare i-l returneaz. Dac este detectat sfritul intrrii, se returneaz EOF. int peek(void); Se returneaz urmtorul caracter de la intrare, fr a-l extrage. Dac este detectat sfritul intrrii, se returneaz EOF. istream &putback(char c); Se ntoarce caracterul c la intrare i returneaz o referin. istream &get(signed char &c); istream &get(unsigned char &c); Se extrage caracterul urmtor de la intrare i returneaz intrarea ca referin. Se poate spune c funcia get( ) extrage un caracter din stream-ul curent i-l pstreaz n zona de memorie referit de parametrul formal c. Aceast funcie nu trece peste caracterele albe. Ea extrage din stream-ul curent caracterul, indiferent dac acesta este sau nu un caracter alb. istream &get(signed char *s,int n, char t='\n'); istream &get(unsigned char *s,int n, char t='\n'); Se extrag cel mult n caractere (un ir, inclusiv \0) din stream-ul curent de la intrare i le depun n irul s. Dac se detecteaz terminatorul de ir t, extragerea se oprete fr a se realiza extragerea i depunerea terminatorului n irul s. istream &getline(signed char *s,int n, char t='\n'); istream &getline(unsigned char *s,int n, char t='\n'); Aceeai aciune ca i get( ), cu deosebirea c terminatorul de ir este extras de la intrare, dar nu este depus n ir. istream &ignore(int n, int t=EOF); Extrage i ignor cel mult n caractere de la intrare, inclusiv terminatorul t. int gcount(void); Returneaz numrul de caractere extrase la ultima operaie de extragere. Extragerea binar a datelor din stream-ul curent se realizeaz folosind funcia read( ). istream &read(unsigned char*s, int n) ; istream &read(signed char*s, int n) ;

Se extrag n octei din stream-ul curent i i transfer n zona de memorie referit de s. ostream &put(char c); Se introduce caracterul c la ieirea ostream i returneaz o referin. Exemplu: // apeluri n C //apeluri n C++ c= fgets(stdin); c=cin.get( ); fgets(buff,80,stdin); cin.getline(buff,80); ungetc(c,stdin); cin.putback(c ); fputc(c,stdout); cout.put(c ); Analizai astfel de apeluri i precizai efectul lor. Exist posibilitatea concatenrii unor operaii de intrare/ieire. S presupunem c dorim a afia caracterele:'B', 'C', 'D'. O variant const n a folosi n mod individual metoda put( ): cout.put('B'); cout.put('C'); cout.put('D'); O alt variant, mai compact, ar fi urmtoarea: cout.put('B').put('C').put('D'); sau nc ((cout.put('B')).put('C')).put('D') (se are n vedere asociativitatea la stnga a operatorului "."). S se fac o analogie cu printf( ). Atributele de orientare pe obiecte pot fi potenial aplicate tuturor sarcinilor de programare. C++ se poate utiliza i pentru obiecte ca: editoare, baze de date, fiiere de personal, programe de comunicare. Cu ajutorul lui C++ s-au creat multe sisteme de nalt performan. Programarea orientat pe obiect (OOP) constituie o nou cale de abordare a programrii. Se poate spune, c datorit creterii continue a complexitii programelor, OOP vine s salveze programarea structurat care devine aproape ineficient n astfel de condiii. OOP preia cele mai reuite aspecte ale programrii structurate i le combin cu mai multe concepte noi, puternice. Ideea OOP conduce la divizarea unei probleme n subgrupe de seciuni nrudite care in cont de codul i de datele corespunztoare din fiecare grup, organizndu-le ntr-o structur ierarhic. Limbajele de programare orientat pe obiect posed trei concepte fundamentale : ncapsulare, motenire, polimorfism. ncapsularea permite crearea unor obiecte (entiti logice care cuprind att date ct i un cod ce prelucreaz aceste date). Ea const ntr-un mecanism care leag codul cu datele i le pstreaz n siguran. Adic, un obiect posed un anumit nivel de protecie, n sensul c nu se pot produce modificri accidentale sau o utilizare incorect a unor pri proprii ale acelui obiect de ctre anumite seciuni ale programului cu care nu are nici o legtur. Un obiect se va identifica printr-o variabil de un tip definit de utilizator. Cnd n OOP se definete un obiect, n mod implicit, se creeaz un nou tip de date. Un obiect real este caracterizat prin structur i funcionalitate. El poate fi supus unei evoluii pstrndu-i identitatea, dar modificndu-i structura i / sau aspectele sale funcionale. Ca o concluzie, obiectul constituie conceptul de baz n OOP i cuprinde o structur de date i metode de operare.

Tipurile abstracte de date se vor defini cu ajutorul conceptului de clas. Clasele se afl la baza programrii orientat pe obiect. Clasa este util n definirea naturii unui obiect i constituie unitatea de baz pentru ncapsulare.

Motenirea const ntr-un proces prin care un obiect poate prelua prototipul unui alt obiect. Ea permite construirea unei ierarhii de clase, prin trecerea de la cele generale la cele particulare (clas de baz - clas derivat). Fiecare obiect trebuie definit prin punerea n eviden a tuturor caracteristicilor sale. Motenirea ns, ofer posibilitatea definirii doar acele caracteristici ale obiectului, care l identific n mod unic n clasa sa. Ierarhia se produce ntre diverse forme de existen a materiei i diferite fenomene. n vrful ierarhiei se va afla acel obiect care va avea trsturi comune cu toate celelalte componente din ierarhie. Ierarhia se poate prezenta sub o form arborescent. Odat stabilit, ntre mai multe concepte, ea nu este neaprat unic. n OOP se permite definirea de ierarhii ntre tipuri abstracte de date pe baza conceptului de motenire. n C++, ierarhia ntre tipuri abstracte de date se exprim prin ierarhia de clase care implementeaz acele tipuri abstracte de date. Aceast ierarhie se stabilete pe baza conceptelor de clas de baz i clas derivat (aceste concepte vor fi analizate pe parcurs).

paralelogram dreptunghi ptrat Polimorfismul este caracteristic programrii orientat pe obiect. El ar putea fi interpretat ca o interfa /metode multiple. Acesta ofer posibilitatea ca o interfa s fie folosit cu o clas general de aciuni. Compilatorul C++ permite ca polimorfismul s fie admis att n timpul rulrii ct i al compilrii. ntr-o ierarhie de clase, care are la baz conceptul de motenire, polimorfismul este pus n eviden prin funcii membre (metode prezente ntr-o clas) care pot avea forme diferite de la un nivel la altul. Tehnica programrii orientat pe obiect difer de cea a programrii structurate, prin faptul c: programarea structurat este dirijat de prelucrri, iar OOP de definirea obiectelor; programarea structurat trateaz complexitatea i diversitatea printr-o structurare a datelor i prelucrrii lor, iar OOP se bazeaz pe studiul modelelor ct mai apropiate de obiectele reale i de modul de reprezentare cunoscut de programator. Exist o serie de avantaje de ordin practic ale OOP: se folosesc biblioteci i colecii de clase care mresc coeficientul de reutilizare a codului scris; programatorul are garania utilizrii unor proceduri scurte, inteligibile i corecte; bibliotecile de clase se mai pot folosi i n realizarea prototipurilor unor produse software (un program simplificat, funcional, care d o imagine corect a produsului final). romb

TEMATIC PROPUS 1. Se consider un apel al funciei printf( ) din biblioteca stdio prin care se introduc informaii din stdin: int u=55;

printf("Valoarea solicitat este %d \n", u); De ce la acest nivel este ceva mai greu de conceput un model, care s accepte o abordare orientat pe obiect? Cum tratai situaia respectiv folosind biblioteca iostream? 2. S scrie un program n C care utilizeaz funciile printf( ) i scanf( ) incluznd stdio.h i apoi varianta aceluiai program n C++, utiliznd iostream.h. 3. S considerm urmtorul exemplu de citire / scriere a unor date: # include <iostream.h> void main( ) { int k; cin>>k; cout <<k; } Precizai echivalenele n C. Ce diferene exist ntre aceste funcii? 4. Scriei programe, n C++, prin care s se realizeze concatenarea unor operaii de I/O. 5. Scriei programe , n C++, n care s se foloseasc funcii de I/O la nivel de caracter.

10