POO

15
PROGRAMARE ORIENTATĂ PE OBIECT TEMA 1

description

poo

Transcript of POO

Page 1: 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

Page 2: POO

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

Page 3: POO

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);

Page 4: POO

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

Page 5: POO

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; 

Page 6: POO

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

Page 7: POO

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.

Page 8: POO

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.

Page 9: POO

  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>

Page 10: POO

#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

Page 11: POO

3. Manual informatică clasa a X – a și clasa a IX - a