CATEGORII DOCUMENTE |
DOCUMENTE SIMILARE |
|
TERMENI importanti pentru acest document |
|
Elemente de baza ale POO
Evolutia in timp a calculatoarelor si a problemelor de programare a permis trecerea de la tehnica programarii structurale la tehnica programarii obiect. De asemenea, odata cu acceptarea beneficiilor aduse de Interfata Grafica (GUI) a S.O. Microsoft Windows, programarea pentru acest mediu a devenit foarte importanta. Programarea pentru Windows este diferita de cea orientata pe tranzactii. O diferenta esentiala intre cele doua este ca un program rulat sub Windows proceseaza informatiile utilizatorului cu ajutorul mesajului de la S.O., pe cand un program MS-DOS foloseste S.O. pentru a furniza informatiile.
Limbajul de programare Visual C++ produs de firma Microsoft este un limbaj textual, ce foloseste un program de construit interfete grafice pentru a usura munca programatorului in scopul crearii de interfete coerente. Utilizarea acestui mediu de programare prezinta o serie de avantaje, cum ar fi:
- posibilitatea de creare de programe in diferite limbaje, care sa interactioneze intre ele
- utilizarea unor obiecte native Windows, ceea ce duce la crearea unor programe executabile de dimensiuni relativ mici
- posibilitatea utilizarii de biblioteci complexe ce pun la dispozitia programatorului metode de rezolvare a marii majoritati a programelor
- posibilitatea utilizarii de programe "vrajitor" (wizard) care ghideaza programatorul in realizarea programelor.
Visual C++ include o colectie mare si elaborata de unelte de dezvoltare software, toate folosite printr-o interfata de ferestre. Microsoft Fondation Classes MFC- este o biblioteca de clase C++ ce usureaza crearea de aplicatii Windows. Appwizard este un generator de cod ce creaza un schelet optional de aplicatii Windows cu trasaturi nume de clase si nume de surse de cod; ajuta la programarea rapida a unei aplicatii.
Class Wizard este un program ce genereaza cod pentru o noua clasa sau functie. Scrie prototipurile, corpurile functiilor si codul pentru a conecta mesajul de scheletul aplicatiei. HppStudio este un editor de meniuri si cutii de dialog in format "what you see is what you get!". In Visual C++, orice program executabil rezulta in urma compilarii si editarii legaturilor in cadrul unui proiect.
Un proiect este o entitate constituita din mai multe fisiere header, sursa de resurse etc. care contin toate informatiile necesare generarii programului executabil. Acesta va rezulta ca un fisier cu acelasi nume ca numele proiectului. O alta notiune nou introdusa de meniul de programe este spatiul de lucru work space). Acesta este constituit din totalitatea fisierelor, dispozitivelor etc, puse la dispozitia programatorului in cadrul ferestrei Visual C++ , pentru a-l ajuta la crearea programului. Spatiul de lucru este salvat intr-un fisier cu extensia .dsw, iar informatiile din acesta reconstituie in mod identic spatiul de lucru la orice noua accesare.
In mod normal, fiecare spatiu de lucru are in interiorul lui un singur proiect , dar pot fi adaugate mai multe proiecte la acelasi spatiu de lucru. Referitor la P.O.O apare ideea introducerii unui nou tip, care incapsuleaza o structura de date si un set de functii de interfata care actioneaza asupra datelor din structura. In plus, noul tip trebuie sa asigure diferitele niveluri de acces la date, astfel incat anumite date sa nu poate fi accesate decat prin intermediul unor functii de interfata, si nu in mod direct. Acest nou tip este denumit clasa
In limbajul C++, clasele se obtin prin completarea structurilor uzuale din limbajul C cu setul de functii necesare implementarii interfetei obiectului. Aceste functii poarta denumirea de metode. Pentru realizarea izolarii reprezentarii interne de restul programului, fiecarui membru i se asociaza nivelul de incapsulare PUBLIC sau PRIVATE. Un membru PUBLIC corespunde, din punct de vedere al nivelului de accesibilitate, membrelor structurilor din limbajul C. El poate fi accesat din orice punct al programului fara sa se impuna o restrictie asupra lui. Membrii PRIVATE sunt accesibili doar in domeniul clasei, adica in clasa propriu-zisa si in toate functiile membre. Un membru privat al unei clase poate fi accesat si din afara clasei prin intermediul unei functii "prietene" - se va folosi cuvantul cheie FRIEND
Sintaxa folosita pentru declararea unei clase este:
class NumeClasa;
Cuvantul cheie clasa indica faptul ca urmeaza descrierea unei clase avand numele NumeClasa. Numele clasei poate fi orice identificator, dar trebuie sa fie unic in cadrul domeniului de existenta respectiv. Declaratia clasei consta din cele doua liste de membri, prefixate eventual de cuvintele cheie PRIVATE si PUBLIC. Daca in declaratia unei clase apare o lista de membri fara nici un specificator de acces, acestia vor fi implicit PRIVATE. O variabila de tipul clasei poarta denumirea de obiect, iar declararea ei constituie o instantiere (concretizare) a clasei respective. Desi o clasa este un tip de date care descrie un ansamblu de obiecte cu aceeasi structura si acelasi comportament, atunci cand intr-un program se face un apel de functie, mecanismul de funtionare este urmatorul:
- la intalnirea unui apel de functie se salveaza in stiva adresa din memorie a urmatoarei instructiuni executabile, precum si valorile parametrilor functiei
- se sare din secventa normala de instructiuni si se executa prima instructiune din functia aflata la o adresa cunoscuta din memorie
- se executa toate instructiunile functiei, iar la sfarsit se extrage din stiva adresa urmatoarei instructiuni executabile din programul apelant, apoi se continua executia normala a programului.
Acest mecanism asigura o dimensiune redusa a codului executabil pentru ca toate codurile executabile asociate functiilor vor aparea o singura data in cadrul programului, dar fiecare apel de functie presupune respectarea mecanismului descris. Fiecare operatie dureaza un interval de timp, timp care poate fi chiar mai mare decat timpul de executie al codului functiei apelate daca acesta este scurt. De aceea, in cadrul functiilor cu putine instructiuni, acestea pot fi declarate inline. In acest caz, nu se mai genereaza un apel normal al functiei cu tot mecanismul aferent, ci pur si simplu codul functiei este inserat in locul in care aceasta a fost apelata. Se obtine astfel un cod executabil mai lung, dar timpul de executie al programului este scurtat. Decizia declararii unei functii inline apartine utilizatorului. Aceasta decizie depinde de scopul urmarit , fie un cod executabil mai redus ca dimensiune, fie un timp de executie mai scurt.
In momentul definirii unei functii, pe langa numele ei ar trebui precizat compilatorului si clasa din care aceasta face parte. Astfel, functii cu acelasi nume dar apartinand unor clase diferite vor putea fi identificate corect de catre compilator. Prin adaugarea numelui clasei la multe functii, se obtine numele complet sau numele calificat al functiei. Adaugarea numelui clasei se face cu ajutorul operatorului : : , numit si operator de domeniu.
Prin folosirea cuvantului cheie STATIC se poate declara o variabila statica. Aceasta este un atribut propriu clasei si nu fiecarui obiect in parte. Daca pentru o variabila obisnuita , in cadrul declararii fiecarui obiect se rezerva cate o zona de memorie de dimensiune SIZEOF(), o variabila statica are o unica zona de rezervare. Ea apare ca o zona de memorie comuna tuturor obiectelor si exista chiar daca nu a fost declarat nici un obiect din clasa respectiva. Variabila statica trebuie initializata si nu este vizibila decat in interiorul fisierului in care a fost declarata.
Asa cum la declararea unei variabile de un anumit tip se rezerva in memorie o zona de dimensiune sizeof(tip) pentru sortarea valorilor variabilei, si in cazul obiectelor trebuie rezervata o zona de memorie pentru stocarea valorii structurii de date ce compune clasa. Aceasta rezervare este facuta de o functie speciala, numita constructor. Constructorul unei clase este generat implicit de compilator, dar poate fi redefinit de catre programator. Un constructor este o functie care are acelasi nume ca si clasa din care face parte. Spre deosebire de o functie obisnuita, un constructor nu returneaza nici o valoare. Rolul lui este de a initializa un obiect. O clasa poate avea mai multi constructori care difera intre ei prin semnatura (lista parametri formali).
Ca si in cazul unei functii obisnuite, unii parametri pot fi specificati implicit. Un constructor trebuie sa fie intotdeauna public, deoarece, in caz contrar, la declararea unui obiect in afara clasei, el nu va fi accesibil. O problema importanta apare in cazul claselor care contin membri de tip pointer, pentru care trebuie alocata dinamic memoria. Aceasta operatie este efectuata de obicei in constructorul clasei. Alocarea dinamica a memoriei se poate face folosind functia malloc() sau operatorul new. Eliberarea zonei de memorie alocata dinamic se poate face prin intermediul unei functii speciale, numite destructor. O clasa poate declara destructor care este apelat automat de compilator in momentul distrugerii obiectului din acea clasa. Functia destructor nu returneaza nici o valoare, iar numele ei este alcatuit cu constructia: ~nume_clasa. Destructorul nu primeste nici un parametru. O clasa poate avea un singur destructor. De obicei, rolul destructorului este de a dealoca memoria alocata dinamic in constructor. Pentru eliberarea memoriei alocate se poate folosi functia free() sau operatorul delete.
Constructorul de copiere este o functie cu acelasi nume cu cel al clasei care primeste ca argument o referinta la un obiect de tipul clasei. Constructorul de copiere nu face altceva decat sa rezerve memorie pentru structura de date a celui de-al doilea obiectsi apoi sa copieze bit cu bit valorile din primul obiect in cel de-al doilea obiect. Daca structura de date a clasei contine pointeri ce aloca dinamic memorie, atunci constructorul de copiere trebuie declarat explicit.
O facilitate extrem de puternica a limbajului C++ este dreptul programatorului de a adauga operatorilor limbajului si alte sensuri decat cele predefinite. Este vorba, deci, de o redefinire a operatorilor limbajului C++ fara a se pierde vechile sensuri. Termenul consacrat in literatura de specialitate pentru aceasta operatiune este de overloading operators. Predefinirea operatorilor sau supraincarcarea lor se poate face in doua moduri: fie sub forma de functii membre, fie ca si functii privat. Redefinirea unui operator presupune declararea unei functii al carei nume este alcatuit din cuvantul cheie operator, un spatiu si simbolul operator redefinit.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1089
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved