curs3-POO2013.pdf
-
Upload
corinutza260 -
Category
Documents
-
view
222 -
download
0
Transcript of curs3-POO2013.pdf
-
7/24/2019 curs3-POO2013.pdf
1/57
LECTOR DR. ADRIAN RUNCEANU
Programare orientat peobiecte
UniversitateaConstantin Brncui din Trgu-Jiu
Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
-
7/24/2019 curs3-POO2013.pdf
2/57
14.10.2013Programare orientat pe obiecte C++/Java
2
Curs 3
-
7/24/2019 curs3-POO2013.pdf
3/57
Curs 3
14.10.2013Programare orientat pe obiecte C++/Java
3
1. Tablouri de obiecte2. Membrii statici ai unei clase
3. Manevrarea dinamica aobiectelor4. Pointerii catre membrii unei
clase
-
7/24/2019 curs3-POO2013.pdf
4/57
1.Tablouri de obiecte
14.10.2013Programare orientat pe obiecte C++/Java
4
La fel cum exista posibilitatea de a creatablouri de structuri, tot astfel existaposibilitatea de a crea si tablouri de obiecte.
De exemplu, putem avea un triunghi vazutca un vector de trei puncte:
Punct triunghi[3];
-
7/24/2019 curs3-POO2013.pdf
5/57
14.10.2013Programare orientat pe obiecte C++/Java
5
Putem de asemenea, initializa acest vectorchiar pe linia de declarare:
Punct triunghi[3] = { {0,0}, {20,30}, {40,70} };In plus, putem initializa un tablou de obiecte
chiar in cadrul declararii sale:
Punct triunghi[3] = {
Punct (1,2),Punct(30,90),Punct (40,40)
};
1.Tablouri de obiecte
-
7/24/2019 curs3-POO2013.pdf
6/57
14.10.2013Programare orientat pe obiecte C++/Java
6
unde clasa Punctare urmatoarea declaratie:
class Punct {
public:
int x,y;
Punct(int x1, int y1)
{ x=x1; y=y1; }
Punct(int x1)
{ x=x1; y=x1; }
};
1.Tablouri de obiecte
-
7/24/2019 curs3-POO2013.pdf
7/57
Curs 3
14.10.2013Programare orientat pe obiecte C++/Java
7
1. Tablouri de obiecte2. Membrii statici ai unei clase3. Manevrarea dinamica a
obiectelor4. Pointerii catre membrii unei
clase
-
7/24/2019 curs3-POO2013.pdf
8/57
2. Membri statici ai unei clase
14.10.2013Programare orientat pe obiecte C++/Java
8
Spre deosebire de auto, register siextern, cuvantul cheie staticpoate fi utilizat inprefixarea membrilor unei clase.
Evident ca, odata declarat static, membrulrespectiv va avea proprietati diferite de membriiobisnuiti (ne-statici).
Aceste proprietati apar datorita faptului ca
membrii statici nu apartin unui obiect anume, eifiind sunt comuni tuturor instantierilor(obiectelor)unei clase.
-
7/24/2019 curs3-POO2013.pdf
9/57
14.10.2013Programare orientat pe obiecte C++/Java
9
Sunt situatii de programare cand sedoreste ca un singur spatiu de memorie sa
fie utilizat de toate obiecte unei clase.In limbajul C++, am putea utiliza o
variabila globala, dar acest lucru nu este
chiar sigur.
2. Membri statici ai unei clase
-
7/24/2019 curs3-POO2013.pdf
10/57
14.10.2013Programare orientat pe obiecte C++/Java
10
Variabilele globale pot fi modificate decatre oricine, iar numele lor se potpotrivi(suprapune) cu alte nume identice
in cazul unui proiect mai mare.Ar fi ideal ca o variabila (data,
informatie) sa poata sa fie stocata
(memorata) ca si cum ar fi globala, darsa fie ascunsa intr-o clasa, si asociataclar cu o clasa.
2. Membri statici ai unei clase
-
7/24/2019 curs3-POO2013.pdf
11/57
14.10.2013Programare orientat pe obiecte C++/Java
11
Acest aspect se poate rezolvafolosind date membre ntr-o variabilde tip staticn interiorul unei clase:
Declararea unei date statice se face ninteriorul unei clase,iar definiia trebuie s se fac n afara
clasei (nu se accept funcii inline nacest caz) i este permisdoar o singurdefiniie.
2. Membri statici ai unei clase
-
7/24/2019 curs3-POO2013.pdf
12/57
14.10.2013Programare orientat pe obiecte C++/Java
12
Sintaxa declarri unei date statice esteobinuit:
De exemplu:
class A {staticint i;
public:
// . . . .};
2. Membri statici ai unei clase
-
7/24/2019 curs3-POO2013.pdf
13/57
14.10.2013Programare orientat pe obiecte C++/Java
13
iar mai tarziu, definiia:int A::i=1;
Este asemntoare cu declararea unei
variabile globale:int i=1;
doar c n cazul claselor se folosete
prefixarea obiectului cu operatorul derezoluie specificA::i.
2. Membri statici ai unei clase
-
7/24/2019 curs3-POO2013.pdf
14/57
14.10.2013Programare orientat pe obiecte C++/Java
14
Se poate induce ideea cA::i esteprivate i totui poate fi manipulat nafar, de unde s-ar putea trageconcluzia cmecanismul proteciei ar finclcat.
Totui nu este aa, din doumotive:
2. Membri statici ai unei clase
-
7/24/2019 curs3-POO2013.pdf
15/57
14.10.2013Programare orientat pe obiecte C++/Java
15
1. n primul rand, este singurul loc unde aceastainitializare este acceptata de compilator.
Intr-adevar daca o variabila statica ar avea un constructoratasat, am putea chema constructorul pentru crearea sa in loc
sa utilizam operatorul =.2. n al doilea rand, odata ce a fost facuta definitia,
utilizatorul nu mai poate crea o a doua definitie,deoarece link-editorul va raporta o eroare.
si atunci creatorul clasei este fortat sa creeze definitia, altfelnu se va face legatura in timpul executiei programului.
Acest aspect ne asigura ca aceasta definitie se poate facedoar de catre creatorul clasei respective.
2. Membri statici ai unei clase
-
7/24/2019 curs3-POO2013.pdf
16/57
14.10.2013Programare orientat pe obiecte C++/Java
16
Exemplu:#includeint x=100; // variabila globala xclass cu_static{
staticint x; // informatie protejata xstaticint y; // informatie protejata ypublic:
void afiseaza(){
cout
-
7/24/2019 curs3-POO2013.pdf
17/57
14.10.2013Programare orientat pe obiecte C++/Java
17
int cu_static::x=1; // definitia informatiei are loc inafara clasei
int cu_static::y=x+1; // definitia informatiei are loc inafara clasei
int main(){
cu_static a;a.afiseaza();
cout
-
7/24/2019 curs3-POO2013.pdf
18/57
14.10.2013Programare orientat pe obiecte C++/Java
18
Dupa executia programului se va afisa:
cu_static::x = 1cu_static::y = 2variabila globala x = 100
2. Membri statici ai unei clase
-
7/24/2019 curs3-POO2013.pdf
19/57
Curs 3
14.10.2013Programare orientat pe obiecte C++/Java
19
1. Tablouri de obiecte2. Membrii statici ai unei clase3. Manevrarea dinamica a
obiectelor4. Pointerii catre membrii unei
clase
-
7/24/2019 curs3-POO2013.pdf
20/57
3. Manevrarea dinamica a obiectelor
14.10.2013Programare orientat pe obiecte C++/Java
20
Obiectele, ca si celelalte tipuri de date ale limbajuluiC++, pot fi alocate dinamic, adica se poate alocamemorie doar in timpul executiei programului.
In limbajul C, pentru aceste actiuni puteam folosifunctii predefinite, din fisierul alloc.h calloc(),malloc(), realloc() si free(). Dintre acestea cele maiutilizate sunt malloc()sifree().
In limbajul C++, echivalentul celor doua functiispecificate mai sus sunt cei doi operatori new sidelete.
-
7/24/2019 curs3-POO2013.pdf
21/57
14.10.2013Programare orientat pe obiecte C++/Java
21
3.1 Operatorul newAvantajul acestui operator, fa de funcia
malloc()constn douaspecte:
1. new stie ct memorie trebuie alocatoricrui tip de variabil, spre deosebire defuncia malloc(), unde trebuia s specificeutilizatorul aceastdimensiune;
2. new poate produce apelul unui constructor,n timp ce malloc() nu are aceastproprietate.
3. Manevrarea dinamica a obiectelor
-
7/24/2019 curs3-POO2013.pdf
22/57
14.10.2013Programare orientat pe obiecte C++/Java
22
Exemple:
Operatorul newse poate utiliza si pentrudeclararea de tablouri:int *p=new int[10];
// varianta C
int *pointer=(int*)malloc(sizeof(int));
// varianta C++
int *pointer= new int;
3. Manevrarea dinamica a obiectelor
-
7/24/2019 curs3-POO2013.pdf
23/57
14.10.2013Programare orientat pe obiecte C++/Java
23
Folosind acest operator la clase se pot faceurmatoarele tipuri de declarari:
Punct *p=new Punct(20,20);
Efectul este rezervarea de memorie pentruobiectul specificat (Punct), dupa care se va apelaconstructorul obiectului.
Asemanator se poate declara un tablou de
obiecte:Punct *poligoane=new Punct[10];
3. Manevrarea dinamica a obiectelor
-
7/24/2019 curs3-POO2013.pdf
24/57
14.10.2013Programare orientat pe obiecte C++/Java
24
3.2 Operatorul delete Operatorul deleteeste analogul functiei free()din
limbajul C, si are ca efect eliberarea spatiului dememorie ocupat cu ajutorul operatorului new.
Asa cum operatorul new este utilizat de obicei ininteriorul constructorilor, tot asa si operatoruldeleteva fi utilizat in interiorul destructorilor.
Cu toate ca delete permite eliberarea selectiv aspatiului alocat, acest operator nu este la fel deputernic la operatorul new.
3. Manevrarea dinamica a obiectelor
-
7/24/2019 curs3-POO2013.pdf
25/57
14.10.2013Programare orientat pe obiecte C++/Java
25
Din urmatorul exemplu, am puteatrage concluzia falsa ca folosirea
operatorului delete va conduce laeliberarea spatiului de memorie alocatpentru intreg tabloul de numere:
int *m=new int[10];delete m;
3. Manevrarea dinamica a obiectelor
-
7/24/2019 curs3-POO2013.pdf
26/57
14.10.2013Programare orientat pe obiecte C++/Java
26
De fapt, s-a eliberat spatiul dememorie doar pentru un singur numarintreg m[0], restul ramanand ocupat.
Pentru eliberarea completa aintregului spatiu alocat cu operatorulnew, trebuie sa folosim operatorul
deleteastfel:int *m=new int[10];delete[] m;
3. Manevrarea dinamica a obiectelor
-
7/24/2019 curs3-POO2013.pdf
27/57
Curs 3
14.10.2013Programare orientat pe obiecte C++/Java
27
1. Tablouri de obiecte2. Membrii statici ai unei clase3. Manevrarea dinamica a
obiectelor4. Pointerii catre membrii unei
clase
-
7/24/2019 curs3-POO2013.pdf
28/57
4. Pointeri catre membrii unei clase
14.10.2013Programare orientat pe obiecte C++/Java
28
Unpointer este o variabila care retineadresa unei anumite zone de memorie, incare poate fi ori o data(informatie), ori o
functie.In limbajul C++, un pointer catre un
membru al unei clase urmeaza acelasi
principiu, cu exceptia faptului ca selecteaza olocatie din interiorul unei clase.
-
7/24/2019 curs3-POO2013.pdf
29/57
14.10.2013Programare orientat pe obiecte C++/Java
29
Problema ar putea fi faptul ca totipointerii au o adresa, dar in interiorulunei clase nu exista o adresa, de undeselectarea unui membru sa fie posibila.
Astfel pointerul respectiv nu va contineadresa de memorie a intregii clase, cinumai deplasarea datei in cadruloricarui obiect al clasei.
4. Pointeri catre membrii unei clase
-
7/24/2019 curs3-POO2013.pdf
30/57
14.10.2013Programare orientat pe obiecte C++/Java
30
Pentru operatii cu pointeri exista cateva reguli desintaxa:
pentru preluarea adresei unui membru se poate folosioperatorul & urmat de numele clasei, operatorul derezolutie si numele membrului:
pointer_membru=&clasa::membru;
pentru accesul la un membru dupa preluarea adresei,
trebuie indicat un obiect al clasei si numele variabileipointer, folosind unul dintre operatorii specializati: operatorul .* daca se specifica un obiect al clasei operatorul ->*daca se specifica un pointer de obiect
4. Pointeri catre membrii unei clase
-
7/24/2019 curs3-POO2013.pdf
31/57
14.10.2013Programare orientat pe obiecte C++/Java
31
Sintaxa este urmatoarea:obiect.*pointer
saupointer_obiect ->*
pointer_membru
4. Pointeri catre membrii unei clase
-
7/24/2019 curs3-POO2013.pdf
32/57
14.10.2013Programare orientat pe obiecte C++/Java
32
Pentru exemplificare prezentam oclasa numita pozitie care se folosestepentru a stabili pozitia unui punct in
plan:#includeclass pozitie{
public:int x,y; //coordonatele unui punct
4. Pointeri catre membrii unei clase
-
7/24/2019 curs3-POO2013.pdf
33/57
14.10.2013Programare orientat pe obiecte C++/Java
33
// functii membrepozitie(int abcisa=0, int ordonata=0) // constructor
{x = abcisa;
y = ordonata;cout
-
7/24/2019 curs3-POO2013.pdf
34/57
14.10.2013Programare orientat pe obiecte C++/Java
34
void afisare() // afisarea coordonatelor{
cout
-
7/24/2019 curs3-POO2013.pdf
35/57
14.10.2013Programare orientat pe obiecte C++/Java
35
int main(void){
pozitie p(1,1); // declarare obiectpozitie *pointer; // declarare pointer catre un obiect
int pozitie::x_pointer, pozitie::y_pointer;void (pozitie::*pointer_functie)(int,int); //declarare pointer catre o functie din clasa resp.
pointer=&p; // initializarea pointerului resp. cu adresa
obiectului pe care il prelucreazax_pointer=&pozitie::x;// initializarea var. din pointercu adresa unei informatii din interiorul clasei
y_pointer=&pozitie::y; // initializarea var. din pointercu adresa unei informatii din interiorul clasei
4. Pointeri catre membrii unei clase
-
7/24/2019 curs3-POO2013.pdf
36/57
14.10.2013Programare orientat pe obiecte C++/Java
36
pointer_functie=pozitie::deplasare;(p.pointer_functie)(10,10);cout
-
7/24/2019 curs3-POO2013.pdf
37/57
14.10.2013Programare orientat pe obiecte C++/Java
37
Problema rezolvataTablouri de dimensiune
variabilaUrmatoarea problema rezolvataprezinta o modalitate de creare a
unor tablouri de dimensiunivariabile.
4. Pointeri catre membrii unei clase
-
7/24/2019 curs3-POO2013.pdf
38/57
14.10.2013Programare orientat pe obiecte C++/Java
38
Tipul de date il numim array(vector=sir) si contine:
1. un constructor care creeaza siinitializeaza tablourile
2. un destructor elibereaza memoriaalocata pentru un tablou
3. o procedura de concatenare a douatablouri
4. Pointeri catre membrii unei clase
-
7/24/2019 curs3-POO2013.pdf
39/57
14.10.2013Programare orientat pe obiecte C++/Java
39
#include#include#includeclass array{
int *pointer; // pointer la tablou=arrayint dimensiune; // dimensiunea tablouluivoid print(void); // afiseaza tabloululvoid test(void *); // testeaza daca s-a alocat corectmemoria
4. Pointeri catre membrii unei clase
-
7/24/2019 curs3-POO2013.pdf
40/57
14.10.2013Programare orientat pe obiecte C++/Java
40
public:array(int); //constructor~array(void) //destructor{
delete[dimensiune] pointer;}
void concatenare(array &);//metoda(procedura) de concatenare
int cauta(array &); // metoda pentrucautarea unui element
};
4. Pointeri catre membrii unei clase
-
7/24/2019 curs3-POO2013.pdf
41/57
14.10.2013Programare orientat pe obiecte C++/Java
41
// procedura de test// Testeaza valoarea unui pointer pentru care s-a alocat
dinamic memorie.// Daca pointer-ul este setat la NULL inseamna ca
operatia de alocare dinamica a memoriei nu s-a
efectuat corectvoid array::test(void *p){
if(p==NULL){
cout
-
7/24/2019 curs3-POO2013.pdf
42/57
14.10.2013Programare orientat pe obiecte C++/Java
42
// se creeaza un tablou de intregi cu "numar_elem" elemente.// Initializarea tabloului cu valori citite de la tastatura.
array::array(int numar_elem){
cout
-
7/24/2019 curs3-POO2013.pdf
43/57
14.10.2013Programare orientat pe obiecte C++/Java
43
// afiseaza elementele dintr-un tablouvoid array::print(void){
cout
-
7/24/2019 curs3-POO2013.pdf
44/57
14.10.2013Programare orientat pe obiecte C++/Java
44
// concateneaza tablou care a apelat metoda cu cel primit caparametru
// (prin referinta); rezultatul se va pastra in obiectul care a apelatmetoda.
void array::concatenare(array &referinta_array)
{int *temp;int dimensiune_finala;
// calcularea noii dimensiuni a tabloului rezultat
dimensiune_finala=dimensiune+referinta_array.dimensiune;
// alocare memorie necesara
temp=new int[dimensiune_finala];test((void*) temp);
4. Pointeri catre membrii unei clase
-
7/24/2019 curs3-POO2013.pdf
45/57
14.10.2013Programare orientat pe obiecte C++/Java
45
// copierea celor doi "operanzi" in cadrul "rezultatului"for(int i=0;i
-
7/24/2019 curs3-POO2013.pdf
46/57
14.10.2013Programare orientat pe obiecte C++/Java
46
int main(void){
array a(6);array b(4);int i;cout
-
7/24/2019 curs3-POO2013.pdf
47/57
14.10.2013Programare orientat pe obiecte C++/Java
47
Daca se introduc valorile:1, 2, 3, 4, 5, 6 pentru tabloul a,respectiv valorile 7, 8, 9, 10 pentru tabloulb
si valorile 11, 22, 33, 44 pentru tabloul cVom obtine:a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} in prima faza,
iar apoia = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 22, 33, 44}.
4. Pointeri catre membrii unei clase
-
7/24/2019 curs3-POO2013.pdf
48/57
Exemplu de aplicaie
14.10.2013Programare orientat pe obiecte C++/Java
48
AplicaierezolvatS se defineasc tipul abstract de date
complex care s aib funcii membru
pentru:1. modulul unui numar complex2. accesul la partea real i imaginar a
obiectelor de tip complex3. afiarea obiectelor complexe4. constructori pentru iniializare i copiere
-
7/24/2019 curs3-POO2013.pdf
49/57
14.10.2013Programare orientat pe obiecte C++/Java
49
S se scrie un program care srealizeze urmtoarele:
Citete perechi de n numere care
reprezint fiecare, partea real irespectiv imaginar a unui numrcomplex
Afieaz:1. numrul complex citit2. suma numerelor complexe citite
Exemplu de aplicaie
-
7/24/2019 curs3-POO2013.pdf
50/57
14.10.2013Programare orientat pe obiecte C++/Java
50
#include#include#define PI 3.14159265358979
class complex{
// date membru protejate(private)
double real;
double imag;
Exemplu de aplicaie
-
7/24/2019 curs3-POO2013.pdf
51/57
14.10.2013Programare orientat pe obiecte C++/Java
51
// funcii membru neprotejatepublic:
// constructor folosit la initializare
complex(double x=0, double y=0);
// constructor de copiere
complex(const complex &);// modulul numrului complexdouble modul();// afieaznumrul complexvoid afiscomplex();
};
Exemplu de aplicaie
-
7/24/2019 curs3-POO2013.pdf
52/57
14.10.2013Programare orientat pe obiecte C++/Java
52
complex::complex(double x, double y){
real = x;imag = y;
}complex::complex(const complex &z){
real = z.real;
imag = z.imag;}
Exemplu de aplicaie
-
7/24/2019 curs3-POO2013.pdf
53/57
14.10.2013Programare orientat pe obiecte C++/Java
53
double complex::modul(){
return sqrt(real * real + imag * imag);}
void complex::afiscomplex(){
cout
-
7/24/2019 curs3-POO2013.pdf
54/57
14.10.2013Programare orientat pe obiecte C++/Java
54
int main(void){
double x, y, sumax = 0, sumay = 0, i = 0, n;coutn;while(i
-
7/24/2019 curs3-POO2013.pdf
55/57
14.10.2013Programare orientat pe obiecte C++/Java
55
// se construieste nr. complex avand partile citite mai sus;// se apeleaza constructorul care realizeaza initializarea// obiectului z=x+i*y
complex z(x,y);// afisez numarul z
cout
-
7/24/2019 curs3-POO2013.pdf
56/57
14.10.2013Programare orientat pe obiecte C++/Java
56
// se apeleaza constructorul de initializarecomplex sz = complex(sumax,sumay);
cout
-
7/24/2019 curs3-POO2013.pdf
57/57
57
ntrebri?