lab1_poo1

9
1 MINISTERUL EDUCAŢIEI ŞI TINERETULUI AL R.MOLDOVA Colegiul Politehnic din Chişinău Catedra “Sisteme Informaţionale” La disciplina Programarea oroentată pe obiecte 1 prof. Pânzaru Zinaida Chişinău 2015

Upload: constantin-sirbu

Post on 04-Oct-2015

13 views

Category:

Documents


7 download

DESCRIPTION

c++

TRANSCRIPT

  • 1

    MINISTERUL EDUCAIEI I TINERETULUI AL R.MOLDOVA

    Colegiul Politehnic din Chiinu

    Catedra Sisteme Informaionale

    La disciplina

    Programarea oroentat pe obiecte 1

    prof. Pnzaru Zinaida

    Chiinu 2015

  • 2

    Cerinele coninutului lucrrii de laborator:

    1. Formularea problemei (condiia);

    2. Scopul lucrrii;

    3. Listingul programului (programul limbajul C++);

    4. Rezultatul (cel puin 2 compilri cu introducerea diferitor date);

    5. Concluzie:

    a. generalizare la tema (2- 3 fraze);

    b. explicaia programului (1 -2 fraze);

    c. Analiza rezultatelor (1 -2 fraze).

    Not: Punctele 3,4 se vor repeta pentru mai multe probleme rezolvate

  • 3

    MODEL FOAIE DE TITLU

    MINISTERUL EDUCAIEI AL R. MOLDOVA

    Colegiul Politehnic din Chiinu

    Catedra Sisteme Informaionale

    LUCRARE DE LABORATOR NR.1

    La Programarea orientat pe obiecte 1

    VARIANTA 4

    Tema: Elaborarea claselor n limbajul C++

    Data ______________

    _____________ (semntura prof.)

    __________________

    (semntura elev.)

    A efectuat elevul gr. I ____

    Nume, Prenume

    A verificat prof.

    Pnzaru Zinaida

    Chiinu 2015

  • 4

    Lucrare de laborator Nr.1

    Tema: Clase n limbajul C++ Scopul lucrrii:

    1. nsuirea noilor elemente de baz ale limbajului C++;

    2. Cunoaterea, definirea: claselor n limbajul C++;

    3. Compunerea i punerea n execuie a programelor C++ ce utilizeaz clase.

    Consideraii teoretice necesare: Clasa reprezinta o metoda logica de organizare a datelor si functiilor unei aceleasi familii.

    FG: class class_name

    {

    [private] date metode;

    [protected] date metode;

    [public] date metode;

    }

    Public - Membrul este accesibil de oriunde

    protected - Membrul este accesibil oricrui membru al clasei care-l conine i a claselor

    derivate

    private - Modificator implicit. Accesibil permis doar pentru clasa care-l conine

    Exemplu:Un nr complex cuprinde:

    - partea reala x

    - partea imaginara y

    - o functie care returneaza modulul class complex

    {public:

    float x,y;

    float modul();}; float complex::modul()

    {return sqrt(x*x+y*y);}

    Crearea obiectelor: complex z1,z2;

    Adresarea datelor si metodelor obiectului se utilizeaza .

    Ex: z1.x

    z1.y

    z1.modul()

    Un obiect este o dat de un tip definit printr-o clas. Se

    spune c obiectul este o instaniere a clasei respective.

    Formatul declaratiei unui obiect: nume_clas nume_obiect;

    #include

    #include

  • 5

    class complex

    {public:

    float x,y;

    float modul();};

    float complex::modul()

    {return sqrt(x*x+y*y);

    }void main()

    {Complex z;

    z.x=3;z.y=4;

    cout

  • 6

    unsigned GetX();

    unsigned GetY();

    void SetX(unsigned X);

    void SetY(unsigned Y);

    };

    unsigned Point::GetX()

    {

    return x;

    }

    unsigned Point::GetY()

    {

    return y;

    }

    void Point::SetX(unsigned X)

    {

    x = X;

    }

    void Point::SetY(unsigned Y)

    {

    y = Y;

    }

    Am folosit un operator nou, specific C++, ::, numit operator de rezolutie, numit si operator

    de acces sau de domeniu. El permite accesul la un identificator, dintr-un bloc in care acesta

    nu este vizibil datorita unei alte declaratii locale. Un exemplu de folosire este urmatorul:

    char *sir = "variabila globala";

    void functie()

    {

    char *sir = "variabila locala";

    printf("%s\n", ::sir); // afiseaza variabila globala

    printf("%s\n", sir); // afiseaza variabila locala

    }

    Pentru definitiile functiilor membre aflate in afara declaratiei clasei este necesara specificarea

    numelui clasei urmat de acest operator, indicand faptul ca functia are acelasi domeniu cu

    declaratia clasei respective si este membra a ei, desi este definita in afara declaratiei.

    Crearea si distrugerea obiectelor

    Sa consideram urmatorul program C++:

    void main()

    {

    Point p;

    }

    In momentul definirii variabilei p, va fi alocat automat spatiul de memorie necesar, acesta

    fiind eliberat la terminarea programului. In exemplul de mai sus, variabila p este de tip static.

    In continuare vom modifica acest program pentru a folosi o variabila dinamica (pointer).

  • 7

    void main()

    {

    Point *p;

    p = new Point;

    p->x = 5;

    p->y = 10;

    printf("Aria = %d\n", p->Aria());

    delete p;

    }

    Ati observat utilizarea unor operatori pe care nu ii cunoasteti din limbajul C: new si delete.

    C++ introduce o metoda noua pentru gestiunea dinamica a memoriei, similara celei utilizate

    in C (malloc() si free()), dar superioara si special construita pentru programarea orientata pe

    obiecte. Operatorul new este folosit pentru alocarea memoriei, iar sintaxa acestuia este:

    variabila = new tip;

    variabila = new tip(valoare_initiala);

    variabila = new tip[n];

    Este usor de intuit ca prima varianta aloca spatiu pentru variabila dar nu o initializeaza, a

    doua varianta ii aloca spatiu si o initializeaza cu valoarea specificata, iar a treia aloca un

    tablou de dimensiune n. Acest operator furnizeaza ca rezultat un pointer continand adresa

    zonei de memorie alocate, in caz de succes, sau un pointer cu valoarea NULL (practic 0)

    atunci cand alocarea nu a reusit.

    Eliminarea unei variabile dinamice si eliberarea zonei de memorie aferente se realizeaza cu

    ajutorul operatorului delete. Sintaxa acestuia este: delete variabila;

    Desi acesti doi operatori ofera metode flexibile de gestionare a obiectelor, exista situatii in

    care aceasta nu rezolva toate problemele (de exemplu obiectele care necesita alocarea unor

    variabile dinamice in momentul crearii lor). De aceea pentru crearea si distrugerea obiectelor

    in C++ se folosesc niste functii membre speciale, numite constructori si destructori.

    Constructorul este apelat automat la instantierea unei clase, fie ea statica sau dinamica.

    Destructorul este apelat automat la eliminarea unui obiect, la incheierea timpului de viata in

    cazul static, sau la apelul unui delete in cazul dinamic.

    Din punct de vedere cronologic, constructorul este apelat dupa alocarea memoriei necesare,

    deci in faza finala a crearii obiectului, iar destructorul inaintea eliberarii memoriei aferente,

    deci in faza initiala a distrugerii sale.

    Constructorii si destructorii se declara si se definesc similar cu celelalte functii membre, dar

    prezinta o serie de caracteristici specifice:

    numele lor coincide cu numele clasei careia ii apartin; destructorii se disting de

    constructori prin faptul ca numele lor este precedat de caracterul ~

    nu pot returna nici un rezultat

    nu se pot utiliza pointeri catre constructori sau destructori

    constructorii pot avea parametri, destructorii insa nu. Un constructor fara parametri poarta

    denumirea de constructor implicit.

    De remarcat este faptul ca in cazul in care o clasa nu dispune de constructori sau destructori,

    compilatorul de C++ genereaza automat un constructor respectiv destructor implicit.

    Sa completam in continuare clasa Point cu un constructor si un destructor:

    Point::Point()

  • 8

    // constructor implicit

    {

    x = 0;

    y = 0;

    }

    Point::Point(unsigned X, unsigned Y)

    {

    x = X;

    y = Y;

    }

    Point::~Point()

    {

    }

    Ati remarcat cu aceasta ocazie modul de marcare a comentariilor in C++: tot ce se afla dupa

    caracterul // este considerat comentariu.

    De notat este faptul ca definitii de forma

    Point p;

    sau

    Point *p = new Point();

    duc la apelarea constructorului implicit.

    O intrebare care poate apare este motivul pentru care am realizat functiile GetX(), GetY(),

    SetX(), SetY(), cand puteam utiliza direct variabilele membru x si y. Deoarece una din regulile

    programarii C++, adoptata in general de catre specialisti, este de a proteja variabilele

    membru (veti afla in capitolul urmator cum), acestea neputand fi accesate decat prin

    intermediul unor functii, care au rolul de metode de prelucrare a datelor incapsulate in

    interiorul clasei.

    Probleme propusepentru lucrrea de laborator:

  • 9