Sunteți pe pagina 1din 5

Rand 1 1.

Semnificatia si rolul cuv cheie THIS La apelul unei metode,compilatorul genereaza un param ascuns This,care este un pointer spre obiectul pt care s-a apelat metoda.Pointerul this este accesibil programatorului in corpul metodei,asa se permite accesarea datelor obiectului respectiv prin intermediul lui this. Obiect.metoda ( parametri ) Implementat de catre compilator astfel: Metoda (& obiect,parametri ) Locul parametrului ascuns(dar existent) this, este luat de la adresa obiectului apelant.El nu se declara explicit ,dar este folosit in corpul metodei. Met Muta nu are nevoie de param SPOS*p(locul sau va fii luat de this) si metoda va fii Void Spos::Muta(int dx,int dy) { this - > x += dx; this - > y += dy; } Compilatorul genereaza explicit apel prin this pt accesul variabilelor membru asa programatorul poate renunta la folosirea lui this: Void Spos::muta(int dx,int dy) {x += dx; y += dy; //se modifica y-ul cosresp apelului } Utilizarea explicita a pointerului this,este esentiala in situatiile in care ne intereseaza adresa structurii in cauza(ccare treb de exemplu introdusa intr-o lista inlantuita) 2 Drepturi de acces intr-o clasa derivata -membrii privati in clasa de baza nu se moistenesc -membrii publici in clasa de baza nu beneficiaza de incapsulare -exista 3 tipuri de derivare: publica->membrii privati raman inaccesibili,ceilalti isi pastreaza tipul,derivaare protejata->membr privati raman inaccesibili,cilalti devin protected,si utimul tip derivare privata->membrii privati raman inaccesibii,ceilalti devin privati -dintre avantajele derivarii amintim:economia si reutilizarea de cod,extemsibilitatea,polimosfismul,compromisul inchis-deschis 3 Tabele VMT.Continut,rol utilizare de catre compilator Pt fiecare clasa compilatorul construieste o tabela cu metodele virtuale ale clasei respective tabela numita VMT(Virtual Method Table) incluzand in fiecare obiect a clasei un pointer VMT spre tabela VMT corespunzatoare clasei.

SHEMA------Avand in vedere shema,putem intelege modul cum se implementeaza,de catre compilator met_5(): VMT[0]() VMT[1]() // apel met prin VMT CA::met_3() // apel metoda VMT[2]() //apel metoda prin VMT (leg dinamica) Pentru a.met_5() acesta este echivalent cu: CA::met_1(); CA::met_2(); CA::met_3(); CA::met_4(); Iar pt b.met_5() este echivalent cu: CB::met_1();//inlocuita CA::met_2();//neinlocuita CA::met_3();//apel met legata static CB::met_4();/apel met legata prin VMT inlocuita Avem pt apelul VMT[i]se acceseaza,prin intermediul lui this,zona de date a obiectului si se obtine VMT_ptr.Prin intermediul lui VMT_ptr se acceseaza tabela VMT din care,prin indexare,se determina adresa metodei VMT[i]. 4)Rolul op = si constructorului de copiere la transmiterea parametrilor inspre functii si a rezultatelor intoarse de functii(prin valoare,referinta,pointer) Apel prin valoare Sintaxa declarare param formal Sintaxa apel Functie(tip Nume,) Functie (variabila,) Apel prin adresa (pointer) Functie (Tip*Nu me,) Functie(& variabila, ) * nume Apel prin referinta Functie(Ti p&nume) Functie(v ariabila, ) Nume

5. functionarea op << si >> la streamuri

Stream-urile au in principal rolul de a abstractiza operatiile de Utilizare variabila in nume intrare- iesire. cadrul functiei Ele ofera metode Ce se transmite efectiv Val variabilei Adresa Adresa de scriere si pe stiva parametru variabilei variabilei citire a datelor parametru param independente de Modificarea pametrului NU DA DA dispozitivul I/O si chiar independente de platforma. Stream-urile incapsuleaza (ascund) problemele specifice dispozitivului cu care se lucreaza, sub libraria standard iostream. Operaiile de scriere se pot efectua cu operatorul de inserare << . Operandul stng

trebuie s fie un obiect al clasei ostream (sau al unei clase derivate). Pentru scrierea pe dispozitivul standard se va folosi obiectul cout. Operandul drept este o expresie pentru al crei tip a fost suprancrcat operatorul <<. Operaiile de citire se pot efectua cu operatorul de extragere >> . Operandul stng trebuie s fie un obiect al clasei istream (sau al unei clase derivate). Pentru citirea de la dispozitivul standard se va folosi obiectul cin. Operandul drept este o expresie pentru al crei tip (standard sau abstract) a fost suprancrcat operatorul >> 6 TRATAREA POLIMORFICA A EXCEPTIILOR -daca avem nevoie de mai multe clase si acestea au multe in comun,putem pune ceea ce este comun intr-o clasa de baza si folosi mostenirea.asa se face usor decl.claselor de exceptie si impune atentie supl.in ordinea secv catch. exemplu:class CB{}; class CD1:public CB{}; class CD2:public CB{};pt discriminare buna a exceptiilor tre puse prima data blocurile catch ale cls derivate si abia apoi blocul catch al cls de baza: try{/*..*/} catch(CD1){} catch(CD2){} catch(CB){} daca ordinea este cea a declarari claselor,funct este urmat: try{/*..*/} catch(CB){}catch(CD1){} catch(CD2){} -discriminarea aceasta a diferitelor clase intr-o unica secv catch poate fi f folositoare daca aranjam ca tratarea sa se fie realizata printr-o met virtuala a obiectului exceptie => o singura secventa catch, tratarea fiind corespunzatoare tipului exceptiei. Pe masura ce nr secv catch creste, se compromite eleganta modulelor client. Rand 2 1.Supraincarcarea numelui functiilor in c++ este premis sa avem mai multe functii cu acelasi nume dare diferind prin nr de parametrii; compilatorul decide in momentul apelului despre care functie este vorba tinand cont de nr si tipul parametrilor implicate la apel. 3. Legarea statica si legarea dinamica a metodelor: Legarea -> este o metoda prin care compilatorul genereaza cod pentru apelul unei anumite metode. Legarea statica ompilatorul i editorul de legturi vor fixa adresa metodei care se execut, fr ca aceasta s mai poat fi modificat pe parcursul execuiei. Legare dinamica compilatorul va construi un tablou de adrese ale metodelor posibile de apel, iar determinarea adresei metodei dorite se va efectua doar la execuie. n funcie valoarea pointerului spre clasa de baz, care poate conine i adresa unui obiect al clasei derivate, se va alege metoda corespunztoare. 4.riscuri la redefinirea op = trebuie sa primeasca parametru o referinta la un obiect de acelasi tip pe care il copiaza in obiectul curent. Este utilizat in atribuirii de obiecte de acelasi tip, este generat de compilator daca utilizatorul nu defineste unul. In lipsa definirii

unui operator de atribuire pentru un tip utilizator va fi generat unul implicit de catre compilator (deci acest operator este deja supraincarcat) ca semnatura: CClasa& CClasa::operator=(const CClasa&) Acest operator realizeaza o copiere membru cu membru (ca si constructorul de copiere) a obiectelor de tipul CClasa. Acest lucru nu deranjeaza deloc atat timp cat clasa respectiva nu foloseste nici un fel de resurse dar este intolerabil pentru clasele care folosesc resurse (zone de memorie alocate dinamic). 5. manipulatori cu parametri class smnip_int{ios&(*_fn)(ios &,int);int _ag;public:smanip_int(ios&(*_f) (ios&,int),int a):fn(_f),_ag(_a){}friend istream& operator>>(istream & _s,const smanip _int&_f) {(*_f._fn)(_s,_f._ag);return _s;}friend ostream& operator>>(ostream & s,const smanip _int&_f){(*_f._fn)(_s,_f._ag);return _s;}};smanip_int setbase(int _b);smanip_long resetiosflags(long _b);smanip _long setiosflags(long _b);smanip_int setfill(int f);smanip _int setprecision(int _n);smanip_int set(int _n); 6. SOLUTIA TRADITIONALA DE TRATARE A ERORILOR SI EXCEPTIILOR -terminarea aplicatiei:se face atunci cand o exceptie nu este prinsade nimeni -intoarcerea unei valori reprezentand eroare:cand toate val intoarse sunt semnificative,se impune alegerea pt variabila intoarsa a unui tip mai mare pt a putea discerne codul erorii -pozitionarea unui indicator global:necesitatea testarii acestui indicator global devine repede suparatoare ai eleganta codului are dinou de suferit -ignorarea exceptiei:ignorand exceptia nu mai avem nici o garantie asupra bunei func a progr -invocarea unui headler specializat:principala problema e ca mecanismul nu e general,fiind valabil doar pt un nr f mic de exceptii

Randul 4 1. .__property poate fi aplicat unei variabile membru; deoarece notinea de proprietate se refera de obicei la toate variabilele membru ale unui obiect vom folosi pt cele bazate pe __property denumire de varviabile de tip __property; Variabilele de tip __property ascund detaliile de implementare ; se comporta ca si variabile obisnuite; nu se pot transmite functiilor ca si parametru prin referinta.
2 Necesitatea si rolul aparitiei cuvantului cheie protected In privat /public avem nevoie de un tip de acces care sa se comporte ca si privat pt incapsulare dar si public pt mostenire.in acesc scop s-a introdus tipul de acces protected si tipul de mostenire protected. 3 tipuri de derivare:

derivare publica derivare protejata derivrare privata Se recomanda folosirea atributului protected in clasa de baza si derivare publica sau privata dp cum dorim sa permitem sau nu derivari ulterioare ale clasei obtinute prin derivare. Prin mostenire nu se modifica tipul de acces la membrii pt clasa de baza ci doar accesul la acestia ca si membri ai clasei derivate.

3. Metode pure -> o metoda vistuala este pura daca la declararea corpului ei se face cu 0 ( virtual void Muta()=0 ); O clasa abstracta este o clasa care contine cel putin o metoda pura, rolul acestor clase abstracte este de a fi mostenita dintr-o clasa derivata care inlocuieste toate metodele pure.
4 Redefinirea operatoriilor prin functii friend.Particularitati

. Functii friend -> sunt functii care sunt membre in mai multe clase, pt a declara o functie de tipul friend trebuie adaugat prefixul friend functiei, aceasta are acces la membrii nepublici ai unei clase cu care sunt prietene. Se declara in interiorul clasei, nu sunt metode!!! Metode friend -> metodele pot fi si ele declarate friend. Friend vine de la
impoibilitatea unei metode de a fi membra in mai multe clase, chiar de sunt decl. in cadrul clasei, ele nu sunt metode,deci nu li se transmite pointerul ascuns this ,ele au acces la membrii ne-publici ai clasei cu care sunt prietene,fuct friend incalca deliberat principiul incapsularii. Relatia friend

intre clase nu este tranzitiva nici comutativa.