Sunteți pe pagina 1din 27

CLASE. MEMBRI STATICI.

FUNCII PRIETENE

CURS 4 PROGRAMARE II

CURS ANTERIOR
Clase Specificatori de acces Contructorii Destructorii Constructor de copiere

CUPRINS
Cuvntul cheie this Funcii prietene

Membri statici
Relaii ntre clase Asociere Agregare Compoziie Motenire

CUVNTUL CHEIE THIS


Cuvntul cheie this autoreferin Este un pointer accesibil doar dintr-un context non-static al unei clase, structuri sau uniuni

Pointeaz spre obiectul pentru care funcia membru este apelat


Folosirea acestuia este implicit dar se poate utiliza i explicit
// declaratii echivalente void DataCalendaristica::setLuna( int mn ) { luna= mn; this->luna = mn; (*this).luna = mn; }

CUVNTUL CHEIE THIS


Folosire explicit Identificarea obiectului curent
DataCalendaristica & copie(DataCalendaristica &c) { if (&c != this){ . } return *this; }

Rezolvarea ambiguitilor
class DataCalendaristica { int luna; }; void DataCalendaristica::setLuna( int luna) { this->luna = luna; }

FUNCII PRIETENE
Funcie prieten Funcie care are acces la membri non-publici ai unei clase Prefixate de cuvntul cheie friend Prototipul este specificat n definiia clasei Este definit n afara domeniului clasei

Sinatax
class X { friend tipReturn numeFunctie( ); }; tipReturn numeFunctie( ){ }

Prototip

Definiie

FUNCII PRIETENE EXEMPLE


Funcie de calcul al modulului unui numr complex
class Complex { private: int re, im; public: double modul(){ return sqrt(re*re + im*im);} };

Apel
Modul(c) ?
Complex c(6,7); c.modul();

FUNCII PRIETENE EXEMPLE


Funcie de calcul al modulului unui numr complex
class Complex { private: int re, im; public: }; double modul(Complex & c){ return sqrt(c.getRe()*c.getRe()*+ c.geIm()*c.getIm());}

Apel
Complex c(6,7); modul(c);

FUNCII PRIETENE EXEMPLE


Funcie de calcul al modulului unui numr complex
class Complex { private: int re, im; public: friend double modul(Complex&); }; double modul(Complex &c){ return sqrt(c.re*c.re + c.im*c.im);}

Apel
Complex c(6,7); Modul(c);

CLASE PRIETENE
Accesul este unidirecionat Daca B este un cu A, B poate accesa membri non-publici a lui A, dar A nu poate accesa B
class ArboreBinar; class Nod { private: int data; int key; . friend class ArboreBinar; }; class ArboreBinar { private: Node *root; public: int findKey(int); }; int ArboreBinar::fiind(int val) { if (val == root->key) { return root->data; } //restul cautarii }

FUNCII/CLASE PRIETENE
Utilitate Ofer un acces mai eficient la membri dect n cazul apelului de funcii Suprancrcarea operatorilor un acces mai uor la datele private Funciile/clasele prietene au acces la toi membri clasei, ceea ce violeaz ncapsularea datelor atenie la utilizare Funciile/clasele membre pot modifica starea unei clase. Recomandare: folosirea funciilor membre pentru a modifica date

MEMBRI STATICI
Date/funcii prefixate cu specificatorul static Datele statice exist ntr-o singur copie comun tuturor obiectelor Funciile statice realizeaz operaii care nu sunt asociate obiectelor individuale, ci ntregii clase Accesare Indicarea numelui clasei i folosirea operatorului de rezoluie (X::fctStatica();) Specificnd obiectul clasei i folosind operatorii de selecie (X x: x.fctStatica();)

DATE STATICE
Alocarea memoriei i iniializarea se realizeaz separat
class Test { static int contor; char * nume; int prioritate; };

int Test::contor = 10;

Se iniializeaz cu 0 nainte s se creeze primul obiect

Au aceleai proprieti ca i variabilele globale doar c sunt limitate de domeniul de vizibilitate al clasei

DATE STATICE

contor

FUNCII STATICE
Proprieti Pot accesa direct membri statici ai clasei Nu au acces la pointerul this (membri nestatic ai clasei)
Transformare apel de ctre compilator Apel funcie membr foo (7); foo(this *, 7)
Apel funcie static fooStatica (7); fooStatica( 7)

Nu poate exista o variant static i una nestatic a aceleai funcii Nu pot fi virtuale Nu pot fi declarate const sau volatile

FUNCII STATICE
Exemplu Calcul ID
class Utilizator{ private: int id; static int urmatorul_id; public: static int urmatorul_id_utilizator() { urmatorul_id ++; return urmatorul_id; } Utilizator() { id = Utilizator:: urmatorul_id ++; //or, id = urmatorul_id_utilizator(); } }; int Utilizator :: urmatorul_id = 0;

MODIFICATORUL CONST
Date constante Nu pot fi modificate Utile pentru declararea de constante Iniializarea
n lista de iniializri a constructorului clasei
class X { const int ci ; static const int MAX_VIEWS; // declaration public: X () : ci(17) { // initializarea unui membru const n interiorul unei liste de iniializare } }; // initializarea unui membru static constant const int X::MAX_VIEWS = 256;

Utile pentru a declara constante Sintax const variabil

MODIFICATORUL CONST
Funcii constante Nu pot modifica starea unui unui obiect Cod mai clar mpiedic modificrile accidentale ale datelor Sintax
class Utilizator{ private: int id; char * username; public: int getId() const { id=0; return id; } char * getUsername() const; }; char * Utilizator ::getUsername() const { return username; }

tipDeReturn numeFunctie (tipVar [, tipVar]) const;

MODIFICATORUL MUTABLE
Se aplic la membri dat Pot fi ntotdeauna modificai chiar i n funcii constante Utili pentru membri care trebuie modificai n funcii const i nu reprezint interes pentru starea intern a obiectului Sintax mutable numeVariabil;
class Utilizator{ private: mutable int nraccessari; public: int getId() const { nraccessari++; return id; } };

RELAII NTRE CLASE


Relaii dintre clase Asociere
Agregare Compoziie

Motenire

RELAII NTRE CLASE


Conceptele nu exist izolate. Ele coexist i interacioneaz La elaborarea modelului obiectual al unei aplicaii se disting urmtoarele etape: Identificarea claselor corespund conceptelor aplicaiei substantivele Stabilirea relaiilor dintre clase corespunde specificaiilor aplicaiei verbe Tipuri de relaii Asociere o relaie n care obiectele unei clase tiu de obiectele altei clase (has-a)
Agregare o relaie parte ntreg (is-part-of) Compoziie este similar cu asocierea dar mai strict (contains)

Motenire (specializare) este o relaie de generalizare specializae (is-a, kind-of)

ASOCIERE
Relatie de cooperare intre clase - corespunzatoare unui verb oarecare din specificatie, diferita de relatia parteintreg (de exemplu relatia Student - Facultate). Este identificat prin has-a urmeaz

Implementare: variabile membru (pointeri sau referine) la obiectele asociate


Obs: greu de ntreinut

ASOCIERE
Multiplicitate
Notation Meaning

1
* 0..5 0..4,6,10

Exactly one
Zero or many Zero to five Zero to five, six or ten Exactly one (default)

urmeaz

AGREGARE
O clas printe are elemente de tipul clasei copil. n exemplul de mai jos ara poate avea mai multe Judee dar, n acelai timp, un Jude poate exista chiar i n cazul n care clasa ara nu exist.

COMPOZIIE
Subobiectele agregate aparin exclusiv agregatului din care fac parte, iar durata de via coincide cu ce a agregatorului Clasa copil nu poate exista dect dac exist o instan a clasei printe. n exemplul de mai jos instana clasei Comisie exist atta timp ct exist instana clasei

MOTENIRE
Este un mecanism care permite unei clase A s motenesc (date i funcii) a unei clase B. Relaie Nivel de clas kind-of (Cercul este un tip de Form) Obiect is-a (Obiectul cerc1 este o form) B clas de baz A subclas

EXEMPLU

S-ar putea să vă placă și