Sunteți pe pagina 1din 8
Clase și obiecte. Inițializarea și distrugerea obiectelor Mihai Gabroveanu
Clase și obiecte.
Inițializarea și distrugerea
obiectelor
Mihai Gabroveanu
Clase și obiecte. Inițializarea și distrugerea obiectelor Mihai Gabroveanu

Protecția datelor și funcțiilor membre

 

n

private – datele şi funcţiile aflate sub influenţa acestui modificator NU pot fi accesate din afara clasei. În mod implicit datele și funcțiile sunt private.

n

protected - datele şi funcţiile aflate sub influenţa acestui modificator nu pot fi accesate din afara clasei, cu excepția claselor derivate

n

public – datele și funcțiile aflate sub influența modificatorului public, pot fi accesate în afara clasei

Inițializarea și distrugerea obiectelor

3

clasei Ini ț ializarea ș i distrugerea obiectelor 3 Sintaxa definirii unei clase   Obiecte  
clasei Ini ț ializarea ș i distrugerea obiectelor 3 Sintaxa definirii unei clase   Obiecte  

Sintaxa definirii unei clase

 

Obiecte

 

class IdNumeClasa {

n

Obiectul reprezintă o instanță a unei clase.

Sintaxa declarării unui obiect

[<IdProptecție>:] <ListaMembrii> [<IdProptecție>:] <ListaMembrii>

 

n

IdNumeClasă idOb1, …, idObN;

 

[<IdProptecție>:] <ListaMembrii>

};

 

n

Accesarea datelor și funcțiilor membre

idOb.idDataMembru idPointerOb ->idDataMembru idOb.idMetodaMembru(lista de parametri); idPointerOb ->idMetodaMembru(lista de parametri);

 

unde:

<IdProptectie>:=private| protected | public <ListaMembrii>:=<ListaDateMembre><ListaFunctiiMembre>

 
 

Inițializarea și distrugerea obiectelor

2

Inițializarea și distrugerea obiectelor

4

Exemplu:Clasa Complex   Exemplu:Clasa Complex class Complex { private :   int main(){ Complex z;
Exemplu:Clasa Complex   Exemplu:Clasa Complex class Complex { private :   int main(){ Complex z;

Exemplu:Clasa Complex

 

Exemplu:Clasa Complex

class Complex { private:

 

int main(){ Complex z;

 

float re; float im; public:

void citire(); void afisare(); float modul();

}

z.re = 2.5; // Incorect deoarece re este private z.citire(); Complex *p=&z; p -> afisare();

};

 
 

Inițializarea și distrugerea obiectelor

5

 

Inițializarea și distrugerea obiectelor

7

  Ini ț ializarea ș i distrugerea obiectelor 7 Exemplu:Clasa Complex   Ini ț ializarea Obiectelor
  Ini ț ializarea ș i distrugerea obiectelor 7 Exemplu:Clasa Complex   Ini ț ializarea Obiectelor

Exemplu:Clasa Complex

 

Inițializarea Obiectelor

 
 

n

În cazul datelor de tipuri predefinite, este posibilă inițializarea acestora la momentul declarării. Exemplu:

void Complex::citire(){ printf("Dati partea reala:");scanf("%f",&re); printf("Dati partea imaginara:");scanf("%f",&im);

 

}

void Complex::afisare(){ printf("%g+%g*i", re, im);

     

}

float Complex::modul(){ return sqrt(re*re + im*im);

 

int x=10; float a[2]={3,8};

În cazul obiectelor, inițializarea la declarare se face prin intermediul unor funcții speciale numite constructori.

}

n

 

Inițializarea și distrugerea obiectelor

6

 

Inițializarea și distrugerea obiectelor

8

Constructor – Defini ț ie     Constructor – Sintax ă (II) n Constructorul este
Constructor – Defini ț ie     Constructor – Sintax ă (II) n Constructorul este

Constructor – Definiție

   

Constructor – Sintaxă (II)

n

Constructorul este o funcție membră specială a unei clase ce se apelează în mod automat la crearea unui obiect

Rol:

n Inițializarea obiectelor

n

IdNumeClasa idObiect(<listaParametri>); sau IdNumeClasa idObiect = valParam; in cazul in care lista de parametri e formata dintr-un singur parametru

 
 

¨ alocare

 

¨ inițializare

 

Inițializarea și distrugerea obiectelor

9

Inițializarea și distrugerea obiectelor

11

9 Ini ț ializarea ș i distrugerea obiectelor 1 1 Constructor – Sintax ă (I)  
9 Ini ț ializarea ș i distrugerea obiectelor 1 1 Constructor – Sintax ă (I)  

Constructor – Sintaxă (I)

 

Exemplu:Clasa Complex

class IdNumeClasa {

   
 

.

.

 

class Complex { private:

 

. IdNumeClasa (<listaParametri>);

 

float re;

float im;

 

public:

 

.

.

.

Complex(float r, float i);

 

}; IdNumeClasa::IdNumeClasa (<listaParametri>){ //instructiuni

}

void citire(); void afisare(); float modul();

};

 

Inițializarea și distrugerea obiectelor

10

Inițializarea și distrugerea obiectelor

12

  Exemplu:Clasa Complex     Tipuri de constructori (I)     n Constructori implici ț
  Exemplu:Clasa Complex     Tipuri de constructori (I)     n Constructori implici ț
 

Exemplu:Clasa Complex

   

Tipuri de constructori (I)

 
 

n Constructori impliciți

 

Complex::Complex(float r, float i){ re = r; im = i;

}

¨ definit de utilizator – constructor ce nu are niciun

parametru ¨ generat de compilator – daca o clasă nu are niciun constructor definit atunci compilatorul generează unul automat, fară parametri al cărui corp nu conține nicio instrucțiune ¨ constructor cu toți parametri impliciți

 

void main(){ Complex z(7,3); z.afisare();

}

 

Inițializarea și distrugerea obiectelor

13

 

Inițializarea și distrugerea obiectelor

15

  Ini ț ializarea ș i distrugerea obiectelor 1 5   Constructori - Caracteristici    
  Ini ț ializarea ș i distrugerea obiectelor 1 5   Constructori - Caracteristici    
 

Constructori - Caracteristici

   

Exemplu:Constructor Implicit

 
 

class Complex {

 

n

au același nume cu cel al clasei din care fac parte

   

public:

Complex(){ re = 0; im = 0; printf (“Apel constructor\n”);

 

n

nu returnează nimic (nici macar tipul void)

n

o clasă poate avea mai mulți constructori

 

}

   

 

n

nu pot primi ca parametri instanțe ale clasei ce se definește, ci doar pointeri sau referințe la instanțele clasei respective.

 

};

 

Complex z;

z.afisare();

 

n

constructorii nu sunt apelaţi explicit (in general).

Output

n

constructorii nu se moștenesc

Apel constructor

 

n

constructori nu pot fi funcții virtuale

0+0*i

 

Inițializarea și distrugerea obiectelor

14

 

Inițializarea și distrugerea obiectelor

16

Tipuri de constructori (II) Exemplu: Constructor cu parametri n Constructori cu parametri class Persoana {
Tipuri de constructori (II)
Exemplu: Constructor cu parametri
n
Constructori cu parametri
class Persoana {
private:
char *nume;
¨ cu parametri ce nu iau valori implicite
¨ cu parametri ce iau valori implicite
int varsta;
void setNume(char *n){
if(strlen(nume)<strlen(n)){
delete nume;
nume = new char[strlen(n)+1];
public:
}
strcpy(nume, n);
}
n
Funcții cu parametri impliciți
Persoana(char *n, int v){
nume = new char[strlen(n)+1];
strcpy(nume, n);
varsta = v;
void setVarsta(int v){
varsta = v;
}
}
tip_r nume_funcție(tip 1 p 1 ,
,
tip n p n , tip n+1 p n+1 =vi n+1 ,
,
tip m p m =vi m );
p n+1 , …, p m = parametri impliciți.
La apelul funției aceștia pot sa lipsească, caz în care ei au valorile implicite
specificate de declarare.
void afisare(){
cout<<"Nume:"<<nume<<endl;
cout<<"Varsta:"<<varsta<<endl;
};
}
Inițializarea și distrugerea obiectelor
17
Inițializarea și distrugerea obiectelor
19
Exemplu:Constructor cu parametri impliciți
Exemplu: Constructor cu parametri
(cont)
class Complex {
public:
Complex(float r = 0, float i = 0){
re = r;
im = i;
Output
Nume:Mihai
}
int main(){
Persoana p1("Mihai",21);
Persoana p2=p1;
Varsta:21
};
p1.afisare();
Nume:Mihai
p2.afisare();
Varsta:21
Complex z1(2,3), z2(4), z3=5, z4;
z.afisare();
p2.setNume("Misu");
p2.setVarsta(24);
Nume:Misu
p1.afisare();
Varsta:21
p2.afisare();
Nume:Misu
Output
getch();
Varsta:24
}
2+3*i
4+0*i
5+0*i
0+0*i
Inițializarea și distrugerea obiectelor
18
Inițializarea și distrugerea obiectelor
20
Tipuri de constructori (III)     Constructori de copiere - Utilizare   n Constructori de
Tipuri de constructori (III)     Constructori de copiere - Utilizare   n Constructori de

Tipuri de constructori (III)

   

Constructori de copiere - Utilizare

 

n Constructori de copiere - iniţializarea obiectelor din altele deja existente.

n

Crearea de obiecte cu iniţializare, pornind de la un obiect care există (IdClasa ob2=ob1).

 

¨ definiți de utilizator

n

Apelul unei funcţii care lucrează cu obiecte transferate prin valoare, când este nevoie de crearea unei copii a obiectului pe stivă (cazul f(ob);).

¨ generați de compilator

 
   

n

Returnarea dintr-o funcţie a unui obiect prin valoare (return ob;)

 
 

Inițializarea și distrugerea obiectelor

21

 

Inițializarea și distrugerea obiectelor

23

  Ini ț ializarea ș i distrugerea obiectelor 2 3 Constructori de copiere - Sintaxa  
  Ini ț ializarea ș i distrugerea obiectelor 2 3 Constructori de copiere - Sintaxa  

Constructori de copiere - Sintaxa

   

Exemplu:Constructor de copiere (I)

 
   

class Complex {

 

 

public:

class IdNumeClasa {

 

Complex(const Complex &z){ re = z.re; im = z.im; printf("Apel constructor de copiere\n") ;

.

.

}

. IdNumeClasa (IdNumeClasa &ob); sau IdNumeClasa (const IdNumeClasa &ob);

   

 

}; void f(Complex z){

 

}

 

Complex z1(2,3);

 

z1.afisare();

 

Complex z2 = z1;

 

z2.afisare();

 

f(z1);

.

.

.

Output

};

2+3*i

   

Apel constructor de copiere

2+3*i

 

Apel constructor de copiere

 

Inițializarea și distrugerea obiectelor

22

 

Inițializarea și distrugerea obiectelor

24

Exemplu:Constructor de copiere (II) Destructor – Sintaxă class Persoana { . Persoana(const Persoana &p){ nume
Exemplu:Constructor de copiere (II)
Destructor – Sintaxă
class Persoana {
.
Persoana(const Persoana &p){
nume =
new char[strlen(p.nume)+1];
strcpy(nume, p.nume);
varsta = p.varsta;
cout<<"Apel constructor de
copiere\n";
class IdNumeClasa {
.
.
int main(){
Persoana p1("Mihai",21);
Persoana p2=p1;
.
.
p1.afisare();
Apel constructor cu
parametri
Apel constructor de
copiere
Nume:Mihai
p2.afisare();
Varsta:21
.
~IdNumeClasa ();
p2.setNume("Misu");
Nume:Mihai
p2.setVarsta(24);
Varsta:21
p1.afisare();
Nume:Mihai
.
.
.
}
p2.afisare();
Varsta:21
}
Nume:Misu
};
Varsta:24
};
IdNumeClasa::~IdNumeClasa (){
//instructiuni
}
Inițializarea și distrugerea obiectelor
25
Inițializarea și distrugerea obiectelor
27
Destructori
Exemplu:Destructor (I)
class Complex {
public:
n
Destructorul este o funcție membră specială
a unei clase ce apelează în mod automat
distrugerea unui obiect
void ~Complex(){
printf(“Distrugere obiect:”);
afisare();
}
};
n
Rol: eliberarea zonelor alocate dinamic,
resurselor, etc.
void main(){
Complex z1(2,3), z2(4,7);
z1.afisare();
z2.afisare();
}
n
Tipuri
Output
2+3*i
¨ Definit de utilizator
4+7*i
Distrugere obiect: 4+7*i
Distrugere obiect: 2+3*i
¨ Generat de compilator
Inițializarea și distrugerea obiectelor
26
Inițializarea și distrugerea obiectelor
28
Exemplu:Destructor (II)   Tem ă   class Persoana { ~Persoana(){ cout<<"Distrug
Exemplu:Destructor (II)   Tem ă   class Persoana { ~Persoana(){ cout<<"Distrug

Exemplu:Destructor (II)

 

Temă

 

class Persoana {

~Persoana(){ cout<<"Distrug obiectul:"<<nume<<endl; delete nume;

int main(){ Persoana p1("Mihai",21); Persoana p2=p1;

Apel constructor cu parametri Apel constructor de copiere Nume:Mihai

n

Implementați clasa NumarRațional.

p1.afisare();

Varsta:21

n

Implemntați clasa Carte.

 

p2.afisare();

Nume:Mihai

p2.setNume("Misu");

Varsta:21

Implemntați clasa Student în care numele se va aloca dinamic.

 

}

p2.setVarsta(24);

Nume:Mihai

n

 

p1.afisare();

Varsta:21

};

p2.afisare();

Nume:Misu

 

}

Varsta:24

 

Distrug obiectul:Misu Distrug obiectul:Mihai

 
 

Inițializarea și distrugerea obiectelor

29

 

Inițializarea și distrugerea obiectelor

31

 
 

Destructori - Caracteristici

n

Are același nume cu numele clasei si este precedat de ~

n

Nu are parametri

 

n

Nu returneaza nimic (nici macar void)

n

O clasa poate avea un singur destructor

n

Pot fi functii virtuale

 
 

Inițializarea și distrugerea obiectelor

30