Sunteți pe pagina 1din 43

1. Clase.

O definitie bruta a clasei ar fi aceea ca este un concept extins al unui tip de date abstract : in loc sa contina numai informatii variabile , contine si functii. Un obiect este o instantiere a unei clase. Mai precis, clasa ar fi tipul de date si obiectul ar fi variabila. La programarea obiectuala stau la baza: incapsularea (private, protected, public, published), polimorfismul si mostenirea 2. Structuri i clase. O structur de date este un grup de elemente de date grupate mpreun sub un singur nume. Aceste elemente de date, cunoscut sub numele de membri, poate avea diferite tipuri i lungimi diferite. Primul lucru pe care trebuie s tim este c o structur de date creeaz un tip nou: Odat ce o structur de dateeste declarat, un nou tip cu identificatorul specificat ca nume_structra este creat si poate fi folosit n restul programului ca orice alt tip de date. Implicit datele in structura sunt public pe cind in clasa private, de asemenea poate avea functii membre. 3. Uniuni i clase. Uniunea aloca o poriune corespunztoare din memorie pentru a fi accesata ca diferite tipuri de date. Declaraia sa i folosirea este similar cu ceaa structurilor, dar funcionalitatea acesteia este cu totul diferit, toate elementele declaraiei de uniune ocup acelai spaiu fizic n memorie, dimensiunea acesteia fiind tipul cu cea mai mare lungime din declaraiei. Deoarece toate dintre ele se refer la aceeai locaie n memorie, modificarea unuia dintre elemente vor afecta valoarea tuturo, nu putem stoca valori diferite n ele independente una de cealalt. Una dintre folosirea uniunei este de a uni un tip elementar cu un array de elemente sau structuri mai mici. 4. Uniuni anonime. Dac declaram o uniune fara nume, atunci va fi uniune anonima si vom putea avea acces direct la membrii sai prin numele de mebru.
structure with regular union structure with anonymous union

struct { char title[50]; char author[50]; union { float dollars; int yen; } price; } book; 1 book.price.dollars 2 book.price.yen

struct { char title[50]; char author[50]; union { float dollars; int yen; }; } book; 1 book.dollars 2 book.yen

5. Funcii prietenc.

Membrii private i protected din o clas nu pot fi accesate din afara clasei n care sunt declarate, cu toate acestea, aceast regul nu afecteaz prietenii Prietenii sunt funciile sau clasele declarate cu cuvntul cheie friend. Dac vrem s declare o funcie externa ca prieten a clasei, aceast funcie va avea acces la membrii private i protected din ea, astfel mai intii se declara prototipul functiei cu cuvintul cheie friend in corpul clase iar functia va fi externa clasei.

6. Clase prietene. Aa cum putem defini o functie prieten, putem defini si o clas ca prieten a altei clase, astfel prima clasa va avea acces la membrii private si protected din clasa a doua. In exemplul de mai jos vedem ca clasa CRectangle are accest la membrul private side din clasa Csquare. Exemplu: class CRectangle { int width, height; public: int area () {return (width * height);} void convert (CSquare a); }; class CSquare { private: int side; 7. Funcii inline. Funciile inline este tehnica de optimizare utilizate de compilatoarelor. Se poate adauge pur i simplu cuvntul cheie inline la prototipul functiei, astfel la fiecare apel chemarea functiei va fi inlocuita cu corpul ei. Folosire. 1) Folosii ntotdeauna funcia inline atunci cnd sunteti sigur c va da performan. } }; void CRectangle::convert (CSquare a) { width = a.side; height = a.side; public: void set_side (int a) {side=a;} friend class CRectangle;

2) Nu folositi inline la functii mari, ci doar la cele mici (3-8 rinduri) pentru a avea o perfromanta mai buna 8. Definirea funciilor inline ntr-o clas. O functie membru, care este definit ca membru al clasei se numete o funcie de membru inline. Funciile membre care conin cteva linii de cod sunt de obicei declarate inline.

class Y { public: char* f() { return 1; } }; Este functie inline

class Y { public: char* f(); }; inline char* Y::f() { return 1; } daca declaram functia in afara clasei atunci inline se pune la declaratie ei si nu la prototipul din clasa.

9. Funcii constructor cu parametri.


Constructorii sunt metode speciale care folosesc la crearea si initializarea instantelor unei clase. Constructorii au acelasi nume ca si clasa careia i apartin si sunt apelati de fiecare data cnd se creaza noi instante ale clasei. Ca orice alt funcie, un

constructor poate fi, , suprancrcat (funcii care au acelai nume dar un numr diferit de parametri). Compilatorul va apela cel a crui parametri se potrivesc cu argumentele utilizate n apelul funciei.

class CRectangle { int width, height; public: CRectangle (); CRectangle (int,int); int area (void) {return (width*height);} }; CRectangle::CRectangle () { width = 5; height = 5; }

CRectangle::CRectangle (int a, int b) { width = a; height = b; } int main () { CRectangle rect (3,4); CRectangle rectb; cout << "rect area: " << rect.area() << endl; cout << "rectb area: " << rectb.area() << endl; return 0; }

10.

Funciile constructor cu un parametru: un caz special.

Exista si modalitatea de a initializa membrii printr-o lista de instantiere (initializare), care apare n implementarea constructorului, ntre antetul si corpul acestuia. Lista contine operatorul :, urmat de numele fiecarui membru si valoarea de initializare, n ordinea n care membrii apar n definitia clasei.

class complex ; complex::complex(double x, double y):real(x),imag(y)

11.

Membrii de tip static ai claselor.

In C++, se pot defini date membre cu o comportare speciala, numite date statice. Acestea sunt alocate o singura data, existand sub forma unei singuri copii, comuna tuturor obiectelor de tipul clasa respectiv, iar crearea, initializarea si accesul la aceste date sunt independente de obiectele clasei. Sintaxa este: static DeclarareMembru 12. Membri statici de tip date.

In C++, se pot defini date membre cu o comportare speciala, numite date statice. Acestea sunt alocate o singura data, existand sub forma unei singuri copii, comuna tuturor obiectelor de tipul clasa respectiv, iar crearea,

initializarea si accesul la aceste date sunt independente de obiectele clasei. Sintaxa este: static DeclarareMembru

13.

Funcii membre statice.

Diferenele ntre o funcie de membru static i non-statice sunt dup cum urmeaz. a. functie membru static poate accesa doar datele statice membre, funciile membru statice, date i funcii din afara clasei. O funcie membru non-statica poate accesa toate cele de mai sus, inclusiv membrii statici de date. b. functie membru statice pot fi numite, chiar i atunci cnd o clas nu este instaniata, o funcie non-statice nu poate c. functie membru static nu pot fi declarate virtual, non-static poate d. functie membru statica nu poate avea acces la "this" pointer al clasei. Funciile membre statice nu sunt utilizate foarte frecvent n programare. Dar cu toate acestea, ele devin utile ori de cte ori avem nevoie de funcii care sunt accesibile chiar i atunci cnd clasa nu este instantiata. 14. Cnd sunt executai constructorii i destructorii.

Constructorul este apelat n momentul declararii obiectelor. Destructorul este apelat automat, la iesirea din blocul n care este recunoscut acel obiect. 15. Operatorul de specificare a domeniului.

:: (operatorul de specificare a domeniului) este folosit pentru a modifica variabilele ascunse.

int count = 0; int main(void) {

int count = 0; ::count = 1; // set global count to 1 count = 2; return 0; } Declaraia count n main () ascunde variabila golbala int count. Cu :: count = 1 se acceseaza variabila declarata in domeniul global. // set local count to 2

class X { public: static int count; }; int X::count = 10; // define static data member

int main () { int X = 0; // hides class type X

cout << X::count << endl; // use static member of class X }

n urmtorul exemplu, declararea variabilei int X ascunde clasa X, dar putem apela membrii statici ai clsei prin operatorul ::

16.

Clase imbricate. Clase locale.

O clas imbricat este declarat n domeniul de vizibilitate al altei clase.Numele unei clase imbricate este vizibil locala in clasa de baza. Cu exceptia cazului utilizarii explicita a pointerelor, obiecte unei clase imbricate

poate utiliza doar constructorii, membrii statici, enumerarile din clasa de baza ori cele declarate global.

class outside { public: class nested { public: static int x; static int y; int f(); int g(); }; }; int outside::nested::x = 5; int outside::nested::f() { return 0; }; typedef outside::nested outnest; int outnest::y = 10; int outnest::g() { return 0; }; // define a typedef

// use typedef with ::

O clas locala este declarat n definiia unei funcii. Declaraiile ntr-o clas local poate folosi doar nume de tip, enumerri, variabile statice, variabile si functii extere din domeniul vizibil.

void f() { class local { int f(); // error, local class has noninline // member function

int g() {return 0;} // valid, inline member function static int a; // error, static is not allowed for // local class int b; }; } // valid, nonstatic variable

17.

Transmiterea obiectelor ctre funcii.

n C++ exista doua posibilitati de transmitere a parametrilor actuali catre o functie: 1. 2. mecanismul de transmitere prin valoare mecanismul de transmitere prin referinta

Primul este cunoscut, constituie modul standard de transmitere a parametrilor n C. Prin folosirea parametrilor formali referinta , se permite realizarea transferului prin referinta(transmiterea adresei), se elimina astfel necesitatea la utilizarea parametrilor formali pointeri, n cazul n care modificarile facute n interiorul functiei asupra parametrilor trebuie sa ramna si dupa revenirea din procedura. Exemplu: void schimba(int &a, int &b) { int aux=a; a=b; b=aux; } Transferul prin referinta este util si atunci cnd parametrul are dimensiune mare (struct, class) si crearea n stiva a unei copii a valorii lui reduce viteza de executie si ncarca stiva.

18.

Retumarea obiectelor.

Cand un obiect este returnat de o functie, este creat un obiect temporar, care contine valoarea returnata.Acesta este de fapt obiectul returnat de functie. Daca obiectul care a fost returnat are un destructor care elibereaza memoria dinamica alocata, acea memorie va fi elibarata chiar daca obiectul care primeste valoarea returnata inca omai foloseste. Exista cai de prevenire a acestei situatii care folosesc supraincarcarea operatorului de atribuire si definirea unui constructor de copii 19. Atribuirea obiectelor.

Este indicat ca implementarea operatorului de atribuire sa nu permita atribuirea catre acelasi obiect - de obicei acesta este modificat: const X& X::operator= (const X& ob) { if ( &ob != this ) { // se asigneaza datele membru } return *this; } Sau constructor de copiere explicit de exemplu: Person(int age) { this->age = age; } Este indicat ca orice clasa sa defineasca propriul operator de atribuire, deci lucrurile sa nu fie lasate a fi tratate implicit de compilator - cu atat mai mult daca are campuri de tip pointer. Daca este vorba despre o clasa derivata, atribuirea trebuie sa realizeze operatia si pentru membrii clasei de baza 20. Matrice, pointeri i referine.

Pentru matrice trebuie obligatoriu constructori implicit (deoarece nu poate fi initializata). Matricea bidiminsionala este pointer catre pointer.

21.

Matrice de obiecte.

Pentru a declara matrici de obiecte care sa poata fi initializate trebuie definit un constructor cu parametri care sa faca posibila initializarea. Pentru a declara matrici de obiecte care sa nu fie initializate trebuie definit un constructor fara parametri. Pentru a declara matrici de obiecte care sa fie cand initializate cand neinitializate se supraincarca functia constructor. #include<iostream> using namespace std; class C //apelare ptr. matrice neinitializate C(int j) //apelare ptr. matrici initializate int da() }; void main() C ob2[34]; } 22. Matrice iniializate / matrice neinitializate. //neinitializat

Pentru a declara matrici de obiecte care sa poata fi initializate trebuie definit un constructor cu parametri care sa faca posibila initializarea.Pentru a declara matrici de obiecte care sa nu fie initializate trebuie definit un constructor fara parametri.Pentru a declara matrici de obiecte care sa fie cand initializate cand neinitializate se supraincarca functia constructorMatricea poate fi iniializata la definire prin precizarea constantelor de iniializare. int b[2][3] = {1,2,3,4,5,6}; // echivalent cu

int b[2][3] = {{ 1,2,3},{ 4,5,6}}; // echivalent cu int b[][ 3] = {{ 1,2,3},{ 4,5,6}} double a[3][2]={{2},{5.9,1},{-9}}; //elementele pe linii sunt: 2 0 / 5.9 1 / -9 0 double a[3][2]={2,5.9,1,-9}; //elementele pe linii sunt: 2 5.9 / 1 -9 / 0 0

23.

Pointeri ctre obiecte.

Pointers to members allow you to refer to nonstatic members of class objects. You cannot use a pointer to member to point to a static class member because the address of a static member is not associated with any particular

object. To point to a static class member, you must use a normal pointer. You can use pointers to member functions in the same manner as pointers to functions. You can compare pointers to member functions, assign values to them, and use them to call member functions. Note that a member function does not have the same type as a nonmember function that has the same number and type of arguments and the same return type.

24.

Pointerul this.

Cand este apelata o functie membru, i se paseaza un argument implicit, care este un pointer catre obiectul care a generat apelarea (obiectul care a invocat functia). Acest pointer este numit this. La membrii unei class se poate capata acces direct dintr-o functie membru. Instructiunea b = j; ar comanda ca valoarea continuta in baza sa fie atribuita unei copii a lui b asociata obiectului care a generat apelarea. Totusi, aceeasi intructiune poate fi scrisa si astfel: this->b = j;

25.

Pointeri ctre tipuri derivate.

n general un pointer de un anume tip nu poate indica un obiect de alt tip. Totui, este posibil ca un pointer de tipul unei clase de baz s pointeze (refere) ctre un obiect de tipul unei clase derivate. S presupunem c avem o clas Bi o alt clas D, care deriv din B. Atunci este posibil ca un pointer de tip *B s indice un obiect de tip D. Reciproca nu este adevrat! Un pointer de tip *D nu poate referi un obiect de tip B. Dei putei referi un obiect de tip derivat cu un pointer de tipul bazei, vei putea accesa numai membrii motenii din tipul de baz. Nu vei putea accesa membrii particulari clasei derivate. Putei totui s folosii un cast i s convertii un pointer de tip baz ctre unul derivat, pentru a avea acces total la clasa derivat. Exemplu: class Baza { public: Baza(int e) { k = e; } void show() { cout << "Sunt in baza: " << k << '\n'; } private: class Derivat : public Baza { public: int k; };

Derivat(int e) : Baza(e) { x = e / 2; } void show() { cout << "Sunt in derivat: " << x << '\n'; } int getX() { return x; } private: int x; };

int main() { Baza *b; Derivat d(6); b = &d; // pointerul de baza refera un obiect de tip derivat

// accesez obiectul derivat cu un pointer baza b->show();

// Eroare! Nu pot accesa membri specifici clasei derivate // cu un pointer de tipul clasei de baza // cout << b->getX();

return 0; }

26. Referine. Referintele, ca si pointerii, sunt variabile care contin adresa unei zone de memorie. Semantic, ele reprezinta aliasuri ale unor variabile existente. Referintele sunt legate de variabile la declaratie si nu pot fi modificate pentru a referi alte zone de memorie. Sintaxa folosita pentru declararea unei referinte este: Tip & referinta = valoare; 27. Parametri de referin. Transferul parametrilor unei funcii prin referin este fcut decompilator, ceea ce simplific scrierea funciei i apelul ei.Transferul parametrilor de tip structur prin referin formale ca i cel prin pointeri este mai eficient dect transferul prin valoare, deoareceelimin copierea structurii pe stiv, conducnd astfel la creterea vitezeide execuie. Rezultatul unei funcii poate fi transferat prin valoare, pointer sau referin 28. Transmiterea referinelor ctre obiecte. Cnd se face apel prin referinta, nu se face nici o copie a obiectului, asa cum se ntmpla cu apelul prin valoare. Aceasta nseamna ca nici un obiect folosit ca parametru nu este distrus atunci cnd se termina functia, iar destructorul parametrului nu este apelat. NOT: cnd parametrii sunt transmisi prin referinta, schimbarile obiectului din interiorul functiei afecteaza obiectul apelant. 29. Returnarea referinelor. O functie poate sa returneze o referinta ceea ce face ca ea sa poata fi folosita n membrul stng al unei instructiuni de atribuire. 30. Referme independente. O referinta care este doar o simpla variabila este numita referinta independenta. estricii pentru referine. referinta independenta este de mica valoare practica deoarece ea este de fapt doar un alt nume aceeasi variabila. Avnd doua nume care descriu acelasi obiect programul poate deveni confuz 31. Operatorii de alocare dinamic din C++. C++ definete doi operatori de alocare dinamic: new i delete. Aceti operatori aloc i elibereaz memoria dinamic, n timpul execuiei programului. Operatorul new aloc memorie i returneaz un pointer ctre adresa de nceput a zonei alocate. Operatorul delete elibereaz zona de memorie alocat cu new. 32. Alocarea de memorie obiectelor.

Alocarea static a memoriei: adresele i dimensiunile obiectelor ce fac uz de alocarea static a memoriei sunt fixate n momentul compilrii i pot fi plasate ntr-o zon de dimensiune fix ce corespunde unei seciuni din cadrul fiierului linkedidat final. Acest tip de alocare a memoriei se numete static deoarece locaia i dimensiunea lor nu variaz pe durata de execuie a programului. Alocarea automat a memoriei: obiectele temporare (variabilele locale declarate n cadrul unui bloc de cod) sunt stocate n cadrul de stiv asociat funciei apelate, iar spaiul alocat este automat eiberat i reutilizat dup ce sa prsit blocul n care acestea au fost declarate. Alocarea dinamic a memoriei: blocuri de memorie de orice dimensiune pot fi alocate ntr-o zon de memorie numit heap prin intermediul funciilor malloc(), calloc() i realloc(). Alocarea de memorie se face in C++ folosind operatorul new si operatorul pereche delete 33. Supraincrcarea funciilor i a operatorilor. Suprancrcarea (overloading) funciilor i operatorilor reflect posibilitatea de a atribui unui simbol mai multe semnificaii. Suprancrcarea unei funcii nseamn utilizarea aceluiai identificator de funcie pentru cel puin dou funcii cu condiia ca s difere ntre ele prin tipuri i/sau numr de parametri (cu prototipuri diferite). n acest fel compilatorul poate selecta, la un moment dat, funcia care trebuie apelat. 34. Suprancrcri de funcii i ambiguiti. Conversia automat a tipului, n C++, poate conduce la apariia unor ambiguiti n suprancrcarea funciilor. Situatia in care la un apel compilatorul nu poate alege intre doua sau mai multe functii supraincarcate se numeste ambiguitate. Instructiunile ambigue sunt tratate ca erori, iar programul nu va fi compilat 35. Suprancrcarea funciilor constructor. public: wtf() { a = 0; b = 0; c = 0; } // Constructor Implicit wtf(int A) { a = A; b = 0; c = 0; } wtf(int A, int B) { a = A; b = B; c = 0; } wtf(int A, int B, int C) { a = A; b = B; c = C; } Suprancrcnd constructorii, clasa voastr devine mult mai flexibil (obiectele ei pot fi iniializate n mai multe feluri). Utilizatorul clasei voastre va fi liber s aleag din mai multe moduri de iniializare, n funcie de necesiti i circumstane. 36. Crearea unei funcii operator membru.

37. Crearea operatorilor de incrementare idcdccrementare cu prefix i cu sufix. Operatorii de incrementare i decrementare pot fi folosii att ca prefix ct i sufix. Cnd sunt folosii ca prefix, operaie de incrementare sau decrementare se realizeaz nainte de evaluarea expresiei, iar atunci cnd sunt folosii ca sufix, operaia de incrementare sau decrementare se realizeaz dup evaluarea expresiei. 38. Suprancrcarea operatorilor prescurtai. Supradefinirea operatorilor prescurtati Operatori prescurtai sunt +=, -= si restul de operatori care urmeaza acest ablon (pattern). Cnd se suprancarc unul din aceti operatori se combina o operatie cu o atribuire. 39. Restricii la supranercarea operatorilor. Trebuie s precizm faptul c precedena, aritatea (numrul de operanizi) i asociativitatea operatorilor nu poate fi schimbat prin suprancrcare. Nu este posibil s crem noi operatori, doar cei existeni putnd fi suprancrcai. Operaiile realizate de operatorii tipurilor de date predefinite nu pot fi modificate. Programatorul nu poate, de exemplu, s schimbe modalitatea n care se adun doi ntregi. Suprancrcarea operatorilor este valabil doar pentru tipuri de date definite de programator sau pentru operaii care combin tipuri de date definite de programator cu tipuri de date predefinite. 40. Suprancrcarea operatorilor folosind o funcie friend. Putei suprancrca un operator pentru o clas folosind o funcie nonmembr, care de obicei este prieten cu clasa. Deoarece o funcie friend nu este membr a clasei, aceasta nu are pointerul this. Aadar, o funcie operator prieten primete explicit operanzii. Asta nseamn c o funcie prieten ce suprancarc un operator binar va avea doi (2) parametri, i o funcie prieten ce suprancarc un operator unar, va avea un (1) parametru. n cazul suprancrcrii unui operator binar cu o funcie prieten, operandul din stnga este tranmis primului parametru, iar cel din dreapta este transmis celui de-al doilea parametru. 41. Folosirea unui friend pentru a supraincrca ++ i Funciile friend operator adaug flexibilitate. Operatorii ++ si -- sunt operatori unari, iar supraincarcarea acestora se poate face utilizand atat functii membru non-statice, cat si functii friend. Pentru a

putea distinge intre forma prefix si cea postfix a acestor operatori se aplica urmatoarea regula: O functie-membru operator++ care nu primeste nici un parametru (cu exceptia parametrului implicit this) defineste operatorul ++ postfix, in timp ce functia operator++ cu un parametru de tip int defineste operatorul ++ postfix. La apel, in cazul formei postfix, utilizatorul nu este obligat sa specifice nici un argument, valoarea transmisa implicit fiind 0. Aceeasi regula se aplica si pentru operatorul de decrementare. Astfel: class X { public: X operator++() { ... } X operator++(int) { ... } }; void f(X a) { ++a; // la compilare se traduce ca a.operator++(); a++; // la compilare se traduce ca a.operator++(0); }

42. Supraincrcarea operatorilor new i delete.

-chiar si supraincarcat operatorul new va conlucra cu constructorul clasei in alocarea si eventual initializarea unui obiect dinamic .La supradefinire functia operator va primi dimensiunea zonei de alocat si va returna adresa memoriei alocate . -obligatoriu functia new supraincarcata trebuie sa returneze un pointer spre memoria alocata sau zero( NULL) daca apare o eroare de alocare -Cand new si delete sunt functii membre ale unei clase operatorii astfel supraincarcati vor fi folositi numai pentru obictele clasei , iar cand se utilizeaza operatorii new si delete pentru alte tipuri de date se va apela new si delete impliciti din C++;

43. Suprancrcarea operatorilor new i delete pentru matrice. Supraincarcarea operatorilor new si delete pentru matrice au una din formele : ex.

//se aloca memorie unei matrice de obiecte //este apelat automat functia constructor a fiecarui obiect al matricei void *operator new [ ](size_t dim) void *operator new [ ](unsigned dim) {{ //efectueaza alocarea //efectueaza alocarea return pointer_la _memorie ; return pointer_la _memorie ; }} //delete pentru o matrice de obiecte // operatorul delete apeleaza repetat destructorul clasei pentru fiecare membru al masivului ; -nu este permisa mixarea celor doua mecanisme de alocare si eliberare de memorie (cu functii malloc( ) si free( ),respectiv cu operatorii new si delete ) adica alocare cu malloc( ) si dezolocare cu delete( ) sau alocare cu new si dezalocare cu free( ) .

44. Suprancrcarea unor operatori speciali. 45. Supraincrcarea pentru [ ]. Operatorul predefinit se utilizeaza pentru a face acces la elementele unui tablou, in constructii de forma tablou[expr]. Aceasta constructie poate fi privita ca o expresie formata din operanzii tablou si expr, carora li se aplica operatorul [ ]. Putem supraincarca acest operator pentru a da sens constructiilor de indexare si pentru cazul in care operanzii sunt obiecte. 46. Suprancrcarea pentru (). Stim ca o functie se apeleaza printr-o constructie de forma: nume_functie(lista_parametrilor_de_apel). Pana acum am privit aceasta constructie ca pe un tot unitar reprezentand un operator pentru o anumita operatie. In realitate, aceasta constructie este formata din doi operanzi nume_functie si lista_parametrilor_de_apel la care se aplica operatorul binar (). Specific pentru aceasta constructie este ca spre deosebire de ceilalti operatori binari, in acest caz al doilea parametru poate fi si vid (corespunzand unui apel de functie fara parametri). Operatorul () se poate supraincarca asa incat primul operand sa fie un obiect, ceea ce rezulta intr-o constructie de forma: obiect(lista_parametrilor_efectivi) O astfel de expresie este echivalenta cu: obiect.operator()(lista_parametrilor_efectivi) Functia care supraincarca operatorul() trebuie sa fie o functie membru nestatica.

Utilizare: Principala utilizare a supraincarcarii acestui operator o constituie constructia iteratorilor.

47. Suprancrcarea pentru - >. Supraincarcarea operatorului -> se face printr-o functie membru nestatica. La supraincarcare acest operator este considerat ca fiind un operator unar care se aplica la operandul care il precede. 48. Supraincrcarea pentru +. n limbajul C++, operatorii + i au diverse funcii dependente de context: operaii aritmetice pentru valori ntregi, reale, operaii cu pointeri. Acesta este un exemplu de suprancrcare a operatorilor. Limbajul C++ permite programatorilor s suprancarce majoritatea operatorilor pentru ca acetia s poat fi folosii n contextul unor noi clase. Unii operatori sunt suprancrcai mai frecvent dect alii, cum ar fi de exemplu operatorul de asignare sau cei aritmetici de adunare sau scdere. Aciunile implementate de operatorii suprancrcai pot fi realizate la fel de bine i prin apeluri explicite de funcii, ns folosirea notaiei cu operatori este mai clar i mai intuitiv. Operaia de adunare + funcioneaz pentru variabile de tip int, float, double i un numr de alte tipuri de dat predefinite deoarece operatorul + a fost suprancrcat chiar n limbajul de programare C++ 49. Supraincarcarea :: ,Supraincarcarea pentru .(punct), Supraincarcarea pentru sizeof Nu se poate realize supraincarcarea pentru . .* :: ?: sizeof 50. 51. Suprancrcarea pentru Q. Supraincrcarea pentru sizeof.

Nu se poate realize supraincarcarea pentru . .* :: ?: sizeof


52. Suprancrcarea operatorului virgul.

Permite evaluarea unei liste de obiecte i returneaz referina ultimului obiect din list. Este recomanat s se lucreze cu pointeri constani de coninut constant.

const persoana &operator,(const persoana &p) const { return p;} 53. Motenirea.

Motenirea permite crearea unei ierarhii de clase, pornind de la cea mai general la cea mai concret. Procesul implic definirea unei clase de baz care definete toate calitile comune ale obiectelor ce vor deriva din baz.

Clasele derivate din baz se numesc clase derivate. O clas derivat include toate caracteristicile clasei de baz plus caliti specifice ei (ale clasei derivate). Forma general a motenirii este: ? 1 2 3 class nume-clasa-derivata : acces nume-clasa-baza {

// corpul clasei }; Specificatorul de acces, acces, trebuie s fie unul din urmtoarele cuvintecheie: public, private sau protected. Acest specificator determin nivelul de acces al membrilor clasei de baz n interioul clasei derivate. Dac specificatorul lipsete i clasa este declarat cu class, atunci implicit va fi asumat private. Dac clasa este declarat cu struct i specificatorul lipsete, atunci va fi asumat public. Cnd acces este public, toi membrii publici din baz devin membri publici n clasa derivat, i toi membrii protected din clasa de baz devin membri protejai n clasa derivat. Elementele private ale clasei de baz rmn private i nu sunt accesibile n clasa derivat. Exemplu: #include <iostream> using namespace std;

class base { int a, b; public: void set(int x, int y) { a = x; b = y; } void show() { cout << a << ' ' << b << '\n'; } };

class derivat : public base {

int k; public: derivat(int e) { k = e; } void showk() { cout << k << '\n'; } };

int main() { derivat ob(7); // Functia mostenita din base cu acces public ob.set(8, 9); // Setez membrii mosteniti din base ob.show(); // Mostenita din base ob.showk(); // Functia specifica clasei derivat

return 0; } 54. Controlul accesului la clasa de baz.

Constructorul clasei de baz se va executa naintea constructorului clasei derivate, iar destructorul clasei derivate se va executa naintea destructorului clasei de baz. Accesul la membrii clasei de baz motenii n clasa derivat este controlat de specificatorul deacces (public, protected, private) din declaraia clasei derivate.O regul general este c , indiferent de specificatorul de acces declarat la derivare, datele de tip private n clasa de baz nu pot fi accesate dintr-o clas derivat. O alt Regul generala este ca prin derivare, nu se modific tipul datelor n clasa de baz Un membru protected ntr-o clas se comporta ca un membru private, adic poate fi accesat numai de membrii acelei clase i de funciile de tip friend ale clasei. Diferena ntre tipul private i tipul protected apare n mecanismul de derivare: un membru protected al unei clase motenita ca public ntr-o clas derivate devine tot protected n clasa derivat , adic poate fi accesat numai de funciile membre i friend ale clasei derivate i poate fi transmis mai departe, la o nou derivare, ca tip protected

55.

Motenirea i membrii protejai.

Cnd un membru al clasei este declarat protected, acel membru nu este accesibil prilor de program non-membre, dar este accesibil claselor derivate. Cnd zic c este accesibil claselor derivate m refer la faptul c poate fi accesat direct de membrii clasei derivate. n primul exemplu, clasa base are doi membri privai: a i b, care nu pot fi accesai n clasa derivat. De exemplu, urmtoarea definiie a clasei derivat ar fi cauzat o eroare de compilare:

56.

Motenirea protected a clasei de baz.

Cnd un membru al clasei este declarat protected, acel membru nu este accesibil prilor de program non-membre, dar este accesibil claselor derivate. Cnd zic c este accesibil claselor derivate m refer la faptul c poate fi accesat direct de membrii clasei derivate. n primul exemplu, clasa base are doi membri privai: a i b, care nu pot fi accesai n clasa derivat. De exemplu, urmtoarea definiie a clasei derivat ar fi cauzat o eroare de compilare: class derivat : public base { int k; public: derivat(int e) { k = e; } // Eroare! Nu pot accesa membrii privati a si b void showk() { cout << k << a << b <<'\n'; } }; Un membru protected se comport ca un membru private pentru restul programului i ca un membru public pentru clasele derivate. Deci, pentru a corecta eroarea de mai sus, trebuie s declar membrii a i b ca fiind protected: ? class base { protected: int a, b; // Membri protejati public: void set(int x, int y) { a = x; b = y; } void show() { cout << a << ' ' << b << '\n'; } };

class derivat : public base { int k; public: // Acum nu mai sunt probleme derivat(int e, int r, int t) { k = e; a = r; b = t; } void showk() { cout << k << ' ' << a << ' ' << b << '\n'; } };

int main() { derivat ob(7, 8, 9); ob.showk(); ob.set(11, 12); ob.show(); ob.showk(); // ob.a; // Eroare! Nu pot accesa un membru protected

return 0; } 57. Motenirea din clase de baz multiple.

n C++ este posibil s motenii de la mai multe clase. Pur i simplu, separai lista claselor din care motenii (mpreun cu specificatorii de acces) prin virgul. class base1 {

protected: int x; public:

void showx() { cout << x << '\n'; } };

class base2 {

protected: int y; public: void showy() {cout << y << '\n';} };

// Mostenire multipla class derivat: public base1, public base2 {

public: void set(int i, int j) { x = i; y = j; } };

int main() { derivat ob; ob.set(10, 100); // Functie membra a clasei derivat ob.showx(); // Din clasa base1 ob.showy(); // Din clasa base2

return 0; } Trebuie s folosii un specificator de acces pentru fiecare clas din care motenii. 58. Constructori, destructori i motenire.

Este posibil ca o clas de baz, o clas derivat, sau ambele s aib constructori i/sau destructori. Este important s nelegei ordinea n care sunt invocai acetia cnd un obiect al clasei derivate este creat sau distrus. class base {

public: base() { cout << "Constructor baza\n"; } ~base() { cout << "Destructor baza\n"; } };

class derivat: public base {

public: derivat() { cout << "Constructor derivat\n"; } ~derivat() { cout << "Destructor derivat\n"; } };

int main() { derivat ob;

// Output: // Constructor baza // Constructor derivat // Destructor derivat // Destructor baza

return 0; }

59.

Cnd sunt executate funcille constructor i destructor.

Aa cum vedei, cnd un obiect al clasei derivate este creat, constructorul clasei de baz este invocat primul, urmat de constructorul clasei derivate. Cnd obiectul este distrus, destructorul clasei derivate este apelat primul, urmat de destructorul clasei de baz. Altfel spus, constructorii sunt executai n ordinea derivrii (de la clasa din vrful ierarhiei la clasa din baza ierarhiei), iar destructorii sunt executai n ordinea invers derivrii (de la baza ierarhiei la vrf). Aceeai regul se aplic i motenirii multiple.

1.

Transmiterea parametrilor spre constructorii clasei de baz.

Pentru a transmite argumente constructorului clasei de baz se procedeaz n felul urmtor: constructor-derivat(arg-list) : base1(arg-list), base2(arg-list), // ... baseN(arg-list) { // corpul constructorului derivat } Trebuie s nelegei c dac clasa de baz implementeaz un constructor cu parametri, atunci toi constructorii clasei derivate trebuie s invoce acel constructor i s-i transmit argumente, chiar dac constructorul clasei derivate nu ia parametri. Dac clasa de baz suprancarc mai muli constructori atunci putei alege ce constructor de baz va fi invocat. Dac nu specificai niciun constructor de baz, atunci va fi apelat constructorul implicit (fr parametri) al clasei de baz (dac exist). ?

60. 61.

Permiterea accesului. Clase de baz virtuale.

Atunci cnd se motenete din mai multe clase, pot aprea neclariti. De exemplu: class base { public: int i; };

// derivat1 mosteneste base class derivat1 : public base { public: int j; };

// derivat2 mosteneste base class derivat2 : public base { public: int k; };

/* derivat3 mosteneste derivat1 si derivat2 Asta inseamna ca sunt doua copii de base in derivat3! */ class derivat3 : public derivat1, public derivat2 { public:

int suma; };

int main() { derivat3 ob;

ob.i = 5; // Care i? Este mostenit de doua ori: o data in derivat1 si o data in derivat2 ob.j = 89; ob.k = 45;

// Care i? Ambiguu! ob.suma = ob.i + ob.j + ob.k;

cout << ob.suma;

return 0; }
62. Funcii virtuale i polimorfism.

O functie virtuala este o functie care este declarata ca fiind virutal in clasa de baza si redefinita de o clasa derivata. In esenta, o functie virtuala declarata in clasa de baza actioneaza ca un substitut pentru pastrarea datelor care specifica o clasa generala de actiunii si declara forma interfetei. Redefinirea unui funtii virtuale intr-o clasa derivata ofera operatiile efective pe care le executa functia. Altfel spus, o functie virtuala defineste o clasa generala de actiuni. Redefinirea ei introduce o metoda specifica. Polimorfismul din timpul rularii este permis doar daca accesul se face printun pointer al clasei de baza. 63. Funciile virtuale.

n programarea orientat pe obiecte (POO), o funcie virtual sau metod virtual este o funcie al crei comportament, n virtutea declarrii acesteia ca fiind "virtual", este determinat de ctre definiia unei funcii cu aceeai semntur cea mai ndeprtat pe linia succesoral a obiectului n care este

apelat. Acest concept este o foarte important parte din poriunea de polimorfism a paradigmei de programare pe obiecte (POO). Conceptul de funcie virtual rezolv urmtoarea problem: n POO cnd o clas derivat motenete de la o clas de baz, un obiect al clasei derivate poate fi considerat ca fiind (sau convertit la) o instan a clasei de baz sau a unei clase derivate din aceasta. Dac exist funcii ale clasei de baz ce au fost redefinite n clasa derivat, apare o problem cnd un obiect derivat a fost convertit la (este referit ca fiind de) tipul clasei de baz. Cnd un obiect derivat este considerat ca fiind de tipul clasei de baz, comportarea dorit a apelului de funcie este nedefinit.Distincia dintre virtual (dinamic) i static este fcut pentru a rezolva aceast problem. Dac funcia n cauz este etichetat drept "virtual" atunci funcia clasei derivate va fi apelat (dac ea exist). Dac e static, atunci va fi apelat funcia clasei de baz. De exemplu, o clas de baz Animal poate avea o funcie virtual eat. Subclasa Fish va implementa eat() ntr-un mod diferit fa de sub-clasa Wolf, dar poi invoca metoda eat() n cadrul oricrei instane de clas de referin Animal, i obine o comportare specific clasei derivate pentru care aceast metod a fost redefinit. Aceasta i d posibilitatea programatorului s proceseze o list de obiecte din clasa Animal, spunndu-i fiecruia pe rnd s mnnce (apelnd funcia eat()), fr a ti ce fel de animal se poate afla pe list. Nici mcar nu trebuie s tii cum mnnc fiecare animal, sau care ar putea fi setul complet de tipuri posibile de animale. 64. Atributul virtual este motenit.

Cand o functie virtuala este mostenita, se mosteneste si natura sa virtuala. O functie ramane virtuala indiferent de cate ori este mostenita. Atributul virtual este mostenit: cand o functie virtuala este mostenita se mosteneste si atributul virtual. class D: public B1, public B2{ void fctVirtuala(){ cout << "Acesta este o functie virtuala in clasa derivata D \n"; } }; void f(){ BB *pbb, bb;

B1 b1; B2 b2; pbb = &bb; //indica spre baza pbb->fctVirtuala(); //acces la functia virtuala a calasei parinte pbb = &b1; //indica spre clasa derivata B1 pbb->fctVirtuala(); //acces la functia virtuala a calasei derivate B1 pbb = &b2; //indica spre clasa derivata B1 pbb->fctVirtuala(); //acces la functia virtuala a calasei derivate B2 } void f(){ D dd; pbb = &dd; pbb->fctVirtuala(); //acces la functia virtuala a clasei derivate D } 65. Funcine virtuale sunt ierarhizate.

Cand o functie este declarata ca fiind virtual intr-o clasa de baza, ea poate fi suprascrisa de o clasa derivata. Totusi, functia nu trebuie neaparat sa fie suprascrisa. Daca o clasa derivata nu suprascrie functia virtuala, atunci, cand un obiect din acea clasa derivata are acces la functie, este folosita functia definita de clasa de baza. #include<iostream.h> class B }; class D1 : public B }; class D2 : public B ; void main() N.B. Atunci cand o clasa derivata nu suprascrie o functie virtuala, este folosita prima redefinire gasita in ordinea inversa a derivarii. 66. Funcii virtuale pure.

O functie virtuala pura este o functie virtuala care nu are definitie in clasa de baza. virtual tip nume-functie(lista-de-parametri) = 0; Cand o functie virtuala este construita pura, orice clasa derivata trebuie sa-i asigure o definitie. In cazul in care clasa derivata nu suprascrie functia virtuala pura, va rezulta o eroare in timpul compilarii. #include<iostream.h> class NUMAR virtual void arata() = 0; //functie virtuala pura }; class HEX : public NUMAR }; class DEC : public NUMAR }; class OCT : public NUMAR }; void main() 67. Clase abstracte.

O clasa care contine cel putin o functie virtuala pura se numeste abstracta. Ex:.O ierarhie de calase care defineste o ierahie de figure: class Figura { protected: int x, y; public: Figura (int x = 0, int y=0){ this->x = x; } virtual void afisare() = 0; }; class Cerc:public Figura{ int raza;

public: Cerc(int x, int y, int r):Figura(x,y){ this->raza =r; } void afisare(){ cout << "Cerc ( (" << x << ", " << y << "), " << raza << ")\ n"; } }; class Patrulater:public Figura{ int latime, lungime; public: Patrulater(int x, int y, int latime, int lungime):Figura(x,y){ this->latime = latime; this->lungime = lungime; } void afisare(){ cout << "Patrulater ( (" << x << ", " << y << "), latime: " << latime<< ", lungime: "<< lungime<< ")\n"; } }; void f(){ Figura *fc, *fp; fc = &(Cerc(3,5,7)); fc->afisare(); fp = new Patrulater(2,3,7,8); fp->afisare(); const int N = 5; int i;

Figura* fptrs[N]; fptrs[0] = new Cerc(3,5,7); fptrs[1] = new Patrulater(2,6,7,8); fptrs[2] = new Cerc(2,5,9); fptrs[3] = new Patrulater(2,3,7,8); fptrs[4] = new Cerc(3,8,7); cout << " Afisare sir figuri \n"; for (i=0; i<N; i++){ fptrs[i]->afisare(); } } 68. Utilizarea funciilor virtuale.

Una dintre cele mai puternice si mai flexibile cai de introducere a abordarii o interfata, metode multiple este folosirea functiilor virtuale, a claselor abstracte si a polimorfismului din timpul rularii. Folosind aceste caracteristici, creati o ierarhizare care trece de la general la specific (de la baza la derivat). #include<iostream.h> class CONVERT double daconv() double dainit() virtual void calcul() = 0; }; class LITRI_GALOANE : public CONVERT void calcul() }; class FAHRENHEIT_CELSIUS : public CONVERT void calcul() }; void main() 69. Legturi iniiale/ulterioare.

Legarea iniial (Early binding) se refer la evenimentele ce au loc n timpul compilrii. Legarea iniial se produce atunci cnd toate informaiile necesare apelrii unei funcii se cunosc n timpul compilrii. Mai simplu, legarea iniial nseamn c un obiect i apelul funciei se leag n timpul compilrii. Apelrile normale de funcii, suprancrcarea funciilor i operatorilor (polimorfism n timpul compilrii) sunt exemple de legare iniial. Deoarece toate informaiile necesare apelului unei funcii se tiu din timpul compilrii, aceste tipuri de apelare sunt foarte rapide. Legarea trzie (Late binding) se refer la apelurile de funcii determinate n timpul execuiei. Funciile virtuale sunt folosite pentru a activa legarea trzie. Aadar, obiectul i funcia vor fi legai n timpul execuiei. Avantajul legrii trzii este flexibilitatea, dar deoarece apelul funciei este determinat la runtime, execuia este puin mai nceat. 70. abloane.

n programarea calculatoarelor, abloanele sunt o caracteristic a limbajului de programare C++ ce permit scrierea de cod fr a lua n considerare tipul de dat ce va fi utilizat pn la urm. abloanele permit programare generic n C++. abloanele sunt foarte utile programatorilor n C++, mai ales cnd sunt combinate cu tehnica motenirilor multiple i a suprancrcrii operatorilor. Biblioteca Standard de abloane (STL) a limbajului C++ aduce multe funcii utile ntr-un cadru de abloane conectate. Exist dou feluri de abloane. Un ablon funcie se comport ca o funcie ce poate accepta argumente de tipuri foarte diferite. De exemplu, Biblioteca Standard de abloane a limbajului C++ conine ablonul funcie max(x, y) ce returneaz x sau y, pe cel mai mare dintre cele dou argumente. max() ar putea fi declarat cam aa: template <class a> a max(a x, a y) { if (x < y) return y; else return x; } Acest ablon poate fi apelat ntr-un mod identic cu apelul de funcie: cout << max(3, 7); // afieaz 7

Un ablon clas extinde acelai concept peste clase. abloanele clas sunt folosite de obicei pentru a face containere generice. De exemplu, biblioteca STL are un container de tip list nlnuit. Pentru a face o list nlnuit de ntregi, se va scrie list<int>. O list de iruri de caractere este notat list<string>. O list are un set de funcii standard asociate, ce funcioneaz indiferent ce vei pune ntre paranteze. 71. Funcii generice.

O funcie generic definete un set de operaii aplicabil mai multor tipuri de dat. Tipul de dat este transmis ca parametru funciei care va opera asupra acelui tip. Printr-o funcie generic, o singur procedur (sau set de operaii) poate fi aplicat unui domeniu larg de date. De exemplu, algoritmul Quicksort este acelai indiferent c opereaz asupra unor ntregi (ex: int) sau numere reale (double). Diferena const doar n tipul datelor. Dup ce ai creat o funcie generic, compilatorul va genera automat codul corect pentru tipul de dat folosit atunci cnd este apelat funcia. O funcie generic este practic o funcie care se suprancarc singur. 72. 0 funcie cu dou tipuri generice.

Instruciunea template accept mai mult de un parametru generic. Parametrii se separ prin virgul. De exemplu: template<typename T, typename V> void printCrap(T x, V y) { cout << "Printing crap: " << x << ' ' << y << '\n'; }

int main() { printCrap(56, "Imi place C++"); printCrap(5690L, 34.67);

return 0; } Aici compilatorul nlocuiete substituenii T i V cu tipurile int i char*, respectiv, long i double, atunci cnd acesta genereaz instanele specifice ale printCrap() din main(). Observai c am folosit typename. Puteam la fel de bine folosi class.

73.

Suprancrcarea explicit a unei funci i generice.

Putei suprancrca explicit o funcie generic. Aceast suprancrcare se numete specializare explicit sau specializare template. De exemplu: template<class T> void schimba(T& a, T& b) { T temp; temp = a; a = b; b = a; }

// Specializare template template<> void schimba<int>(int& a, int& b) { int temp; temp = a; a = b; b = a; cout << "In interiorul specializarii.\n"; }

int main() { int i = 20, j = 40; double x = 4.67, y = 7.77; char a = 'a', b = 'b';

// Inainte de interschimbare cout << i << ' ' << j << '\n'; // 20 40

cout << x << ' ' << y << '\n'; // 4.67 7.77 cout << a << ' ' << b << '\n'; // 'a' 'b'

// Interschimba schimba(i, j); // se apeleaza specializarea explicita schimba(x, y); schimba(a, b);

// Dupa interschimbare cout << i << ' ' << j << '\n'; // 40 20 cout << x << ' ' << y << '\n'; // 7.77 4.67 cout << a << ' ' << b << '\n'; // 'b' 'a'

return 0; } Observai c tipul pentru care se realizeaz specializarea se pune ntre <>, urmat de numele funciei. Constructul template<> indic o specializare de template. 74.
I.

Restricii pentru funcia generic.


O prima restrictie legata de functiile template este aceea ca in lista de argumente formale trebuie sa apara toate tipurile generice specificate in prefixul template <class T1, . . . , Tn>. Astfel urmatoarele definitii vor genera erori de compilare: template <class T> void f1() { ... } template <class T1, class T2> T1* f2(T2 t2) { ... } II. A doua restrictie legata de functiile template este aceea ca ele vor fi apelate doar in cazul in care tipurile parametrilor actuali se potrivesc perfect cu cele ale parametrilor formali. Cu alte cuvinte, la apelul functiilor template nu se fac nici un fel de conversii ale parametrilor. Acest lucru este ilustrat in exemplul de mai jos: template <class T> void f1(T t1, T t2) { ... } template <class T1, class T2> void f1(T1 t1, T2 t2) { ... } main() { f2(1,1); // corect: T1 si T2 vor fi int.

f1(12.34, 56); // eroare: cei doi parametrii trebuie sa fie exact de acelasi tip. }

75. 76.

Aplicarea fUnciilor generice. 0 sortare generic.

#include <stdio.h>

//functia de sortare generica int sort(void * v, int n, int size, int (*f) (void *, void*)) { int i,j; void *aux = malloc(size); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { //incrementarea pointerilor void* se face cu 1 if (f(v + i*size, v + j*size) > 0) { memcpy(aux, v + i*size, size); memcpy(v + i*size, v + j*size, size); memcpy(v + j*size, aux, size); } } } }

77.

Clase generice.

Clasele colecii conin obiecte de un tip particular (de exemplu o list nlnuit de ntregi sau un tablou de structuri. Se pot defini familii de clase colecii, membrii acestora diferind numai prin tipul elementelor. Considerm clasa tablou de ntregi: pentru a folosi un tablou de reali, de compleci sau de iruri de caractere s-ar putea copia implementarea clasei, modificnd tipul datelor i numele clasei. Astfel am avea clasele intArray, StringArray, ComplexArray, etc. Familia de clase poate fi reprezentat printr-o clas generic (parametrizat). Aceasta specific modul n care pot fi construite clasele individuale, care se deosebesc numai prin tipul elementelor pe care le conin.

78.

Un exemplu cu dou tipuri de date generice.

O clas generic se reprezint astfel: template <list_argumente_generice> declarare_clas; Instanierea unei clase generice se face prin: nume_clas <list_argumente_concrete> nume_obiect; Definim clasa generic (parametrizat): template <class T> class Array{ public: Array(int d=10): a(new T[dim]), dim(d){} ~Array(){delete a;} private: T *a; int d; }; 79. Extinderea IDE Builder a clasei:proprieti i evenimente.

A. Propieti, metode, evenimente Dezvoltarea rapid a aplicaiilor nseamn suport pentru propietile, metodele i evenimentele obiectelor (PME). Propietile permit setarea uoar a caracteristicilor componentelor. Metodele execut aciuni asupra obiectelor. Evenimentele permit ca aplicaia s rspund la mesajele Windows, sau la schimbri de stare a obiectelor. Folosirea modelului PME furnizeaz un robust i intuitiv mediu de dezvoltare pentru aplicaiile Windows. B. C++Builder Help Mediul C++Builder ofer un ghid practic, care conine peste 3000 de pagini de documentaie despre IDE, VCL, baze de date i tehnici de programare. C. Codurile surs pentru VCL Mediul C++Builder pune la dispoziie codurile surs pentru VCL - Visual Component Library, furniznd astfel o unic privire nuntrul modului n care lucreaz C++Builder. VCL furnizeaz peste 100 de componente reutilizabile care ajut programatorul s construieasc aplicaii robuste ntr-un timp scurt. Aceste componente pot fi modificate pentru a corespunde necesitilor din

cele mai diverse. C++Builder-ul incude o suit complet de controale Windows95: TreeView, Trackbars, ProgressBars, toolbars, Rich Edit, ListViews, ImageLists, StatusBars etc. Totodat C++Builder include suport pe 32 de bii pentru numele lungi de fiiere, multi-threading i Win95 API. 80. Paleta de obiecte Builder.

Componentele sunt elemente utilizate pentru a crea aplicaii C++Builder. O component este de fapt un element de tip UI (user interface). Pot fi vizuale (de exemplu butoanele, cutiile de dialog), sau pot fi non-vizuale (de exemplu timer-ul). Spunem despre o component c este vizual, dac ea este vizibil, sau va fi vizibil la momentul execuiei, iar o component este nonvizual, dac la momentul proiectrii aplicaiei apare pe form ca un desen, iar n momentul execuiei aplicaiei devine invizibil (de exemplu TTimer din pagina System), sau este invizibil pn n momentul n care este apelat (de exemplu TOpenDialog sau TSaveDialog din pagina Dialogs). Fiecare component are atribute care permit controlul aplicaiei. Componentele sunt grupate n pagini. n forma implicit paginile sunt: Standard, Win95, Additional, Dat Access, Data Control, Win31, Internet, Dialogs, System, QReport, ActiveX figura 1.6 De exemplu cele mai folosite componente sunt cele din pagina Standard, care conine cutii de dialog, meniuri, butoane etc. Pentru a obine help despre fiecare dintre ele, executai click pe componenta dorit, iar apoi apsai pe F1. O component special este i forma, care are la rndul ei atate propieti, metode, evenimente etc. Aezarea unei componente pe o form se poate face n mai multe moduri - dac dorim plasarea componentei n mijlocul formei atunci executm dublu click pe forma respectiv. - dac dorim s plasm componenta n alt loc dect centrul formei, atunci executm un click pe component, iar apoi nc un click n locul dorit pe form. Colul din stnga sus al componentei va coincide cu locul unde am executat cel de-al doilea click. n aceste dou cazuri dimensiunile componentei vor fi cele implicite. Se pot modifica aceste dimensiuni, fie din Object Inspector (vezi mai jos), fie cu ajutorul mouse-ului. 81. IDE Builder.

C++Builder este un mediu de dezvoltare rapid a aplicaiilor produs de filiala CodeGear a Embarcadero Technologies pentru scrierea programelor n limbajul de programare C++. C++Builder combin biblioteca de componente vizuale i un IDE scris n Delphi, cu un compilator C++. Ciclul de dezvoltare este n aa fel nct Delphi primete primul mbuntiri semnificative, urmat de C++Builder. Majoritatea componentelor dezvoltate n Delphi pot fi folosite n C++Builder fr modificri, dar nu i invers.

C++Builder include unelte care permit dezvoltarea vizual bazat pe dragand-drop, fcnd programarea mai facil prin implementarea unui GUI builder WYSIWYG n IDE. 82. Meniul, ferestrele de lucru.

MAIN MENU File Edit pentru a deschide, crea, salva, nchide project-uri i fiiere; pentru prelucrare de texte i componente

View pentru a afia, sau ascunde elemente ale mediului; Project Run Component pentru a crea sau a instala o component. DataBase pentru manipulare de baze de date. pentru a compila o aplicaie;

Workgroups pentru manipularea proiectelor mari. Tools pentru a rula programele utilitare disponibile, fr a prsi mediul C+ +Builder; Options pentru a controla comportamentul mediului de dezvoltare;

Help pentru a obine ajutor n diversele faze de utilizare a mediului Forma nreaga parte vizibil a unei aplicaii este construit pe un obiect special numit form(ca cea din figura 1.2). O form liber este creat de fiecare dat cnd este lansat n execuie mediul C++Builder. O aplicaie poate avea mai multe forme. Adugarea de noi forme unei aplicaii se face selectnd comanda New Form din meniul File. Pe form se pot aeza i aranja componente vizulale i non-vizuale care alctuiesc interfaa cu utilizatorul. Fiecrei forme i sunt asociate dou fiiere cu exensiile .cpp respectiv .h (n cazul formei de mai sus unit1.cpp iunit1.h) Editorul de cod Mediul C++Builder are o fereastr unde programatorul poate scrie codul unei aplicaii. Editorul de cod este un editor ASCII complet i poate deschide mai multe fiiere simultan. Bara cu instrumente Aceasta reprezint o scurttur la comenzile aflate n MainMenu. Tabelul cu proprieti ale obiectelor Acest tabel (Object Inspector) care face legtura ntre interfaa aplicaiei i codul scris de programator are dou funcii: seteaz propitetile componentelor aflate n form. creeaz i ajut la navigatul prin handler-ele de evenimente. Un handler de evenimente se execut n Object Selector

n captul de sus al lui se afl Object Selector care conine toate componentele de pe form mpreun cu tipul lor.

83.

Mediul Builder.

Elementele mediului integrat de dezvoltare sunt: Meniu principal (Main Menu); Forma (Form); Editorul de cod (Code Editor); Bara cu instrumente (Toolbar); Paleta cu componente (Component Palette); Tabelul cu proprieti ale obiectelor (Object Inspector); Administratorul de program (Program Manager);

84.

Evenimente, module.

Pagina evenimentelor(Events) a inspectorului obiectelor arat lista evenimentelor determinate de component(programarea pentrru sistemele de operare cu interfa grafic a utilizatorului,n special,pentru Windows 95 sau Windows NT i presupune descrierea reaciei aplicaiei la anumite evenimente, pe cnd nsi sistemul de operare se ocup de interogarea computer-ului cu scopul determinrii dac se realizeaz un eveniment).Fiecare component are un set propriu de procesare a evenimentelor. n C++ Builder este nevoie de a scrie funcii ce proceseaz evenimentele i corelarea evenimentelor cu aceste funcii.n procesul crerii a astfel de procesoare de un anumit tip se oblig programul s realizeze funcia scris, dac se va realiza evenimentul dat. Fiecare componaneta are evenimentele sale posibile.

85.

Proiectarea BD.

Metodologia de proiectare, consta ntr-o abordare structurata, n care se utilizeaza proceduri, tehnici, instrumente si documentatii, pentru a sustine si facilita procesul de proiectare. O metodologie de proiectare consta n mai multe faze, continnd etape care ndruma proiectantul n alegerea tehnicilor adecvate fiecarei etape a proiectului; de asemenea l ajuta la: planificare, administrare, control si evaluarea proiectelor de dezvoltare a bazelor de date. n final are loc o abordare structurata de analiza si modelare a unui set de cerinte privind BD, ntr-o maniera standardizata si organizata. Metodologia de proiectare a BD, consta din trei faze principale: Proiectarea conceptuala a BD Proiectarea fizica a BD Proiectarea logica a BD Cererea n C++ Builder este un obiect care reprezint o colecie de date. De obicei pentru crearea unei cereri se utilizeaz componenta TQuery urma al clasei abstracte TDataSet.

86.

Utilizarea Form.

Ea este utilizata pentru suport a obiectelor ce sunt create pe ea. Formele pot fi de diferite tipuri (parinte, copil), si create in moduri diferite. Toate C + + Builder formularele sunt definite ntr-o clas C + +, ceea ce nseamn cacestea sunt obiecte n msura n care cererea dumneavoastr este n cauz. Pentru ca sunt obiecte, avei control asupra a ceea ce atributele i metodele care le conin.Acest lucru nseamn c putei trata un C + + Builder form ca n cazul n care sauorice alt exemplu C + + obiect, adugnd metode i atribute pentru a se potrivinevoilor dumneavoastr. Folosind tehnicile pe care le vom acoperi, putei creteeficiena codul dumneavoastr prin meninerea central atribute i obiecte care vor fi utilizate pe parcursul cererii dumneavoastr. 87. TQRBand

TQRBand - componenta, care este parte a raportului - un container de date (de exemplu, titlul raportului, n partea de sus sau de jos a paginii antet titlu coloane sau notele de subsol ale grupului, etc.) Componentele sunt tiprite cu TQRBand n funcie de tipul lor n locurile corespunztoare din raport, indiferent de poziia lor relativ peformular.Caracteristica cea mai utilizat de aceast component - BandType, de tip"bar" (stranitsyili banda de subsol, "trupa" de date, etc). Valori posibile: rbTitleraporttitlu, rbPageHeader - antetul paginii, rbColumnHeader-antetul de coloan ntr-un raport multicolumn, rbDetail - polosas tabelare de date (repetat ori de cte oriexist rnduri vnabore baza de date avlyayuschemsya de raport), rbPageFooter kolontitulstranitsy mai mici, rbOverlay - de fundal a paginii este tiprit n colul dinstnga sus kazhdoystranitsy, rbGroupHeader - un antet de grup, rbSubDetail -"benzi" de date tabelare pentru Detaliumas, rbGroupFooter - kolontitulgruppy mai mici, rbSummary - tiprite la sfritul raportului). Domeniul imobilier BandTypecomponent sozdannogonami atribui valoarea rbTitle 88. QuickReport

QuickReport este un set de componente i a controalelor, care permite rapoarte s fie proiectate i previzualizate n Delphi i C + + Builder IDEuri. Aplicatii inclusivfuncionalitatea Quickreport pot fi apoi utilizate free. 89. TdataSource

Componenta DataSource acioneaz n calitate de mediator ntre componentele TDataSet (TTable, TQuery, TStoredProc) i componentele Data Controls elemente de dirijare care asigur reprezentarea datelor n formular. Componentele TDataSet dirijeaz legturile cu biblioteca Borland Database Engine (BDE), iar componente DataSource dirijeaz legturile cu datele din componentele Data Controls.
90. TTable

Cea mai simpl metod de adresare la tabelele bazelor de date este cu utilizarea componentei TTable, care permite accesul la un tabel. Pentru aceasta cel mai des utilizm urmtoarele proprieti: Active, DatabaseName, TableName, Exclusive, ReadOnly
91. TDBGrid

Componenta TDBGrid asigur metoda de afiare pe ecran a rndurilor de date din componentele TTable i TQuery sub form de tabel. Aplicaia poate s utilizeze TDBGrid pentru afiare, includere, nimicire, redactare a datelor BD. De obicei DBGrid se utilizeaz n combinaie cu DBNavigator, dei pot fi utilizate i alte elemente de interfa, incluznd n procesoarele lor de evenimente metodele First, Last, Next, Ptior, Insert, Delete, Edit, Append, Post, Cancel a componentei TTable.

92.

Tquery

Ca i n cazul componentei TTable, componenta TDataSource gestioneaz cu interaciunea dintre componentele Data Controls i componenta TQuery. De obicei aplicaia are cte o component DataSource pentru fiecare component TQuery. Active,Eof, DatabaseName, DataSource, Fields, Params, SQL

93.

SQL Explorer

SQL Explorer este un instrument la ndemn atunci cnd se lucreaz cu baze de date. Pentru a ncepe, selectai baza de date meniu / Exploreaza sau de a rula ca o aplicaie independent. n stnga paginii Explorer panoul de Bazele de date suntprezentate ca lista drop-down de toate proprietile enumerate n pseudonime de configurare BDE fiier. n panoul din dreapta, avei posibilitatea s vizualizaiconinutul tabelelor, intra i a executa SQL-interogare de la mas i de a obine informaii despre baza de date alias (driver de baze de date, locaia, limba folositde ctre conductorul auto i ali parametri coninute n BDE fiierul de configurare),informaii despre tabelele (tipul de tabela, versiune, data ultimei actualizri, etc) i,dac este necesar, s le modifice.

S-ar putea să vă placă și