c2. constructori si destructori
DESCRIPTION
c2. Constructori Si DestructoriTRANSCRIPT
-
10/24/2010
1
LECTOR DR. ADRIAN RUNCEANU
Programare orientat pe
obiecte
Universitatea Constantin Brncui Trgu-Jiu Facultatea de Inginerie
Catedra de Automatic i tiine Aplicate
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
2
Curs 2
Constructori i destructori
Constructori i destructori
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
3
1. Definiii
2. Crearea, iniializarea i eliminarea obiectelor
3. Redefinirea funciilor membre
4. Operatorul de rezoluie ::
1. Definiii
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
4
Pentru crearea, initializarea, copierea si distrugerea obiectelor, in C++ se folosesc functii membre speciale, numite constructori si destructori:
Functia de tip constructor se apeleaza automat la
crearea fiecarui obiect al clasei, creare care poate fi statica sau dinamica (folosind operatorul new).
Functia de tip destructor se apeleaza automat la eliminarea unui obiect al clasei, la incheierea timpului de viata sau, in cazul variabilelor dinamice, este solicitat prin program (cu operatorul delete).
1. Definiii
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
5
Aceste tipuri de functii se declara si se definesc asemanator cu celelalte functii membre, dar au cateva particularitati care le diferentiaza de acestea prin:
Numele functiilor constructor sau destructor coincide cu numele clasei careia i apartine; n plus destructorii se diferentiaza prin faptul ca numele lor este precedat de caracterul ~.
n declaratiile si definitiile constructorilor si destructorilor nu se specifica nici un tip de rezultat, nici macar tipul void.
1. Definiii
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
6
Constructorii si destructorii nu pot fi mosteniti, dar pot fi apelati de clasa derivata.
Nu se pot utiliza pointeri catre constructori sau destructori.
Constructorii pot avea parametri, inclusiv parametri impliciti, si pot fi supradefiniti. Destructorii nu au aceste proprietati.
Un constructor fara parametri se numeste constructor implicit.
-
10/24/2010
2
1. Definiii
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
7
Daca o clasa nu dispune de constructori si destructori definiti, compilatorul va genera automat un constructor implicit, respectiv un destructor, care sunt si functii publice.
De obicei, constructorii si destructorii se declara publici, deoarece, daca s-ar declara privati atunci nu s-ar mai putea declara obiecte de tipul respectiv.
Constructori i destructori
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
8
1. Definiii
2. Crearea, iniializarea i eliminarea obiectelor
3. Redefinirea funciilor membre
4. Operatorul de rezoluie ::
2. Crearea, iniializarea i eliminarea obiectelor
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
9
Prezentm n continuare un exemplu de clas care implementeaz, o structur de tip list, n mod special - o structur de tip coad - FIFO (First In First Out).
Obiectele acestei clase sunt structuri de date controlate cu un set de funcii care asigur urmtoarele operaii specifice:
iniializarea listei
adugarea(introducerea) unui element
tergerea(extragerea) unui element
verificarea dac lista este vid
verificarea dac lista este plin
2. Crearea, iniializarea i eliminarea obiectelor
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
10
Astfel, structura de date, mpreun cu metodele de operare asociate reprezint un ansamblu cu o funcionalitate bine definit.
Clasa conine cmpurile: tab[100] - un vector definit static care conine elementele listei nrcrt - numrul curent(actual) de elemente aflate la un moment dat
n lista prim - un numr care reprezint poziia primului element din lista funcia init() - introduce o valoare de pornire pentru fiecare din cele
dou variabile specifice, nrcrt respectiv prim funcia adaug() - adaug un element n list funcia extrag() - extrage un element din list funcia lista_vida() - returneaz 0 dac lista este vid, sau 1 n caz
contrar funcia lista_plina() - returneaz 0 daca lista este plin, sau 1 n caz
contrar
2. Crearea, iniializarea i eliminarea obiectelor
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
11
Constructorul este simplu si poate fi definit inline:
#include
class fifo
{
// declaratii de tip privat
int tab[100]; // vectorul de 100 de elemente
int nrcrt; // numarul curent de elemente din lista
int prim; // primul element din lista
2. Crearea, iniializarea i eliminarea obiectelor
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
12
public: // declaratii de tip public // functii inline fifo() { nrcrt=prim=0 ; cout
-
10/24/2010
3
2. Crearea, iniializarea i eliminarea obiectelor
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
13
void init() // initializez lista { nrcrt=prim=0; } int lista_vida() // verific daca coada este sau nu vida { return(nrcrt>0); //daca nrcrt=0 atunci lista este vida } int lista_plina() { return(nrcrt
-
10/24/2010
4
2. Crearea, iniializarea i eliminarea obiectelor
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
19
#include //lista FIFO cu nmax numere de elemente
class fifo{
// declaratii de tip privat
int nmax; // dimensiunea listei
int *tab; // adresa tabloului listei
int nrcrt; // numarul curent de elemente din lista
int prim; // primul element din lista
2. Crearea, iniializarea i eliminarea obiectelor
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
20
public: // declaratii de tip public fifo(int); // constructor 1 care creeaza o lista cu un numar de elemente fifo(); // constructor 2 care creeaza o lista de 100 de elemente ~fifo(); // destructor int adaug(int); //adauga un element la sfarsit int extrag(int&); //extrage un element de la inceput // functii inline int lista_vida() // verific daca coada este sau nu vida { return(nrcrt>0); //daca nrcrt=0 atunci lista este vida } int lista_plina() { return(nrcrt
-
10/24/2010
5
2. Crearea, iniializarea i eliminarea obiectelor
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
25
int fifo::extrag(int &k) { if(lista_vida()) { k=tab[prim]; prim=(prim+1)%nmax; nrcrt--; cout
-
10/24/2010
6
3. Redefinirea funciilor membre
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
31
Valoarea compararii cu functiile specializate strcmp() si strncmp() se obtine prin scaderea
nedistructiva a caracterelor celor doua functii aflate pe acceasi pozitie relativa.
Se pot obtine urmatoarele valori :
Daca s1 < s2 atunci rezultatul este s2 atunci rezultatul este >0
3. Redefinirea funciilor membre
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
32
#include
#include
#include
class sir{
// declaratie de tip privat
char *text;
3. Redefinirea funciilor membre
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
33
public: // declaratii de tip public sir(char *sirul); // constructor ~sir(){delete text;} // destructor int compar(sir &s1, sir &s2); // functia membra
compar va fi redefinita int compar(sir &s1, sir &s2, unsigned int
numarcar); void afiseaza(char *mesaj=" ") { cout
-
10/24/2010
7
Constructori i destructori
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
37
1. Definiii
2. Crearea, iniializarea i eliminarea obiectelor
3. Redefinirea funciilor membre
4. Operatorul de rezoluie ::
4. Operatorul de rezoluie
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
38
Definirea funciilor dinr-o clasa se face n afara domeniului de definiie al clasei, si de aceea numele funciei trebuie s fie nsoit de numele clasei, i s fie separat de aceasta prin operatorul de rezoluie sau vizibilitate ( :: ).
4. Operatorul de rezoluie
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
39
Exemplu de implementare a unei clase:
Definii i implementai clasa Cilindru, avnd ca date membru:
Raza i Inaltimea cilindrului
i ca funcii membre: un constructor
Aria
Volum
4. Operatorul de rezoluie
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
40
#include
#define PI 3.14
class cilindru
{
float raza;
float inaltimea;
4. Operatorul de rezoluie
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
41
public:
cilindru();
float aria();
float aria_totala();
float volum();
};
4. Operatorul de rezoluie
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
42
cilindru::cilindru()
{
coutraza;
coutinaltimea;
}
float cilindru::aria()
{
return ( 2 * PI * raza * inaltimea );
}
-
10/24/2010
8
4. Operatorul de rezoluie
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
43
float cilindru::aria_totala() { float a; a = aria(); return( a + 2 * PI * raza * raza ); } float cilindru::volum() { return ( PI * raza * raza * inaltimea ); }
4. Operatorul de rezoluie
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
44
int main(void) { cilindru c; cout
-
10/24/2010
9
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
49
Solutie problema 2:
#include
class dreptunghi{
float latime;
float lungime;
public:
dreptunghi();
float perimetru();
float aria ();
};
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
50
dreptunghi:: dreptunghi()
{
coutlatime;
coutlungime;
}
float dreptunghi::perimetru()
{
return (2*(latime+lungime));
}
24.10.2010 Curs - Programare orientat pe obiecte C++/Java
51
float dreptunghi::aria() { return(latime*lungime); } int main(void)
{ dreptunghi d; cout