Sunteți pe pagina 1din 8

Programarea orientata pe obiecte in C++:clase, obiecte, functii membru,

structuri si uniuni in analogie cu clasele, functii speciale

III. 1. Notiuni introductive

Programarea orientată pe obiecte este o tehnologie modernă in domeniul programării


calculatoarelor, care a rezultat din necesitatea realizării de aplicaţii din ce în ce mai
complexe. Programarea clasica si structurata avea urmatoarele dezavantaje: control greoi al
programelor de dimensiuni mari, dificultati cu privire la reutilizarea codurilor de programe si
inflexibiliatea adaptarii si extinderii unor module de program deja realizate. Programarea clasica
structurata are la baza celebra ecuatie a lui Nikolaus Wirth:

Program = Structuri de date + Algoritmi

Programarea Orientata pe Obiecte, POO, se fundamenteaza pe conceptul de obiect, care


este definit printr-o multime de date, numite proprietati, si o multime de proceduri sau functii
de prelucrare ale acestor date, numite metode. In consecinta, ecuatia POO este:

Obiect = Date + Functii


sau

Obiect = Date + Functii


Obiect = Proprietati + Metode
Diferenta dintre cele doua cai de abordare ale programarii calculatoarelor consta in maniera de
abordare a programarii. In timp ce programarea clasica structurata se concentreaza pe prelucrarea
datelor, adica pe programe, proceduri si functii, POO se bazeaza pe definirea obiectelor, adica, pe
proprietatile acestora, numite date, si pe functiile acestor obiecte, numite metode.

III.2. Clase si obiecte

La baza POO stau conceptele de clasa si de obiect.

Definitia 1

Clasa, intr-un anumit limbaj de programare, reprezinta definirea unui tip de obiecte
abstracte sau concrete, adica descrierea proprietatilor, a datelor si a metodelor, a prelucrarilor,
posibile asupra datelor. Clasa este, de fapt, o notiune abstracta, care defineste un anumit tip de
obiecte, sau, altfel spus, o clasa reprezinta multimea posibila a mai multor obiecte de acelasi tip.
Definitia 2

Obiect, reprezinta o multime de date care descrie un anumit obiect concret sau abstract,
numite si proprietati, impreuna cu procedurile, functiile, de prelucrare a cestora, numite metode.

Crearea unui obiect presupune specificarea clasei din care face parte, astfel identificandu-
se proprietatile obiectului si modul in care acestea pot fi folosite si prelucrate

Observatie:

Crearea sau declararea unui obiect este similara cu crearea sau declararea unor variabile.
Declararea unei variabile se face, dupa cum se stie, prin specificarea identificatorului acesteia,
precedat de tipul variabilei iar declararea unui obiect presupune precizarea identificatorului
acestuia, precedat de clasa din care face parte, clasa care in mod implicit determina proprietatile si
metodele obiectului definit.

O clasa in limbajul C++ poate fi reprezentata ca o extindere a conceptului de structura,


care, ca si o structura, descrie un sablon pentru viitoarele declarari de variabile obiect.

Definirea generala unei clase in C++

class [nume_clasa]

specificator_acces1;

date_si_functii1;

specificator_acces2;

date_si_functii2;

………………………..

specificator_accesn;

date_si_functiin;

}[obiect1] [,obiect2] … [,obiectm];

unde:

- nume_clasa – optional, este un identificator ales de programator care denumeste clasa


definita si prin intermediul caruia se apeleaza aceasta;
- specificator_accesi (i=1,n) – este o eticheta care poate fi unul dintre cuvinele cheie:
public, private sau protected.

Spre deosebire de o structura, ai carei membri sunt toti accesibili programului, o clasa
poate avea membri pe care programul ii poate accesa direct (public), utilizand operatorul punct
(.) si alti membri, denumiti privati (private), pe care programul nu-i poate accesa direct. Unica
accesare a datelor si metodelor private (private) se face numai prin intermediul metodelor
publice. Dupa cum se va vedea, o clasa poate deriva dintr-o clasa de baza, anterior definita,
concept cunoscut sub numele de mostenire. Un membru protejat (protected) are un statut
intermediar intre membri publici si privati. Pentru clasa de baza, obiectele acesteia pot accesa
membri protejati, ca si cum ar fi publici, iar obiectele claselor derivate nu pot accesa un membru
declarat protected in clasa de baza, decat prin intermediul unor functii de interfata declarate
publice.

- date_si_functiii; (i=1,n) – descrie datele, adica proprietatile, si functiile, adica metodele


specifice clasei definite care, in functie de specificator_accesi (i=1,n), pot fi public, private sau
protected.

- [obiect1] [,obiect2] … [,obiectm] – reprezinta identificatorii obiectelor de tipul clasei la


care sunt atasati, adica numele variabilelor obiect respective care vor fi utilizate in programul in
care apar.

Observatii:

- la declararea obiectelor, o data cu definirea clasei asociate, se poate omite identificatorul


de clasa, nume_clasa.

- declararea obiectelor, ulterior definirii clasei asociate, impune obligativitatea


identificatorului de clasa, nume_clasa.

Declararea obiectelor, ulterior definirii clase se face astfel:

class nume_clasa [obiect1] [,obiect2] … [,obiectm];

unde, nume_clasa,obiect1,obiect2, … ,obiectm au semnificatiilie mai sus prezentate.

Problema 17

Sa se citeasca de la tastatura informatiile specifice cartilor dintr-o librarie: denumire carte,


autorul principal, al doilea autor, numarul de pagini si pretul. Prin intermediul unei clase, carte,
care descrie datele despre o carte, proprietatile (denumire carte, autorul principal, al doilea autor,
numarul de pagini si pretul) si metodele de prelucrare (initializarea si afisarea unei carti) sa se
afiseze pe ecran informatiile despre orice carte tratata.

// definirea clasei carte


#include<iostream.h>

#include<string.h>

#include<stdio.h>

class carte

public:

char nume[40];

char autor1[40];

char autor2[40];

int nrpag;

double pret;

void citeste_carte(char *numecarte,char *autorcarte1,char *autorcarte2,int *np,double *p);

void afiseaza_carte();

};

// descrirea functiei de citire carte

void carte::citeste_carte(char *numecarte,char *numeautor1,

char *numeautor2,int *np,double *p)

strcpy(nume,numecarte);

strcpy(autor1,numeautor1);

strcpy(autor2,numeautor2);

nrpag=*np;

pret=*p;
}

void carte::afiseaza_carte()

cout<<"\n cartea nr."<<i<<":"<<nume<<endl;

cout<<"\n primul autor:"<<autor1<<endl;

cout<<"\n al doilea autor:"<<autor2<<endl;

cout<<"\n nr pagini:"<<nrpag<<endl;

cout<<"\n pretul:"<<pret<<endl;

int i=0;

void main()

carte carteacitita;

char wnume[40],wautor1[40],wautor2[40];

int wnrpag;

double wpret;

char r='d';

while(r=='d')

printf("\n denumirea cartii:");

gets(wnume);

printf("\n primul autor:");

gets(wautor1);
printf("\n al doilea autor:");

gets(wautor2);

cout<<"\n nr. pagini:";

cin>>wnrpag;

cout<<"\n pret:";

cin>>wpret;

carteacitita.citeste_carte(wnume,wautor1,wautor2,&wnrpag,&wpret);

carteacitita.afiseaza_carte();

cout<<"\n continuati?(d/n):";

cin>>r;

In urma executarii programului anterior s-au obtinut urmatoarele rezultate, care arata cum
se declara o clasa, un obiect al acestei clase si modul in care se apeleaza membrii acestei clase,
prin intermediul unei instante a acestei clase.

denumirea cartii:Trecea o moara pe Siret

primul autor:Mihail Sadoveanu

al doilea autor: --

nr. pagini:200

pret:30

cartea nr.0:Trecea o moara pe Siret

primul autor:Mihail Sadoveanu


al doilea autor: --

nr pagini:200

pretul:30

continuati?(d/n):d

denumirea cartii:O noapte furtunoasa

primul autor:Ion Luca Caragiale

al doilea autor: --

nr. pagini:50

pret:25

continuati?(d/n):n

Problema 18

Daca, in programul de mai sus, textul definirii clasei carte impreuna cu textele functiilor
precizate in clasa, citeste_carte si afiseaza_carte se salveaza ca un fisier header in directorul
include, fie el carti.h, atunci programul de mai sus va arata astfel:

int i;

#include<iostream.h>

#include<string.h>

#include<carti.h>

void main()

carte carteacitita;

char wnume[40],wautor1[40],wautor2[40];
int wnrpag;

double wpret;

char r='d';

while(r=='d')

printf("\n denumirea cartii:");

gets(wnume);

printf("\n primul autor:");

gets(wautor1);

printf("\n al doilea autor:");

gets(wautor2);

cout<<"\n nr. pagini:";

cin>>wnrpag;

cout<<"\n pret:";

cin>>wpret;

carteacitita.citeste_carte(wnume,wautor1,wautor2,&wnrpag,&wpret);

carteacitita.afiseaza_carte();

cout<<"\n continuati?(d/n):";

cin>>r;

In urma executarii acestui program, se obtin aceleasi rezultate ca in problema precedenta,


cu deosebirea ca referirea clasei carte se face acum din fisierul header, carti.h.

S-ar putea să vă placă și