POO
-
Upload
cristinazaharia865440 -
Category
Documents
-
view
17 -
download
0
description
Transcript of POO
PROGRAMARE ORIENTATĂ PE OBIECT
TEMA 1
Variabilele pot fi statice sau dinamice. Cele statice au o zonă de memorie bine
definită. Structura, locul, tipul acestei zone nu poate fi schimbată în procesul execuţiei
programului. Accesul la variabilele statice se face direct, după nume. Structurile statice de
date au un număr fix de elemente, care nu poate fi modificat. Alocarea memoriei se face într-
un spaţiu strict determinat al memoriei, care permite adresarea directă.
O altă categorie de variabile, accesibile în limbajul Pascal este cea dinamică. Pentru
acest tip de variabile poate fi modificat volumul de memorie rezervat, ceea ce face mai
flexibilă alocarea memoriei în procesul de lucru al programului. Structurile dinamice pot
acumula elemente în procesul de funcţionare al programului, sau pot lichida elementele ce au
devenit neutilizabile. Accesul la aceste variabile şi declararea lor se face în mod diferit de cel
al variabilelor statice. Accesarea (definirea) este indirectă, prin intermediul unui tip mediator
de variabile – tipul referinţă.
Variabile de tip referinţă conţin referiri (adresări indirecte) la variabilele dinamice.
Referirea se realizează prin memorarea în variabila referinţă a adresei unde e stocată variabila
dinamică.
Pentru variabilele tip referinţă se alocă un spaţiu de memorie de 4 octeţi, care conţin
adresa variabilei dinamice. Memoria pentru variabilele dinamice se alocă dintr-o zonă
specială, care foloseşte adresarea indirectă, numită heap. Această zonă este diferită de zona
pentru variabilele statice.
Variabilele dinamice ocupă un spaţiu de memorie în corespundere cu tipul lor:
integer, real, string.
Fiecărui obiect dintr-un program (variabilă, constantă, funcţie), i se alocă un spaţiu
de memorie exprimat în număr de locaţii (octeţi, bytes), corespunzător tipului de date prin
care a fost definit obiectul respectiv. Localizarea (găsirea) unui obiect în memorie se face
prin intermediul adresei la care a fost memorat.
Adresa este un număr întreg, fără semn si reprezintă numărul de ordine al unei locaţii
de memorie; în C adresele sunt de regulă de tip long int, domeniul int fiind insuficient.
Un pointer este o variabilă care are ca valori adrese. Se utilizează pentru a face
referire la datele cunoscute prin adresele lor.
exemple: int *p, x, y;
x=1;
p=&x; // adresa lui x
y=*p; // y=x * p – valoarea de la adresa
În cazul în care dorim ca un pointer să fie utilizat cu mai multe tipuri de date, declarația este:
void*nume; .
Multe aplicații pot fi optimizate dacă memoria necesară stocării datelor lor este
alocată dinamic în timpul execuției programului. Alocare dinamică de memorie înseamnă
alocarea de zone de memorie și eliberarea lor în timpul execuției programelor, în momente
stabilite de programator. Zona de memorie în care se alocă, la cerere, datele dinamice este
diferită de zona de memorie în care se alocă datele statice(stiva de date) și se numește heap.
Spațiul de memorie alocat dinamic este accesibil programatorului prin pointeri care conțin
adresa sa. Pointerul care indică un obiect din heap este de regulă stocat într-o variabilă
alocată static. Funcțiile de gestionare a memoriei alocate dinamic au prototipurile în fișierele
header alloc.h și stdlib.h.
Funcția de alocare dinamică a memoriei (malloc)
void * malloc(size_t size);
Funcția alocă în heap un bloc de dimensiune size; dacă operația reușește returnează un
pointer la blocul alocat, altfel returnează NULL. Este posibil ca cererea de alocare să nu
poată fi satisfăcută dacă nu mai există suficientă memorie în zona de heap sau nu există un
bloc compact de dimensiune cel puțin egală cu size. Dimensiunea size se specifică în octeți.
Rezultatul funcției malloc este un pointer de tip void. Se va folosi operatorul cast pentru
conversii de tip la atribuire.
Alocarea dinamică a unei zone pentru o valoare de tip int :
int * ip;
ip=(int * )malloc(sizeof(int));
*ip=5;
Funcția de eliberare dinamică a memoriei (free)
void free(void * block);
Funcția eliberează blocul alocat anterior cu malloc, având pointerul transmis ca parametru.
Transferul unei valori invalide (un pointer la un bloc de memorie care nu a fost rezultatul
unui apel al funcției malloc) poate compromite funcționarea sistemului de alocare.
Chiar dacă variabila pointer care indică o astfel de zonă de memorie nu mai există (și-a
depășit domeniul de viață) zona alocată rămâne în continuare ocupată, devenind însă
inaccesibilă pentru program.
Eroare frecventă de acest gen poate apare la utilizarea variabilelor dinamice în cadrul
funcțiilor:
void fct() {
int * p;
p=(int *)malloc(10* sizeof(int)); }
Operatorii sunt simboluri utilizate pentru precizarea oparatiilor care trebuie executate asupra
operanzilor.
Operanzii pot fi constante, variabile, nume de functii, expresii.
Expresiile sunt entitati construite cu ajutorul operanzilor si operatorilor, respectand sintaxa si
semantica limbajului. Cea mai simpla expresie este cea formata dintr-un singur operand.
Clasificarea operatorilor:
dupa numarul operanzilor prelucrati:
o unari
o binari
o ternari - cel conditional; alte limbaje de nivel inalt nu definesc astfel de
operatori
dupa ordinea de succedare a operatorilor si operanzilor:
o prefixati
o infixati
o postfixati
dupa tipul operanzilor si al prelucrarii:
o aritmetici
o relationali
o logici
o la nivel de bit.
Operatorii se impart in clase de precedenta, fiecare clasa avand o regula de asociativitate,
care indica ordinea aplicarii operatorilor consecutivi de aceeasi precedenta ( prioritate ).
Spre deosebire de alte limbaje in care atribuirea este o instructie, in limbajul C se
defineste operatorul de atribuire =.
Aceste este binar si are o prioritate scazuta, mai mare doar decat a operatorului secvential;
regula de asociativitate este de la dreapta spre stanga, iar sintaxa este:
variabila=expresie
Expresia este evaluata, apoi rezultatul ei este memorat in variabila si este furnizat si ca efect
lateral, astfel incat poate fi utilizat.
Exemple:
int i,j,k;
i=j=k=0; // efectul lateral este folosit, variabilele sunt initializate cu aceeasi valoare, 0
// secventa urmatoare calculeaza baza si volumul unui paralelipiped
float lungime,latime,inaltime,baza,volum;
volum=inaltime*(baza=lungime*latime);
Limbajul C defineste operatorii de atribuire compusi, care permit o scriere mai compacta a
atribuirilor de forma:
variabila=variabila op expresie
prin
variabila op= expresie
Se definesc astfel operatorii += -= *= /= %= &= |= ^= <<= >>= ( ultimii cinci
sunt operatori pe biti )
Exemple:
int i=3,j=9,k=11;
i+=j; // atribuirea este echivalenta cu i=i+j;
k%=j-=4; // asocierea fiind de la dreapta la stanga, prima data se calculeaza j-=4,
// deci j va fi 5, valoare care este folosita prin efect lateral pentru k%=5, deci k va fi 1
Din aceasta categorie mai fac parte si operatorii unari de incrementare si decrementare ++,
respectiv --. Pot fi utilizati ca operatori prefixati sau postfixati:
++variabila
variabila++
--variabila
variabila—
Expresiile ++variabila, variabila++ sunt echivalente cu variabila+=1, dar efectul lateral la
preincrementare este de a furniza valoarea variabilei dupa incrementare, iar la
postincrementare valoarea furnizata este cea dinaintea incrementarii.
Interschimbarea a două numere întregi.
#include <iostream.h>
void schimbă(int *x, int *y)
{int aux;
aux=*x;
*x=* y;
*y=aux;
}
void main()
{int a=2,b=3,*pa=&a,*pb=&b;
schimbă(&a,&b);//se poate apela si astfel: schimbă(pa,pb);
cout<<endl<<a<<” “<<b;// va afisa 3 2, valorile pt a si b raman neschimbate
}
TEMA 2
Operatorii new si delete sunt similari functiilor din grupul malloc() si free(), dar constituie o
metoda noua, superioara acestora si adaptata programarii orientate pe obiecte.
Operatorul new poate fi folosit în urmatoarele situatii:
Exemplu:
int * ip1, *ip2, *ip3;
ip1=new int; // variabila întreaga neinitializata
ip2=new int(2); // variabila întreaga initializata cu 2
ip3=new int[100]; // tablou de 100 de întregi
Operatorul new poate fi folosit si la alocarea dinamica a obiectelor, în cazul acesta permitând
apelarea constructorului clasei.
Operatorul delete este complementarul lui new si înlocuieste functia free() de dezalocare a
memoriei dinamice alocate. Daca exista un destructor pentru obiectul care se dezaloca, acest
destructor va fi apelat automat de catre delete.
Constructori
Constructorii sunt metode speciale care folosesc la crearea si initializarea instantelor
unei clase.Programatorul poate defini un constructor.
În absența altor definitii, clasei i se ataseaza in mod implicit un constructor. Un astfel
de constructor se numeste constructor implicit.
Constructorii impliciti nu au parametri
Constructorii impliciti nu se genereaza in cazul in care clasa are atasat un alt
constructor (asadar constructorii impliciti sunt constructori fara parametri generati
automat de limbaj daca programatorul nu si-a definit unul).
Constructorii au acelasi nume ca si clasa careia îi apartin
Constructorii sunt apelati de fiecare data când se creaza noi instante ale clasei.
Cum am mai spus, programatorul isi poate defini constructori proprii. Constructorii vor fi
definiti ca niste functii fara tip, fara a se trece in dreptul constructorului cuvantul cheie void.
Constructorul va avea acelasi nume ca si al clasei careia ii apartine.
O clasa poate avea mai multi constructori, care difera între ei prin numarul si tipul
parametrilor acestora. Acest lucru este posibil deoarece limbajul C++ permite supradefinirea
( supraincarcarea=overloading) functiilor.
Supraîncarcarea (supradefinirea) reprezinta posibilitatea de a atribui unui nume mai multe
semnificatii, care sunt selectate în functie de context. Practic, se pot defini functii cu acelasi
nume, dar cu liste de parametri diferite, ca numar si/sau ca tipuri de parametri. În momentul
apelului functiei, selectarea functiei adecvate se face în urma compararii tipurilor
parametrilor efectivi cu tipurile parametrilor formali. De aceea, declararea unor functii cu
acelasi nume si acelasi set de parametri este ilegala si este semnalata ca eroare la compilare.
La întâlnirea declararii unui obiect, se apeleaza automat un constructor al clasei respective.
La fiecare instantiere a clasei se aloca memorie pentru datele membre. Deci pentru fiecare
obiect declarat se aloca memorie pentru datele membre ale clasei. Functiile membru exista
într-un singur exemplar pentru toate instantele clasei.
Ordinea în care sunt apelati constructorii corespunde ordinii declararii obiectelor.
Proprietatile constructorilor:
Constructorii au același nume ca si numele clasei careia îi apartin;
Nu întorc nici o valoare (din corpul lor lipseste intructiunea return; în antetul
constructorilor nu se specifica niciodata - la tipul valorii returnate - cuvântul cheie
void);
Constructorii unei clase nu pot primi ca parametri instante ale unei clase, ci doar
pointeri sau referinte la instantele clasei respective;
Apelul constructorului se realizeaza la declararea unui obiect;
Adresa constructorilor nu este accesibila utilizatorului;
Constructorii nu pot fi metode virtuale (vor fi studiate ulterior);
În cazul în care o clasa nu are nici constructor declarat de catre programator,
compilatorul genereaza un constructor implicit, fara nici un parametru, cu lista
instructiunilor vida. Daca exista un constructor, compilatorul nu mai genereaza
constructorul implicit ;
Parametrii unui constructor nu pot fi de tipul definit de clasa al carei membru este
constructorul.
Destructori
Destructorii sunt metode ale claselor care actioneaza în sens invers, complementar, fata de
constructori. Constructorii sunt folositi pentru alocarea memoriei, initializarea datelor
membru sau alte operatii (cum ar fi, incrementarea unui contor pentru instantele clasei).
Constructorul este apelat în momentul declararii obiectelor.
Destructorul elibereaza memoria alocata de constructori. Destructorul este apelat automat, la
iesirea din blocul în care este recunoscut acel obiect.
Proprietatile destructorilor
Destructorul are acelasi nume ca si clasa a caror metoda este;
Numele destructorului este precedat de semnul ~;
O clasa are un singur destructor;
Destructorul nu are parametri si nu returneaza nici o valoare (antetul nu contine
cuvântul cheie void, iar în corpul destructorului nu apare instructiunea return;);
Daca programatorul nu a definit un destructor, compilatorul genereaza automat un
destructor pentru clasa respectiva;
Destructorii se apeleaza la încheierea timpului de viata a obiectelor, în ordine inversa
apelurilor constructorilor;
Obiectele dinamice nu se distrug automat, deoarece doar programatorul stie când nu
mai este necesar un astfel de obiect.
Problema
Definiți un obiect de tip matrice și realizați alocarea dinamică și eliberarea memoriei.
#include<iostream.h>
#include<conio.h>
const MAX_RANG=10; /*Rangul maxim pe care il poate avea matricea*/
int matrice[MAX_RANG][MAX_RANG],n;
void afisare_matrice(void){
cout<<"a) Afisare matrice introdusa"<<endl;
for(int i=0; i<n;i++) {
for(int j=0;j<n;j++)
cout<<matrice[i][j]<<" ";
cout<<endl;}
}
Bibliografie
1. materialul de la curs
2. timsoft.ro
3. Manual informatică clasa a X – a și clasa a IX - a