Definitia unei clase si accesul la membri



    O clasa reprezinta un tip abstract de date, care incapsuleaza atât elementele de date (datele membre) pentru care s-a adoptat un anumit mod de reprezentare, cât si operatiile asupra datelor (functiile membre, metode). Modul de acces la membrii tipului de date (in scopul protejarii acestora) poate fi schimbat prin utilizarea modificatorilor de control ai accesului: public, private, protected.

    Modul de definire a unei clase este similar celui de declarare a structurilorr:

class nume_clasa{
    modificator_control_acces:
    lista_membrilor;
} lista_variabile;


    Clasa reprezinta un tip de date (definit de utilizator).
    Membrii unei clase sunt:

 1.Datele membre - datele declarate in cadrul clasei;
 2. Metodele - functiile membre, functiile declarate sau definite in cadrul clasei. Se admite ca in cadrul declaratiei de clasa sa se specifice doar prototipurile functiilor membre (antet functie ;), definitiile putând fi facute oriunde in fisier, sau in alt fisier. In cazul in care o metoda este definita in afara corpului clasei se utilizeaza in antetul definitiei metodei respective operatorul :: , numit operator de rezolutie:

 

tip_valoare_intoarsa nume_clasa : : nume_metoda(lista parametri)

                       {corp metoda;}

 

Functiile (metodele) definite  in interiorul clasei se numesc functii inline. Pentru o astfel de functie orice apel este inlocuit prin codul ei. O functie inline  nu poate contine repetitive.

    Pentru membrii care apar in lista_membrilor se poate preciza un anumit mod de acces:
    Modificator_control_acces poate fi public, private sau protected.  Daca nu se specifica, este considerat cel implicit (private).
    a)Modificatorul de acces public se utilizeaza pentru membrii care dorim sa fie neprotejati, ultimii doi modificatori asigurând protectia membrilor din domeniul de actiune a lor.
    b)Membrii cu acces private pot fi accesati numai prin metodele clasei (sau prin functiile prietene).
    c)Cei cu acces protected poseda caracteristicile celor privati, in plus, putând fi accesati si din clasele derivate.

 

Specificatorii modului de acces pot aparea in declararea clasei de mai multe ori, in orice ordine.

Domeniul unui modificator de acces tine din punctul in care apare modificatorul respectiv, pâna la sfârsitul declaratiei clasei sau al intâlnirii altui modificator de acces .

Variabilele din lista_variabile sunt de tipul nume_tip si se numesc instante (obiecte) ale clasei.

Concluzie: Clasa este un tip abstract de date. Obiectele sunt instante ale clasei. Clasa extinde notiunea de tip de data ingloband atat datele necesare prelucrarii cat si prelucrarile propriuzise.

Exemplul urmator are un scop pur didactic. Vom defini o clasa foarte generala, clasa om, pe care in lectiile urmatoare o vom specializa.

Exemplu:

#include<iostream.h>

#include<string.h>

#include<conio.h>

 

class om

{public:                                                //modificator de acces public

   char nume[20],prenume[20],sex;      //date membre

   int varsta,an;

 

   void display();                                  //metoda definita in afara corpului clasei

 

   int calcul()                                        //metoda definita inline

      {int ac=2006;

      cout<<"anul nasterii lui "<<nume;

      cin>>an;

      return ac-an;

     }

};                                                        //inchid corpul clasei

 

 

void om::display()       //metoda display definita in afara clasei. Se utilizeaza numele clasei si operatorul de rezolutie

{cout<<endl<<endl<<"***************DATE PERSONALE**************"<<endl<<endl;

 cout<<"NUME:      "<<nume<<endl;

 cout<<"PRENUME:   "<<prenume<<endl;

 cout<<"SEXUL:     "<<sex<<endl;

 cout<<"VARSTA:    "<<varsta<<" ani "<<endl;

 cout<<endl<<"*******************************************"<<endl<<endl;

 }

 

 

void main()

{om x;  //x este un obiect, o instanta a clasei om

 clrscr();

 cout<<"numele ";

 cin>>x.nume;   //campurile de date sunt publice, si pot fi accesate in afara clasei, in functia main de ex.

 cout<<"prenumele ";

 cin>>x.prenume;

 cout<<"sexul ";

 cin>>x.sex;

 x.varsta=x.calcul(); //metoda calcul este o medoda publicasi se poate accesa din afara clasei

 x.display();

 getch();

}

Observati ca:

-         datele membre (campurile) se acceseaza in afara clasei utilizand nume_obiect.nume_camp lucru cu care sunteti obisnuiti la prelucrarile variabilelor de tip struct.

-         Metodele se acceseaza in afara clasei in mod similar cu campurile de date: nume_obiect.nume_metoda

-         In interiorul clasei campurile se acceseaza ca atare, neavand sens sa utilizam nume_obiect . Observati cum se acceseaza campurile nume, prenume, varsta si sex in cadrul metodei display( ), deci in interiorul clasei pentru ca metoada display( ) este metoda a clasei. La fel si campurile nume si an din metoda calcul.

In urmatorul exemplu o parte dintre campuri si metode sunt private. Observati modul in care se acceseaza acestea (numai din interiorul clasei). Daca o clasa ar avea numai date si metode private ar fi izolata de exterior.

#include<iostream.h>

#include<string.h>

#include<conio.h>

 

class om

{private:                                       //campuri private ce nu vor putea fi referite din programul principal ci doar

   char nume[20],prenume[20],sex;  //din cadrul unor metode publice(din interiorul obiectului)

   int varsta,an;

   void display();

   int calcul();

 

public:                                    //campuri publice

  void init(char num0[20],char prn0[20],char sex0);             /*este o

                                               metoda publica ce va putea fi apelata

                                               din pg principal si va realiza

                                               comunicarea cu exteriorul*/

 

};//inchid clasa

 

void om::init(char num0[20],char prn0[20],char sex0)    //definitia metodei init

{strcpy(nume,num0);

 strcpy(prenume,prn0);

 sex=sex0;

 varsta=calcul();

 display();

}

 

int om::calcul()                                     //definitia metodei calcul

{int ac=2006;

cout<<"anul nasterii lui "<<nume;

cin>>an;

return ac-an;}

 

 

void om::display()                                //definitia metodei display

{cout<<endl<<"***************DATE PERSONALE**************"<<endl<<endl;

 cout<<"NUME:      "<<nume<<endl;

 cout<<"PRENUME:   "<<prenume<<endl;

 cout<<"SEXUL:     "<<sex<<endl;

 cout<<"VARSTA:    "<<varsta<<" ani"<<endl;

 cout<<endl<<"*******************************************"<<endl<<endl;

 }

 

 

void main()

{om x;

 clrscr();

 char nm[20],pn[20],s;

 cout<<"numele ";

      //cin>>x.nume; ar genera eroarea om::nume is not accessible

 cin>>nm;

 cout<<"prenumele ";

 cin>>pn;

 cout<<"sexul ";

 cin>>s;

 x.init(nm,pn,s);

     // x.display();  ar genera eroarea om::display() is not accessible

  getch();

}

 

Asadar putem privi un obiect ca o capsula:

 

 

in care datele si metodele publice realizeaza legatura cu exteriorul in timp ce cele private raman ascunse.

 

Probleme propuse:

 

1. Sa se defineasca o clasa complex care sa permita prelucrarea numerelor complexe astfel:

-clasa va contine campuri de date si metode publice

-campurile de date: partea reala, partea imaginara, modulul

-metode:

     de afisare a numarului in format complex;

     de calcul a modulului unui numar complex;

     care determina suma a doua numere complexe: suma obiectului transmis ca parametru si obiectului curent.

     care determina produsul a doua numere complexe: produsul obiectului transmis ca parametru si obiectului curent.

 

Cerinte:

            -sa se citeasca doua numere complexe

            -sa se afiseze numerele

            -sa se determine suma si produsul a doua numere. Sa se afiseze

            -sa se determine suma si produsul a n numere. Sa se afiseze

            -sa se ordoneze numerele dupa modul

            - sa se prelucreze doua numere complexe alocate in mod dinamic.

 

2. Sa se redefineasca clasa complex astfel incat campurile de date sa fie private.

 

3. Sa se defineasca o clasa rational care sa sealizeze prelucrari similare cu numere rationale.

 

4. Sa se defineasca o clasa lista care sa permita operariile de creare si afisare ale unei liste de numere intregi. Sa se afiseze numerele prime din lista

 

5. Sa se defineasca o clasa vector care sa permita urmatoarele operatii cu vectori:

-citire

-afisare

-ordanare

-cautare valoare

-inserare pe pozitia k

-stergere pe pozitia k

 

6. Sa se defineasca o clasa matrice care sa permita urmatoarele operatii:

-citire

-afisare

-inversare 2 linii

-inversare doua coloane