Sunteți pe pagina 1din 30

Clase (III)

Programarea calculatoarelor i limbaje de


programare II
Capitolul 3

Introducere
Vom prezenta n acest capitol

compunerea claselor
noiunile de clase friend i funcii friend
pointerul this
modul n care obiectele pot fi create i sterse
dinamic

Sumar
Compunerea claselor: Obiecte ca membri

ai claselor
Funcii friend i clase friend
Pointerul this
Alocarea dinamic a memoriei cu operatorii
new i delete

Compunerea claselor: Obiecte ca


membri ai claselor
Exemplu de compunere a claselor

Dac am scrie un program pentru un ceas cu


alarm, un obiect al clasei AlarmClock ar
trebui s tie cnd trebuie s declaneze
alarma
O idee de proiectare a acestei clase ar fi
includerea unui obiect Time ca membru al su

O clas poate conine ca membri obiecte ale

altor clase

Compunerea claselor: Obiecte ca


membri ai claselor
Exemplu
Clasa Employee conine dou obiecte tip

Date

Obiectele clasei Employee pstreaz


urmtoarele informaii despre angajaii unei
firme: numele, prenumele, data naterii i data
angajrii

Datele membre birthDate i hireDate

sunt obiecte const ale clasei Date

Conin, la rndul lor, datele membre month,


day i year

Compunerea claselor: Obiecte ca


membri ai claselor
class Date
{
public:
Date(int = 1, int = 1, int = 1990);
void print() const;
~Date();
private:
int day; //1-12
int month;//1-31
int year;
int checkDay(int);
};

Compunerea claselor: Obiecte ca


membri ai claselor
class Employee
{
public:
Employee(char*, char*, int, int, int, int, int,
int);
void print() const;
~Employee();
private:
char firstName[25];
char lastName[25];
birthDate i hireDate sunt
const Date birthDate;
obiecte ale clasei Date
const Date hireDate;
};

Compunerea claselor: Obiecte ca


membri ai claselor
Employee::Employee(char* fname, char*lname,
int bday, int bmonth,int byear,
int hday, int hmonth, int hyear)
: birthDate(bday, bmonth, byear),
Argumentele bday,
hireDate(hday, hmonth, hyear)
bmonth i byear sunt
{
transmise
int length = strlen(fname);
constructorului
length = (length < 25 ? length : 24);
obiectului birthDate
strncpy( firstName, fname, length);
firstName[length] = '\0';
length = strlen(lname);
length = (length < 25 ? length : 24);
strncpy( lastName, lname, length);
lastName[length] = '\0';
cout << "Constructorul obiectului Employee:
<< firstName << ' ' << lastName << endl;
}

Compunerea claselor: Obiecte ca


membri ai claselor
Date::Date(int d, int m, int y)
{
if(m > 0 && m <= 12)
month = m;
else {
month = 1;
cout << "Luna " << m << " incorecta. "
<< "Valoarea implicita este 1.\n";
}
year = y;
day = checkDay(d); //valideaza ziua
cout << "Constructorul obiectului de tip Date
pentru ";
print();
cout << endl;
}

Compunerea claselor: Obiecte ca


membri ai claselor
int main()
{
Employee e("Bob", "Jones", 24, 7, 1949, 12, 3, 1988);
cout << '\n';
e.print();
cout << "\nTesteaza constructorul Date
<< "pentru valori incorecte:\n";
Date d(35, 14, 1994);
cout << endl;
return 0;
}

Compunerea claselor: Obiecte ca


membri ai claselor
Rezultatul rulrii:

Obiectele membre sunt construite


naintea obiectului n care sunt
incluse

Constructorul obiectului de tip Date pentru 24-7-1949


Constructorul obiectului de tip Date pentru 12-3-1988
Constructorul obiectului Employee: Bob Jones
Jones, Bob
Angajat: 12-3-1988 Data nasterii: 24-7-1949
Testeaza constructorul Date pentru valori incorecte:
Luna 14 incorecta. Valoarea implicita este 1.
Ziua 35 incorecta. Valoarea implicita este 1.
Constructorul obiectului de tip Date pentru 1-1-1994
Destructorul obiectului de tip Date pentru 1-1-1994
Destructorul obiectului de tip Employee: Jones, Bob
Destructorul obiectului de tip Date pentru 12-3-1988
Destructorul obiectului de tip Date pentru 24-7-1949

Compunerea claselor: Obiecte ca


membri ai claselor
Diagrama UML care reprezint compunerea

claselor Employee i Date


Employee

Date

Compunerea este o relaie tip parte/ntreg

Clasa Employee conine obiecte ale clasei


Date
Clasa Employee este ntregul, iar obiectele
clasei Date sunt pri ale acesteia

Compunerea claselor: Obiecte ca


membri ai claselor
Relaia de asociere dintre cele dou clase este

reprezentat printr-o linie


Employee

Date

Rombul negrul arat c asocierea este o relaie de

compunere

El este ataat clasei n compunerea creia intr obiecte


din clasa aflat la cealalt extremitate a liniei

Valorile de multiplicitate arat cte obiecte ale

claselor particip la relaie

Dou obiecte ale clasei Date fac parte din clasa


Employee

Compunerea claselor: Obiecte ca


membri ai claselor
Diferena dintre asocierea simpl i compunere este

dat de perioada de existen a obiectelor implicate


Compunerea

obiectele fac parte integrant din clasa care reprezint


ntregul i perioadele lor de existen coincid
ntregul este responsabil de crearea i distrugerea
obiectelor care intr n compunerea lui

Asocierea
obiectele parte i ntreg pot avea perioade de existen
diferite
n C++, asocierea poate fi modelat prin
includerea n clasa ntreg a unor referine la obiecte din
alte clase
folosirea de ctre funciile membre ale clasei ntreg de
parametri de tipul claselor parte

Sumar
Compunerea claselor: Obiecte ca membri ai

claselor
Funcii friend i clase friend
Pointerul this
Alocarea dinamic a memoriei cu operatorii
new i delete

Funcii friend i clase friend


Exemplu

Declaraie friend

class Count
{
friend void setX(Count&, int);
public:
Count(){ x = 0; } // constructor
void print() const { cout << x <<
endl; }//iesire
private:
Funcia este
int x; //data membra
declarat friend n
};
clasa Count i
poate s modifice
void setX( Count& c, int val )
valoarea datei
{ c.x = val; }
membre private x

Funcii friend i clase friend


int main()
{
Count counter;
cout << "counter.x dupa instantiere: ";
counter.print();
cout << "counter.x dupa apelul functiei friend setX: ";
setX(counter, 8);
counter.print();
return 0;
}
Rezultat:

counter.x dupa instantiere: 0


counter.x dupa apelul functiei friend setX: 8

Funcii friend i clase friend


O funcie friend a unei clase se definete n

afara domeniului clasei


Are drept de acces la membrii private i
protected ai clasei
O funcie sau o clas ntreag pot fi declarate
friend pentru o alta clas
Funciile friend se folosesc n mod obinuit
atunci cnd anumite operaii nu pot fi
implementate prin funcii membre

Funcii friend i clase friend


Declararea unei funcii ca prieten a unei

clase se face prin inserarea prototipului su


precedat de cuvntul cheie friend n clasa
respectiv
Exemplu
Relaia de prietenie ntre dou clase
ClassOne i ClassTwo:

Se exprim prin plasarea declaraiei

friend class ClassTwo;


n definiia clasei ClassOne

Sumar
Compunerea claselor: Obiecte ca membri ai

claselor
Funcii friend i clase friend
Pointerul this
Alocarea dinamic a memoriei cu operatorii
new i delete

Pointerul this
Fiecare obiect are acces la propria adres de

memorie prin intermediul pointerului numit


this
Pointerul this al unui obiect nu este parte a
obiectului

el nu este reflectat de rezultatul unei operaii


sizeof asupra sa

Pe de alt parte, this este introdus de

compilator ca prim argument n fiecare apel al


funciilor nestatice realizat de obiect

Pointerul this
Pointerul this este folosit implicit pentru a referi

datele membre i funciile membre ale unui obiect

El poate fi folosit i explicit

Tipul pointerului this depinde de tipul obiectului i

de caracterul const sau non-const al funciei


membre apelate de obiect

ntr-o funcie membr non-const a clasei Employee,


pointerul this are tipul de dat Employee* const
ntr-o funcie membr const a clasei Employee,
pointerul this are tipul de dat const Employee*
const

Pointerul this
Exemplu

class Test
{
public:
Test( int = 0); // constructor implicit
void print() const;
private:
int x;
};
Test::Test( int a ) { x = a; }
void Test::print() const
{
cout << "
x = " << x
<< "\n this->x = " << this->x
<< "\n(*this).x = " << (*this).x
<< endl;
}

Pointerul this
int main()
{
Test testObject(12);
testObject.print();
return 0;
}
Rezultat:

x = 12
this->x = 12
(*this).x = 12

Pointerul this
Accesul membrilor clasei prin pointerul this

operatorul sgeat -> pentru pointerul this


la obiect: this->x
operatorul punct . pentru pointerul this
derefereniat: (*this).x

Folosirea parantezelor care ncadreaz

pointerul derefereniat *this este obligatorie


pentru c operatorul . are preceden mai
mare dect *

Sumar
Compunerea claselor: Obiecte ca membri ai

claselor
Funcii friend i clase friend
Pointerul this
Alocarea dinamic a memoriei cu
operatorii new i delete

Alocarea dinamic a memoriei cu


operatorii new i delete
Alocarea dinamic a memoriei nseamn

posibilitatea ca programul s obin mai mult


spaiu de memorie n timpul execuiei
Operatorii new i delete sunt folosii n
limbajul C++ pentru alocarea i dealocarea
dinamic a memoriei

Ei nlocuiesc apelurile de funcii malloc i


free care erau folosite n limbajul C

Alocarea dinamic a memoriei cu


operatorii new i delete
Penttru declaraia

TypeName *typeNamePtr;
alocarea dinamic a memoriei se poate face n
limbajul C prin instruciunea
typeNamePtr = malloc(sizeof(TypeName));

Funcia malloc nu ofer nicio metod de iniializare a


blocului de memorie alocat.

n C++, putem scrie mai simplu:

typeNamePtr = new TypeName;


Prin acest instruciune operatorul new

creeaz automat n memorie un obiect cu dimensiunea


dat de tipul de dat invocat
apeleaz constructorul pentru noul obiect
returneaz un pointer de tipul obiectului

Alocarea dinamic a memoriei cu


operatorii new i delete
Pentru a terge din memorie obiectele alocate

dinamic i a elibera memoria se folosete

operatorul delete dac alocarea a fost fcut prin


operatorul new
funcia free dac am folosit malloc

Exemplu

delete typeNamePtr;
Operatorul delete apeleaz destructorul clasei din
care face parte obiectul a crui zon de memorie
urmeaz s fie eliberat, dac n clas acesta este
declarat

Alocarea dinamic a memoriei cu


operatorii new i delete
Transmiterea unor valori pentru iniializarea

obiectelor create dinamic:


double *thingPtr = new double(3.1415927);

iniializeaz noul obiect de tip double cu valoarea


3.1415927

Alocarea dinamic a tablourilor:

int *arrayPtr = new int[10];


Eliberarea memoriei alocate dinamic pentru tabouri:
delete [] arrayPtr;

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