+ All Categories
Home > Documents > Unitatea de Invatare Nr 1

Unitatea de Invatare Nr 1

Date post: 04-Oct-2015
Category:
Upload: mosneag-alexandru
View: 8 times
Download: 2 times
Share this document with a friend
Description:
Unitatea de invatare
Popular Tags:
25
1 Unitatea de învăŃare Nr. 1 Introducere în programarea orientată pe obiecte Cuvinte cheie: abstractizarea datelor, tip abstract de date, încapsulare, referinŃe, pointer. 1.1 Introducere ModalităŃile (tehnicile, paradigmele) de programare au evoluat de-a lungul anilor, reflectând trecerea de la programe de dimensiuni reduse, la programe şi aplicaŃii de dimensiuni foarte mari, pentru coordonarea cărora sunt necesare tehnici evoluate. Software-ul de dimensiuni mari, care nu poate fi realizat de o singură persoană, intră în categoria sistemelor complexe, cu o mare diversitate de aplicaŃii. SituaŃiile reale şi experienŃe ale psihologilor au relevat limitele capacităŃii umane în perceperea sistemelor complexe, adică imposibilitatea unei persoane de a percepe şi controla simultan un număr mare de entităŃi de informaŃie. De aceea, este esenŃială descompunerea şi organizarea sistemelor complexe, pentru a fi percepute, proiectate sau conduse. Materialul trebuie parcurs în ordinea sa firească prezentată în continuare, inclusiv în zona referitoare la aplicaŃii. Se recomandă conspectarea şi notarea ideilor principale. Timpul minim pe care trebuie să-l acordati acestui modul este de 4 ore. Obiective: După ce veŃi parcurge această unitate de învăŃare, veŃi reuşi să: intelegeŃi conceptele progrămarii orientate pe obiecte; realzaŃi o paralelă între programarea procedurală şi cea orientată pe obiecte; cunoaşteŃi elemnte specifice limbajului C++
Transcript
  • 1

    Unitatea de nvare Nr. 1 Introducere n programarea orientat pe obiecte

    Cuvinte cheie: abstractizarea datelor, tip abstract de date, ncapsulare, referine, pointer. 1.1 Introducere

    Modalitile (tehnicile, paradigmele) de programare au evoluat de-a lungul anilor, reflectnd trecerea de la programe de dimensiuni reduse, la programe i aplicaii de dimensiuni foarte mari, pentru coordonarea crora sunt necesare tehnici evoluate. Software-ul de dimensiuni mari, care nu poate fi realizat de o singur persoan, intr n categoria sistemelor complexe, cu o mare diversitate de aplicaii. Situaiile reale i experiene ale psihologilor au relevat limitele capacitii umane n perceperea sistemelor complexe, adic imposibilitatea unei persoane de a percepe i controla simultan un numr mare de entiti de informaie. De aceea, este esenial descompunerea i organizarea sistemelor complexe, pentru a fi percepute, proiectate sau conduse.

    Materialul trebuie parcurs n ordinea sa fireasc prezentat n continuare, inclusiv n zona referitoare la aplicaii. Se recomand conspectarea i notarea ideilor principale. Timpul minim pe care trebuie s-l acordati acestui modul este de 4 ore.

    Obiective: Dup ce vei parcurge aceast unitate de nvare, vei reui s:

    intelegei conceptele progrmarii orientate pe obiecte;

    realzai o paralel ntre programarea procedural i cea

    orientat pe obiecte;

    cunoatei elemnte specifice limbajului C++

  • 2

    Modul n care este abordat programarea, din punct de vedere al descompunerii programelor, definete mai multe tehnici de programare , care s-au dezvoltat i au evoluat odat cu evoluia sistemelor de calcul. Programarea procedural este prima modalitate de programare care a fost i este nc frecvent folosit. n programarea procedural accentul se pune pe descompunerea programului n proceduri (funcii) care sunt apelate n ordinea de desfurare a algoritmului. Limbajele care suport aceast tehnic de programare prevd posibiliti de transfer a argumentelor ctre funcii i de returnare a valorilor rezultate. Limbajul Fortran a fost primul limbaj de programare procedural. Au urmat Algol60, Algol68, Pascal, iar C este unul din ultimele invenii n acest domeniu. Programarea modular. n cursul evoluiei programrii procedurale, accentul n proiectarea programelor s-a deplasat de la proiectarea procedurilor ctre organizarea datelor, aceast deplasare reflectnd creterea dimensiunilor programelor. O mulime de proceduri corelate, mpreun cu datele pe care le manevreaz, sunt organizate ca un modul. Tehnica de programare modular decide descompunerea unui program n module, care ncorporeaz o parte din datele programului i funciile care le manevreaz. Aceast tehnic este cunoscut ca tehnic de ascundere a datelor (data-hiding). n programarea modular stilul de programare este n continuare procedural, iar datele i procedurile sunt grupate n module, existnd posibilitatea de ascundere a unor informaii definite ntr-un modul, fa de celelalte module. Gruparea de date i proceduri n module nu implic i o asociere strict ntre acestea.

    Programarea orientat pe obiecte apeleaz la o modalitate nou de gndire a unei probleme. Spre deosebire de programarea procedural care se concentreaz pe structuri de date i algoritmi, programarea orientat pe obiecte se concentreaz pe definirea de obiecte care modeleaz problema ce trebuie rezolvat. n programarea orientat pe obiecte (POO) un program are rolul de a simula strile i activitile obiectelor lumii reale. Pe lng structuri de date (care descriu strile obiectelor, atributele acestora) trebuie incluse i metodele asociate obiectelor, adic acele funcii care modific atributele obiectelor i care descriu comportamentul lor.

    1.2 Abstractizarea datelor. Tipuri de date abstracte

    Primul pas pe care l facem cnd scriem un program care s realizeze diferite operaii, este s gasim un model care simplific realitatea, prin separearea detaliilor care interreseaz, de cele care nu afecteaz problem pe care o rezolvam asfel, datele cu care se lucreaz, operaiile, in de specificul fiecarei probleme tratate. Acest proces de grupare a datelor i metodelor de prelucrare specifice rezolvarii unei probleme se numete abstractizare.

  • 3

    n cazul dezvoltrii unui produs software, abstractizarea se poate defini ca fiind o structurare a unei probleme n entitti bine precizate prin definirea datelor i a operaiilor asociate. Aceste entitti combin date i operatii care sunt necuplate ntre ele. Procedurile si funciile au fost primele dou mecanisme de abstractizare larg rspndite n limbajele de programare.

    Procedura a reprezentat si prima modalitate de ascundere a informatiei (interfaa cu procedura). Modulele au reprezentat urmtorul mecanism de abstractizare prin gruparea procedurilor si funciilor ce sunt relationate. n continuare, tipurile de date abstracte au realizat un pas important ctre dezvoltarea unui software de calitate si au permis trecerea la abordarea orientat pe obiecte a problemelor.

    Un tip de date abstract (TDA) const dintr-o structur de date abstract si o multime de operatii. Interfaa unui TDA este definit de multimea de operatii si reprezint acea portiune a unui TDA care este vizibil din exterior. Conceptul de tip de date abstract presupune existenta unui mecanism de separare a specificatiei de implementare. Aceasta nseamn c un utilizator al unui TDA trebuie s cunoasc doar modul de utilizare al tipului de date, nu si detaliile de implementare. Un tip de date abstract (TDA) este caracterizat de urmtoarele proprietti: 1. export un tip; 2. export o multime de operatii (furniznd interfaa TDA); 3. singurul mecanism de acces la structura de date a tipului este furnizat de operatiile definite n interfat; 4. axiomele si preconditiile definesc domeniul deaplicaie al tipului. De exemplu, dorim s construim TDA persona. S presupunem c realizam o aplicaie necesara pentru realizarea recesamnatului populatiei, atunci datele care interseaza pentru tipul persoana sunt: nume, prenume, loc_nastere, adresa etc. Daca aplicatia presupune, in schimb, gestiunea intretinerii pentru o asociatie de locatari, atunci pentru tipul persoana sunt necesare si date cum ar fi : spatiul_locuit, nr_persoane etc. Deci, prin procesul de abstractizare, separm datele care intereseaza de cele care nu fac obiectul aplicaiei. Construim, ulterior, un tip abstract de date care inglobeaza o structura de date impreuna ca operatii aupra datelor ( ex: calculul intretinerii pentru o persoana, nr_persoane pe fiecare judet etc.). Exemplu: TDA_persona nume prenume spatiu_locuit

    structura de date

  • 4

    calcul intretinere; - operatii asupra datelor Programarea orientat pe obiecte este programarea cu tipuri de date abstracte, care combin functionalittile acestora pentru rezolvarea problemelor. n programarea orientat pe obiecte, TDA-urile sunt numite clase.

    1.3 Concepte ale programrii orientate pe obiecte

    Conceptele programrii orientate pe obiecte au aprut din dezvoltrile realizate n cadrul limbajelor moderne de programare. Astfel, limbajele orientate pe obiecte au noi structuri care mbunttesc ntretinerea programului si fac ca portiuni mari de program s fie reutilizabile, conducnd astfel la scderea costului de dezvoltare a produselor software. Cele sase concepte de baz ce caracterizeaz programarea orientat pe obiecte sunt : Obiectele; Clasele; Mesajele Incapsularea; Mostenirea Polimorfismul.

    Obiectele Un obiect poate fi considerat ca fiind o entitate care ncorporeaz att structuri de date (denumite atribute) ct si comportament (actiuni). Obiectele sunt inteligente prin faptul c realizeaz anumite actiuni si stiu cum s execute aceste actiuni. Inteligenta unui obiect reprezint o form de abstractizare prin faptul c presupune c un obiect poate executa o actiune si ascunde detaliile referitoare la modul n care se va realiza efectiv actiunea. Obiectele pot fi de tipuri diferite: entitti fizice, algoritmi, relatii sau subsisteme. Practic, obiectele sunt componente de software reutilizabil care modeleaz elemente din lumea real. Pentru tipul de date abstract persoana definit mai sus un exemplu de obiect poate fi definit astfel : Popescu Ion, 34, 56 m2 .

    Clasele Clasele desemneaz o colecie de obiecte (de natur material sau spiritual) care au n comun faptul c pot fi caracterizate similar din punct de vedere informaional i comportamental.

  • 5

    Este evident faptul c identificarea unei clase este n mod normal, rezultatul unui demers cognitiv care presupune caracterizarea unui obiect prin nsuirile lui (informaionale i comportamentale) care i definesc apartenena la o anumit clas de obiecte. Aadar, conceptul de clas adun laolalt datele i metodele de prelucrare a acestora. O clas reprezint de fapt o implemntare a tipului abstract de date. O declarare a unei clase definete un tip nou care reunete date i funcii. Acest tip nou poate fi folosit pentru a declara obiecte de acest tip, deci un obiect este un exemplar (o instan) a unei clase.

    Mesajele Obiectele pot comunica ntre ele prin intermediul mesajelor. Trimiterea unui mesaj care cere unui obiect s aplice o anumit actiune numit metod este similar apelului de procedur din limbajele de programare procedural. n programarea orientat pe obiecte se consider c obiectele sunt autonome si pot comunica ntre ele prin interschimb de mesaje. Obiectele reactioneaz atunci cnd primesc mesaje, aplicnd o anumit metod, de exemplu. Ele pot refuza executarea metodei respective dac, de exemplu, obiectului care este apelat nu i se permite s execute metoda cerut. Un mesaj este o cerere adresat unui obiect pentru a invoca una din metodele sale. Astfel,

    un mesaj conine numele metodei i argumentele metodei.

    Exemplul : calculul intreinerii pentru obiectul Popescu Ion.

    ncapsularea

    nelegerea acestui principiu presupune dou nivele de abordare.

    Ca metod de concepie, ncapsularea se refer la capacitatea de a separa aspectele externe ale unui obiect (interfaa), accesibile altor obiecte, de aspectele implementaionale, interne obiectului, care sunt ascunse fa de celelalte obiecte. Utilizatorul unui obiect poate accesa doar anumite metode ale acestuia, numite publice, n timp ce atributele i celelalte metode i rmn inaccesibile (acestea se numesc private).

    ncapsularea este foarte important atunci cnd dorim s schimbm implementarea anumitor metode (cu scopul de a optimiza un algoritm sau de a elimina posibile erori). ncapsularea ne va mpiedica s modificm toate caracteristicile obiectului iar aplicaiile care utilizeaz obiectul nu vor avea de suferit deoarece protocolul de comunicaie al obiectului motenit de la interfaa clasei (rezultatul ncapsulrii ca metod de concepie) nu s-a schimbat.

  • 6

    Ca implementare, la nivelul unui limbaj de programare, ncapsularea este asigurat de exigenele sintactice specifice.

    Motenirea

    Mecanismul derivarii permite crearea facila de noi clasa, care preiau caracteristicile unor clase de baza, deja definite. Derivarea are ca obiectiv reutilizarea soft-ului, prin folosirea uneor funcii deja scrise pentru clasele existente i eliminarea redundanei descrierilor, n cazul claselor care au elemente comune, funcii sau date. Acest concept este prezentat n detaliu n moulul 3.

    Polimorfismul

    Termenul polimorfism se refer la comportamente alternative ntre clase derivate nrudite. n cazul n care mai multe clase mostenesc atributele i comportamentele unei clase de baz, pot apare situaii n care comportamentul unei clase derivate ar trebui s fie diferit de cel al clasei de baz sau de cel al clasei derivate de tip frate (de pe acelasi nivel). Aceasta nseamn c un mesaj poate avea efecte diferite n funcie de clasa obiectului care primeste mesajul. De exemplu s considerm trei clase: clasa de baz Fisier si clasele derivate FisierASCII si FisierBitmap care mostenesc toate atributele i comportamentele clasei Fisier cu excepia comportamentului Tiprire. Un mesaj care va activa comportamentul Tiprire al unui obiect al clasei Fisier poate determina afisarea atributelor mrime fisier, tip fisier i data/ora crerii/ultimei modificri a fisierului. Acelai mesaj trimis unui obiect al clasei FisierASCII va determina afiarea textului din fisier, n timp ce dac va fi trimis unui obiect al clasei FisierBitmap va determina execuia unui program de afiare grafic.

    1.4 Elemente ntroductive ale programrii orientate pe obiecte n limbajul C++

    Limbajul C++ este unul dintre cele mai utilizate limbaje de programare orientate pe obiecte; compilatoare, biblioteci i instrumente de dezvoltare a programelor C++ sunt disponibile att pentru calculatoare personale ct i pentru cele mai dezvoltate sisteme i staii de lucru. Limbajul C++ este o versiune extins a limbajului C elaborata de ctre B. Stroustrup n anul 1980 n laboratoarele Bell din Murray Hill, New Jersey. Extensiile dezvoltate de Stroustrup pentru limbajul C++ permit programarea orientat pe obiecte, pstrnd

  • 7

    eficiena, flexibilitatea i concepia de baz a limbajului C. Numele iniial a fost C cu clase, numele de C++ fiindu-i atribuit n anul 1983. Scopul pentru care a fost creat C++ este acelai cu scopul pentru care este abordat n general programarea orientat pe obiecte: dezvoltarea i administrarea programelor foarte mari. Chiar dac superioritatea limbajului C++ este evident n cazul dezvoltrii programelor foarte mari, nu exist limitri n a fi folosit n orice fel de aplicaie, deoarece C++ este un limbaj tot att de eficient ca i limbajul C. De la apariia sa, C++ a trecut prin trei revizii, n 1985, 1989 i ultima, prilejuit de definirea standardului ANSI pentru acest limbaj. O prim versiune a standardului a fost publicat n anul 1994, iar urmtoarea versiune este nc n lucru. n general, limbajul C++ prevede mai multe faciliti i mai puine restricii dect limbajul C, astfel nct majoritatea construciilor din C sunt legale i au aceeai semnificaie i n C++. n acest capitol sunt prezentate unitar i concis conceptele de baz n programarea C++, att cele care sunt preluate din limbajul C ct i cele nou introduse.

    Operatii de intrare/iesire. Stream-uri

    Cel mai scurt program C++ este:

    main(){ }

    Acesta definete o funcie numit main (), care nu primete nici un argument, nu execut nimic i nu returneaz nici o valoare. Dac se dorete ca programul s scrie un mesaj la consol (de tipul Primul program in C++!), pe lng utilizarea funciei obinuite din limbajul C (funcia printf()), n C++ se poate utiliza i o funcie de scriere la ieirea standard (cout). Aceast funcie este funcia operator de scriere

  • 8

    poate fi realizat n C++ printr-o instruciune care folosete funcia operator de citire >>. De exemplu, n instruciunile care urmeaz se citete de la tastatur un numr ntreg:

    int i;

    cin >> i; Exemplul P1.1 prezint un exemplu de utilizare a operatiilor de intrare/iesire n limbajul C++.

    // fisierul sursa P1_1.cpp

    #include

    void main()

    {

    int a, b;

    float m;

    cout > a;

    cout > b;

    m = (float) (a+b)/2;

    cout > b;

    m = (float) (a+b)/2;

    cout var_1 >> var_2 >> >> var_n;

  • 9

    Se citesc de la dispozitivul de intrare valorile variabilelor var_1, var_2, , var_n. Sintaxa operatiei de iesire (scriere, afisare):

    cout

  • 10

    tablouri de obiecte, pointeri la obiecte, referine, funcii, constante simbolice, clase, structuri, uniuni, pointeri la membrii claselor. n continuare se vor prezenta primele cinci tipuri derivate, iar celelate vor fi introduse pe parcursul seciuniunilor urmtoare.

    Tablouri de obiecte

    Un tablou (array) de obiecte poate fi construit din obiecte dintr-un tip fundamental (cu excepia tipului void), din pointeri, din enumeraii sau din alte tablouri. n traducere, pentru array se mai ntlnesc termenii vector i matrice. n acest text sunt folosii termenii tablou (pentru array multidimensional) i vector (pentru array unidimensional). Declaraia: T D[expresie] introduce un tablou de obiecte de tipul T, cu numele D i cu un numr de elemente al tabloului dat de valoarea expresiei, care trebuie s fie de tip constant ntreg. Pentru valoarea N a acestei expresii, tabloul are N elemente, numerotate de la 0 la N-1. Un tablou bidimensional se poate construi printr-o declaraie de forma:

    T D[dim1][dim2];

    i reprezint dim1 tablouri unidimensionale, fiecare de dimensiune dim2. Elementele tabloului bidimensional se memoreaz cu valori succesive pentru indicele din dreapta astfel:

    D[0][0], D[0][1], D[0][dim2-1],

    D[1][0], D[1][1], D[1][dim2-1],.

    D[dim1-1][0], D[dim1-1][1], D[dim1-1][dim2-1].

    ntr-un mod asemntor se pot construi tablouri multidimensionale, cu o limitare a numrului de dimensiuni care depinde de implementare.

    Pointeri

    Pentru majoritatea tipurilor T, T* este un tip denumit pointer la T, adic o variabil de tipul T* memoreaz adresa unui obiect de tipul T.

  • 11

    Operaia fundamental asupra unui pointer este operaia de derefereniere (dereferencing), adic accesarea obiectului a crui adres o reprezint pointerul respectiv. Operatorul de derefereniere este operatorul unar *. De exemplu:

    char c1 = a; // variabila c1 char* p1 = &c1; // p memoreaz adresa lui c1 char c2 = *p1; // dereferentiere, c2 = a;

    Operatorul & este operatorul adres, care se utilizeaz pentru a obine adresa unei variabile. Tipul void* este folosit pentru a indica adresa unui obiect de tip necunoscut. Asupra pointerilor sunt admise unele operaii aritmetice. De exemplu, se consider un vector de caractere dintre care ultimul este caracterul 0 (se mai numete ir de caractere terminat cu nul). Pentru calculul numrului de caractere se pot folosi operaii cu pointeri astfel:

    int strlen(char* p){

    int i = 0;

    while (*p++) i++;

    return i;

    }

    Funcia strlen() returneaz numrul de caractere ale irului, fr caracterul terminal 0, folosind operaia de incrementare a pointerului i operaia de derefereniere pentru a testa valoarea caracterului. O alt implementare posibil a funciei este urmtoarea:

    int strlen(char* p){

    char* q = p;

    while (*q++);

    return q-p-1;

    }

    n C++, ca i n limbajul C, pointerii i tablourile sunt puternic corelate. Un nume al unui tablou poate fi folosit ca un pointer la primul element al tabloului. De exemplu, se poate scrie:

    char alpha[] = abcdef;

    char* p = alpha;

    char* q = &alpha[0]; // p = q

    Rezultatul aplicrii operatorilor aritmetici +, -, ++, -- asupra pointerilor depinde de tipul obiectului indicat. Atunci cnd se aplic un operator aritmetic unui pointer p de tip T*, se consider c p indic un element al unui tablou de obiecte de tip T; p+1 va indica

  • 12

    urmtorul element al tabloului, iar p-1 va indica elementul precedent al tabloului. Acest lucru nseamn c valoarea lui p+1 este cu sizeof(T) octei mai mare dect valoarea lui p.

    Referine

    O referin (reference) este un nume alternativ al unui obiect. Utilizarea principal a referinelor se face pentru specificarea argumentelor i a valorilor returnate de funcii, n general, i pentru suprancrcarea operatorilor n special. Notaia X& nseamn referin la un obiect de tipul X. De exemplu:

    int i = 1;

    int& r = i; // r i i se refer la aceeai entitate

    int x = r; // x = 1

    r++; // i = 2;

    Implementarea obinuit a unei referine se face printr-un pointer constant care este derefereniat de fiecare dat cnd este utilizat. Aa cum se poate observa, pentru definirea unei referine se folosete operatorul adres &, dar difer tipul construciei n care este folosit. De exemplu:

    int a = 5;

    int* pi = &a; // & calculeaz adresa;

    // pi este adresa lui a

    int& r = a; // & introduce o referinta;

    // r este o referin (alt nume) pt. a

    O referin este utilizat ca argument pentru o funcie care poate s modifice valoarea acestui argument. De exemplu:

    void incr(int& x) {x++;}

    void f(){

    int i = 1;

    incr(i); // i = 2;

    }

    O alt utilizare important a referinelor este pentru definirea funciilor care pot fi folosite att ca membru drept ct i ca membru stng al unei expresii de asignare. De exemplu:

    #include

    int& fr(int v[], int i){

    return v[i];

    }

    void main(){

    int x[] = {1,2,3,4};

  • 13

    fr(x,2) = 7;

    cout

  • 14

    tipul tip_returnat, folosind instruciunea return. Dac n definiie nu este prevzut un tip_returnat, se consider implicit returnarea unei valori de tip ntreg. Prototipurile funciilor. Pentru apelul unei funcii este necesar cunoaterea definiiei sau a prototipului acesteia. Prototipul unei funcii este de forma:

    tip_returnat nume_func(tip1 arg1,., tipn argn);

    Numele argumentelor formale sunt opionale n prototipul unei funcii. Prototipurile permit compilatorului s verifice tipurile argumentelor de apel i s semnaleze eroare la conversii ilegale. Spre deosebire de limbajul C, unde este admis i simpla declaraie a numelui funciei (fr tipurile argumentelor de apel), utilizarea prototipurilor este obligatorie n C++. De exemplu:

    double f2(int, double); // prototip funcie f2

    double f3(int a, double f){ // definiie funcie f3

    /*..*/

    double t = f/a;

    return t;

    }

    void fp(){

    double r1 = f1(7, 8.9); // eroare,

    // identificator nedeclarat

    double r2 = f2(7, 8.9); // corect, fol. prototipul

    char str[] = "abcde";

    double r3 = f3(7, str); // eroare de tip argument

    }

    double f1(int a, double f) {

    /*..*/

    double t = a + f;

    return t;

    }

    double f2(int a, double f) { // definiie funcie f2()

    /*...*/

    double t = a*f;

    return t;

    }

    La compilare apare o eroare datorit apelului funciei f1(), care nu este definit, nici declarat prin prototip n domeniul funciei apelante fp() i o eroare datorat apelului funciei f3() cu un argument (argumentul al doilea) care nu poate fi convertit la tipul argumentului formal.

  • 15

    Transferul argumentelor funciilor. La apelul unei funcii, argumentele de apel (se mai numesc i argumente reale sau efective) iniializeaz argumentele formale din declaraia funciei, n ordinea din declaraie. Argumentele unei funcii se pot transfera n dou moduri: apelul prin valoare i apelul prin referin. n apelul prin valoare se copiaz valoarea argumentului real n argumentul formal corespunztor al funciei. n acest caz, modificrile efectuate asupra argumentului funciei nu modific argumentul real. n apelul prin referin este accesat direct variabila din argumentul real transmis funciei, care poate fi deci modificat. Ca exemplificare, se definete o funcie swap() care realizeaz intershimbul ntre valorile a dou variabile. Dac nu se folosesc referine, argumentele de apel ale funciei trebuie s fie pointeri la variabilele respective. Pointerii, ca argumente de apel, nu vor fi modificai, dar variabilele indicate de acetia pot fi modificate. Funcia swap() cu argumente pointeri arat astfel:

    void swap(int* x, int* y){

    int t;

    t = *x; // dereferentiere

    *x = *y;

    *y = t;

    }

    Aceeai funcie swap(), folosind argumente de tip referin, arat astfel: void swap(int& x, int& y){

    int t;

    t = x;

    x = y;

    y = t;

    }

    Se poate observa perfecta simetrie ntre cele dou implementri i c, n mod evident, referina folosete adresa variabilei pentru a o putea modifica (deci un pointer). Dar, n cazul referinelor, pointerul i defererenierea sunt ascunse, programatorul nu trebuie s le prevad explicit, programul rezultat este mai concis i mai clar. Referinele sunt deosebit de utile n apelul funciilor ale cror argumente sunt obiecte de dimensiuni mari i copierea lor n argumentele formale (plasate n segmentul de stiv al programului) ar fi foarte ineficient. Argumente implicite ale funciilor. Se ntmpl frecvent ca o funcie s aib un numr mai mare de argumente dect sunt necesare n cazurile simple dar frecvente de apel. Dac nu este necesar s fie transmis ntotdeauna valoarea real a unui argument i acesta poate

  • 16

    lua, de cele mai multe ori, o valoare implicit, atunci n declaraia funciei se prevede o expresie de iniializare a acestui argument, iar din apel poate s lipseasc valoarea argumentului corespunztor. De exemplu, o funcie pentru stabilirea datei calendaristice, care prevede valori implicite pentru argumentele luna i an:

    struct data{

    int zi;

    int luna;

    int an;

    } g_data;

    void setdata(int zi, int luna=9, int an =1999){

    g_data.zi = zi;

    g_data.luna = luna;

    g_data.an = an;

    }

    void main(){

    setdata(15); // 15 9 1999

    setdata(21,7); // 21 7 1999

    setdata(20,1,2000); // 21 1 2000

    }

    Numai argumentele de la sfritul listei pot fi argumente implicite. De exemplu, este eronat urmtoarea declaraie:

    void setdata(int zi, int luna=9, int an); // eroare

    Constante simbolice

    O constant simbolic (sau constant cu nume) este un nume a crui valoare nu poate fi modificat n cursul programului. n C++ exist trei modaliti de a defini constante simbolice:

    Orice valoare, de orice tip care poate primi un nume, poate fi folosit ca o constant simbolic prin adugarea cuvntului-cheie const n declaraia acesteia.

    Orice nume de funcie sau de tablou este o constant simbolic. O enumeraie definete o mulime de constante ntregi.

    De exemplu, urmtoarele declaraii introduc constante simbolice prin folosirea cuvntului-cheie const:

    const int val = 100;

  • 17

    const double d[] = {1.2, 2.8, 9.5};

    Deoarece constantele nu pot fi modificate, ele trebuie s fie iniializate n declaraie. ncercarea de modificare ulterioar este detectat ca eroare n timpul compilrii:

    val++; // eroare

    d = 200; // eroare

    Cuvntul-cheie const modific tipul obiectului, restricionnd modul n care acesta poate fi folosit.

    1.6 Operatori specifici C++

    Majoritatea operatorilor C++ sunt preluai din limbajul C, cu aceeai sintax i reguli de operare. n plus fa de operatorii C, n C++ mai sunt introdui urmtorii operatori:

    operatorul de rezoluie (::) operatorii de alocare-eliberare dinamic a memoriei new i delete.

    Operatorul de rezoluie

    Operatorul de rezoluie (::) este folosit pentru modificarea domeniului de vizibilitate al unui nume. Pentru acest operator (scope resolution operator), n traduceri se mai ntlnesc termenii de operator de domeniu sau operator de acces. Operatorul de rezoluie permite folosirea unui identificator ntr-un bloc n care el nu este vizibil. Dac operatorul de rezoluie nu este precedat de nici un nume de clas, atunci este accesat numele global care urmeaz acestui operator. De exemplu:

    int g = 10;

    int f(){

    int g = 20;

    //

    return ::g;

    }

    void main(){

    cout

  • 18

    Operatorii new i delete

    n limbajul C se pot aloca dinamic zone n memoria liber (heap) folosind funcii de bibliotec (de exemplu, malloc(), calloc(), realloc()) i se pot elibera folosind funcia free(). La aceste posibiliti, care se pstreaz n continuare n C++, se adaug operatorii de alocare i eliberare dinamic a memoriei, new i delete. Aceti operatori unari prezint avantaje substaniale fa de funciile de alocare din C i de aceea sunt n mod evident preferai n programele scrise n C++. Pentru alocarea unei singure date (obiect), operatorul new are urmtoarea form general:

    tip_data* p = new tip_data(initializare);

    unde tip_data este un tip de date predefinit sau definit de utilizator (clas), p este pointerul (adresa de nceput) a zonei alocate n memoria liber, returnat la execuia operatorului new, iar initializare este o expresie care depinde de tipul datei i permite iniializarea zonei de memorie alocate. Dac alocarea nu este posibil, pointerul returnat este NULL. Forma de utilizare a operatorului new pentru alocarea unui vector de date (tablou unidimensional) de dimensiune dim, este urmtoarea:

    tip_data* p = new tip_data[dim];

    La alocarea unui vector nu se poate transmite o expresie de iniializare a zonei de memorie alocat. Operatorul delete elibereaz o zon din memoria heap. El poate avea una din urmtoarele forme:

    delete p; delete []p;

    Prima form se utilizeaz pentru eliberarea unei zone de memorie ocupat de o singur dat (obiect), nu de un vector. Pointerul p trebuie s fie un pointer la o zon de memorie alocat anterior printr-un operator new. Operatorul delete trebuie s fie folosit doar cu un pointer valid, alocat numai cu new i care nu a fost modificat sau nu a mai fost eliberat zona de memorie mai nainte (cu un alt operator delete sau prin apelul unei funcii free()). Folosirea operatorului delete cu un pointer invalid este o operaie cu rezultat nedefinit, cel mai adesea producnd erori de execuie grave. Cea de-a doua form a operatorului delete[] se folosete pentru eliberarea unei zone de memorie ocupat de un vector de date. Pentru tipurile de date predefinite ale limbajului, se poate folosi i prima form pentru eliberarea unui vector, dar, n cazul obiectelor de tipuri definite de utilizator, acest lucru nu mai este valabil. Aceast situaie va fi detaliat n seciunea urmtoare.

  • 19

    Cteva exemple de utilizare a operatorilor new i delete:

    int *pi = new int(3); // alocare int i iniializare

    double *pd = new double; // alocare double neinitializat

    char *pc1 = new char[12]; // vector de 12 caractere

    char *pc2 = new char[20]; // vector de 20 caractere

    delete pi;

    deletepd

  • 20

    delete pc1; //corect, char e tip predefinit

    delete []pc2; // corect, elibereaza vector

    n legtur cu cele dou metode de alocare dinamic, prin operatorii new-delete i prin funciile de bibliotec malloc-free, fr s fie o regul precis, se recomand evitarea combinrii lor, deoarece nu exist garania compatibilitii ntre ele.

  • 21

    Teste de autoevaluare

    Rspunsuri la testele de autoevaluare

    1.1 Care din afirmatiile urmtoare sunt adevrate si care sunt false? Justificati rspunsul n cazul afirmatiilor care sunt false.

    (a) Toate variabilele trebuie declarate nainte de a fi utilizate. (b) Un program C++ care afiseaz trei linii pe ecran trebuie s contin 3 instructiuni de afisare cout. (c) Comentariile dintr-un program C++ determin afisarea textului aflat dup // pe ecran la executia programului. (d) n limbajul C++ toate variabilele locale trebuie declarate la nceputul funciei de care aparin.

    1.2 Definii tipul de date abstract STIVA Se vor specifica: structura de date, operatorii de baz.

    1.3 Care din urmtoarele concepte sunt concepte de baz ale programrii orientate pe obiecte?

    (a) obiect (b) mostenire (c) metod (d) ncapsulare (e) modul (f) procedur (g) polimorfism (h) stream (i) cout

  • 1.1 (a) adevrat (b) fals: o singur instructiune (c) fals: comentariile au doar rolul de a documenta un (d) fals: n limbajul C++ declaraa acestora si eliminandu-apartin. 1.2 Stuctura de date:

    stiva

    dim_max

    Operatii de baza: stiva_noua( )

    pune_element(stiva, r)

    scoate_element(stiva)

    stiva_vida(stiva)

    stiva_plina(stiva)

    varful_stivei(stiva)

    numar_elemente(stiva)

    1.3 (a), (b), (d), (g)

    Tem de autoinstruire

    1.1 Principalele diferente ntre programarea orientat pe obiecte si programarea procedural.

    1.2 Principalele mecanisme de abstractizare.

    1.3 Elementele principale ale unui TDA.

    1.4 Comunicarea intre obiecte. 1.5 Comunicarea intre obiecte.

    singur instructiune cout cu secvene \n multiple poate afisa mai au doar rolul de a documenta un program.

    (d) fals: n limbajul C++ declaraiile de variabile locale pot s apara la prima utilizare -se, obligativitatea declarrii lor la nceputul func

    pune_element(stiva, r)

    scoate_element(stiva)

    stiva_plina(stiva)

    varful_stivei(stiva)

    numar_elemente(stiva)

    Tem de autoinstruire

    Principalele diferente ntre programarea orientat pe obiecte si programarea procedural.

    Principalele mecanisme de abstractizare.

    Elementele principale ale unui TDA.

    Comunicarea intre obiecte.

    Comunicarea intre obiecte.

    22

    poate afisa mai multe linii.

    la prima utilizare funciei de care

    Principalele diferente ntre programarea orientat pe obiecte si programarea procedural.

  • 23

    Lucrri de verificare pentru studeni

    1.1 Dati exemple de clase si obiecte ale acestora. 1.2 Obiectele pot comunica ntre ele? Justificati rspunsul. 1.3 Definiti urmtoarele tipuri de date abstracte: (a) LISTA (b) COADA Se vor specifica: structura de date, operatorii de baz. 1.4 S se scrie declaraiile pentru urmtoarele tipuri de variabile: pointer la un caracter, un vector de 10 valori ntregi, pointer la un vector de 10 valori ntregi, un pointer la un pointer la un caracter. 1.5 S se scrie un program care tiprete dimensiunea tipurilor fundamentale de date. Se va folosi operatorul sizeof. 1.6 Presupunnd c variabilele a si b au valorile 3, respectiv 4, s se precizeze ce anume se va afisa pe ecran ca urmare a executiei urmtoarelor instructiuni:

    (a) cout b;

    (e) // cout

  • 24

    Formular de feedback

    n dorina de ridicare continu a standardelor desfurrii activitatilor dumneavoastra, va rugm s completai acest chestionar i s-l transmitei indrumatorului de an. Disciplina: ________________________ Unitatea de invatare/modulul:__________________ Anul/grupa:__________________________ Tutore:_________________________ a) Coninut / Metoda de predare Partea I 1. Care dintre subiectele tratate in aceasta unitate/modul considerai c este cel mai util i eficient? Argumentati raspunsul. 2. Ce aplicatii/proiecte din activitatea dumneavoastra dorii s imbunatatiti/modificai/implementai n viitor n urma cunotinelor acumulate n cadrul acestei unitati de invatare/modul? 3. Ce subiecte considerai c au lipsit din acesta unitate de invatare/modul? 4. La care aplicatii practice ati intampinat dificultati in realizare? Care credeti ca este motivul dificultatilor intalnite?

  • 25

    6. Timpul alocat acestui modul a fost suficient? 7. Daca ar fi sa va evaluati, care este nota pe care v-o alocati, pe o scala de la 1-10?. Argumentati. Partea II. Impresii generale 1. Acest modul a ntrunit ateptrile dumneavoastr? 2) Avei sugestii care s conduc la creterea calitii acestei unitati de invatare/modul? 3) Avei propuneri pentru alte unitati de invatare? V mulumim pentru feedback-ul dumneavoastr!

    n totalitate

    n mare msur n mic msur Nu


Recommended