POO - Teorie
POO - Teorie
POO - Teorie
-teorie-
Mecanismul de incapsulare este procesul in care se creeaza un nou tip de date (abstract)
definind o clasa ca fiind formata din campuri(structuri de date) si metode(functii/algoritmi).
Fiecare camp sau metoda are un atribut de acces : private (poate fii accesat doar de metodele
clasei) , protected (poate fi accesat si de metodele claselor derivate), public (poate fii accesat de
oriunde din program). Daca nu este pus un atribut de acces atunci atributul de acces implicit va
fi private.
2. Spuneti ce este obiectul implicit al unei metode si descrieti pe scurt proprietatile pe care le
cunoasteti despre acesta.
Obiectul implicit este obiectul care apeleaza metoda. In cadrul metodei campurile
obiectului implicit nu vor mai avea specificat carui obiect apartin, subintelegandu-se ca ele
apartin obiectului implicit (adica a celui pe care o apeleaza). Obiectul implicit al un metode se
poate accesa si cu ajutorul pointerului *this in modul acesta : this->a; (pentru variabile) / this-
>f(); (pentru metode).
-1-
4. Descrieti pe scurt proprietatile unui camp constant al unei clase.
Un camp constant al unei clase este un camp a carei valoare nu se poate modifica. El se
poate initializa doar in lista de initializare a constructorului si nicaieri in alta parte. Pentru a
implementa un camp constant se adauga inainte tipului de date cuvantul cheie const. De
asemenea daca acest camp constant este un obiect , el nu poate apela.
Sunt folosite cuvintele cheie try, throw si catch. Se implementeaza in felul urmator :
* Semnalizarea aparitie un exceptii prin intermediul unei valori care reprezinta exceptia
respectiva
try {
Daca aruncam o valoare de anumit tip si nu exista un catch care sa prinda valori de acel
timp , atunci vom avea eroare de executie ("Unhandled exception"). Exista deasemenea si
posibilitatea de a pune catch(...) (fara tip) care prinde orice tip de valoare.
-2-
7. Descrieti pe scurt functiile virtuale si scopul in care sunt folosite.
O functie virtuala este o functie care este declarata ca fiind virtual in clasa de baza si
redefinita de o clasa derivata. Pentru a declara o functie ca fiind virtuala , declararea sa este
precedata de cuvantul cheie "virtual". Redefinirea functiei in clasa derivata modifica si are
prioritate fata de definitia functiei din clasa de baza. Functiile virtuale reprezinta o metoda de
implementare a polimorfismului de executie. O functie virtuala pura este o functie virtuala care
nu are definitie in clasa de baza . Pentru a declara o astfel de functie se foloseste urmatoarea
forma :
O clasa care contine cel putin o functie virtuala pura se numeste abstracta.
Declararea unei functii statice este precedata de cuvantul cheie "static". O astfel de
functie are urmatoarele restrictii :
*Ea poate sa aiba acces doar la alti membri (campuri de date/functii) de tip static ai
clasei si bineinteles la functiile si datele globale.
*Nu poate exista o versiune static si una non-static ale aceleasi functii.
Functiile statice pot fi folosite fara a mai declara un obiect, prin intermediul operatorului
de rezolutie :: , ele fiind independente de obiect. Functiile statice si campurile de date statice au
fost create pentru a se pastra principiul incapsularii. Scopul functiilor statice este acela ca pot
"preinitializa" datele particulare de tip static, inainte de creearea efectiva a unui obiect.
9. Descrieti pe scurt diferenta dintre transferul parametrilor unei functii prin valoare si prin
referinta constanta.
-3-
transmisa ca referinta constanta nu va fi modificata .
Obiectele se pot crea dinamic folosind instructiunea "new" pentru alocarea memoriei in
momentul executiei in heap. Constructorul initializeaza zona de memorie alocata. Eliberarea
memoriei alocata astfel se poate face cu ajutorul instructiunii "delete". Cand un obiect este
creat dinamic, metodele si campurile de date se acceseaza cu ajutorul operatorului "->" si nu cu
ajutorul operatorului "." .
-4-
* In cazul mostenirii ordinea de executie a destructorilor este inversa ordinii de executie
a constructorilor (adica de la clasele derivate spre clasa de baza).
* Destructorul se apeleaza automat in momentul iesirii din blocul in care a fost declarat
obiectul.
14. Descrieti diferenta dintre transferul parametrilor unei functii prin pointeri si prin
referinta.
15. Descrieti pe scurt cum este implementat mecanismul de control al tipului in timpul
executiei (RTTI).
Clasa reprezinta un tip abstract de date , format din campuri de date ( structuri de date )
si metode ( functii/algoritmi ), in timp ce, un obiect este o instanta a unei clase.
-5-
17. Descrieti pe scurt functiile sablon si dati exemplu de trei situatii in care un apel de functie
nu genereaza o versiune a functiei dintr-un sablon disponibil pentru functia respectiva .
Trei situatii in care un apel de functie nu genereaza o versiune a functiei dintr-un sablon:
*Cand functia sablon are in lista de parametrii doi parametrii de tipul sablonului , iar noi
apelam functia pentru doua tipuri de date diferite.
*Cand functia sablon are in lista de parametrii un parametru de tipul sablonului si cand
mai avem o functie definita cu acelasi nume si un tip specificat , atunci se va executa functia cu
tipul deja specificat.
*Cand functia sablon are in lista de parametrii doi parametrii de tipul sablonului, iar noi
apelam functia pentru un tip si un pointer la acel tip.
-6-
19. Descrieti pe scurt diferenta dintre functiile care returneaza valoarea si cele care
returneaza referinta
20. Descrieti pe scurt cum se pot defini functii de conversie intre tipuri (clase).
Avem situatia urmatoare : B - tip de date deja existent (clasa sau tip predefinit) si
definim o clasa noua A .
21. Spuneti care este diferenta dintre clasa generica (template) si clasa abstracta si in ce
situatii se foloseste fiecare dintre ele.
O clasa generica este o clasa care defineste toti algoritmii definiti de ea , dar tipul de
date care este manevrat efectiv va fi specificat ca un parametru la crearea obiectului acelei
clase. Forma generala a declararii unei clase generice este : template<class Tip>class nume-
clasa{ ....} . Odata ce am construit o clasa generica putem crea un anumit exemplar al acesteia
folosind forma generala : nume-clasa<tip>ob;. Pe de alta parte clasa abstracta este o clasa in
care avem cel putin o metoda virtuala pura. O alta diferenta este ca clasa generica reprezinta o
metoda a polimorfismului de compilare , in timp ce clasa abstracta reprezinta o metoda a
polimorfismului de executie. O clasa abstracta constituie un tip incomplet care este folosit ca
fundament pentru clasele derivate. Clasele generice sunt folositoare cand o clasa contine
caracteristici generale.
-7-
22. Descrieti pe scurt diferenta dintre transferul prin valoare si transferul prin referinta al
parametrilor in cazul apelului unei functii.
23. Spuneti care este diferenta dintre incluziunea de clase si mostenirea de clase si cand se
foloseste fiecare metoda.
Mostenirea este mecanismul prin care o clasa noua este creata prin preluarea tuturor
elementelor unei clase existente si adaugarea unor elemente noi specifice. Clasa de la care se
pleaca se numeste clasa de baza, iar clasa la care se ajunge se numeste clasa derivata. La
derivare putem asocia clasei de baza un atribut de acces : public (elementele din clasa de baza
isi pastreaza atributele de acces in clasa derivata), private ( elementele din clasa de baza devin
private in clasa derivata ) si protected (elementele publice din clasa de baza devin protected in
clasa derivata). Incluziunea de clase se manifesta atunci cand intr-o clasa avem campuri de date
de tipul altor clase. Mostenirea se foloseste cand vrem ca o clasa sa incorporeze in declararea
sa alta clasa, astfel v-om construi o ierarhie de clase, in timp ce incluziunea este folosita cand
vrem ca doar anumite parti a unei clase deja existente sa fie incluse in declararea unei clase noi.
Observatie : Incluziunea -> verbul “a avea” ; Mostenire -> verbul “a fi”.
24. Descrieti pe scurt constructorul de copiere si situatiile in care acesta este folosit.
-8-
25. Spuneti daca o variabila constanta poate fi transmisa ca parametru al unei functii si daca
da in ce situatii. Justificati.
O variabila constanta poate fi transmisa ca parametru al unei functii doar cand tipul
parametrului functiei nu este de tip referinta neconstanta si cand nu este de tip neconstant ,
deoarece in momentul in care unul dintre parametrii functiei este de tipul mentionat atunci am
avea in primul caz : convertirea unei variabile constante la o referinta neconstanta (eroare) , iar
in al doilea caz : se apeleaza constructorul de copiere care este de tipul A(A &a) , deci din nou
va fi aceeasi eroare.
Este posibil sa permitem unei functii care nu este membru sa aiba acces la membri
paritculari ai unei clase folosint un friend ( o functie prietena ). O functie friend are acces la
membrii private si protected ai clasei careia ii este prietena . Pentru a declara o functie friend
includem prototipul ei in acea clasa precedat de cuvantul cheie friend .
* Nu putem modifica numarul operanzilor unui operator existent si nici sintaxa lor.
* Exista operatori care nu se pot supraincarca (exemplu: “.”, “::”, “?:” ,”.*”.)
-9-
28. Descrieti trei metode de proiectare diferite prin care elementele unei clase se pot regăsi
în dublu exemplar, sub diverse forme, în definitia altei clase.
* mostenire multipla, nevirtuala (cand mostenesti o clasa si inca una care e derivata din
prima clasa mostenita)
* prin compunere (poti sa ai doua obiecte din doua clase diferite care mostenesc
aceeasi clasa de baza
* Sabloane
-10-