c2. constructori si destructori

9
10/24/2010 1 LECTOR DR. ADRIAN RUNCEANU Programare orientată pe obiecte Universitatea “Constantin Brâncuşi” Târgu-Jiu Facultatea de Inginerie Catedra de Automatică şi Ştiinţe 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. Definiţii 2. Crearea, iniţializarea şi eliminarea obiectelor 3. Redefinirea funcţiilor membre 4. Operatorul de rezoluţie “::1. Definiţii 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. Definiţii 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. Definiţii 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.

Upload: geamanu-florin

Post on 10-Nov-2015

215 views

Category:

Documents


2 download

DESCRIPTION

c2. Constructori Si Destructori

TRANSCRIPT

  • 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