Documente Academic
Documente Profesional
Documente Cultură
Clasesiobiecte
Clasesiobiecte
CAP. 2
Oclasă reprezintă un tip abstract de date, care încapsulează atât elementele de date (datele membre)
pentru care s-a adoptat un anumit mod de reprezentare, cât şi operaţiile asupra datelor (funcţiile
membre sau metode).
ÎnlimbajulC+
+,structurileşiuniunilereprezintăcazuriparticularealeclaselor,putândaveanunumaidatemembresaucâmpu
ridedate,darşifuncţiimembre.
Clasesiobiecte
CAP. 2
Clasesiobiecte
CAP. 2
Clasesiobiecte
CAP. 2
Clasesiobiecte
structuri, a unei uniuni şi a unei clase. Datele membre sunt lungimea şi lăţimea (variabilele Lung, lat).
Funcţiilemembresunt: void seteaza_dimen(double, double) -primeşte ca argumente două valori reale şi
iniţializează datele membre cu valorile argumentelor. double arata_Lung( ) -returnează valoarea lungimii
(a datei membre Lung). double arata_Lat( ) -returnează valoarea lăţimii (a datei membre lat). double
calcul_arie( )-returnează valoarea ariei dreptunghiului.
CAP. 2
Clasesiobiecte
Se defineşte tipul dreptunghi printr-o structură.Tipul conţine atât datele membre, cât şi metodele care
implementează operaţiile care pot fi realizate asupra variabilelor de tipul dreptunghi. Metodele
arata_Lung, arata_Lat, calcul_arie sunt definite în structură (uniune). Metoda seteaza_dimen este doar
declarată în interiorul structurii (uniunii), fiind abia apoi definită.
CAP. 2
10
Clasesiobiecte
#include <iostream.h> uniondreptunghi{ double Lung, lat; void seteaza_dimen(double, double ); double
arata_Lung() {return Lung;} double arata_Lat() {return lat;} double calcul_arie(double s) {return s*lat;} };
void dreptunghi::seteaza_dimen(double L, double l){Lung=L; lat=l;}intmain(){ dreptunghia; double l1,
l2;cout<<"Lungime="; cin>>l1; cout<<"Latime="; cin>>l2;a.seteaza_dimen(l1, l1);cout<<"Lung.
drept:"<<a.arata_Lung()<<'\n';double s1=a.arata_Lung(); a.seteaza_dimen(l2,
l2);cout<<"Latimeadreptunghiuluieste:";cout<<a.arata_Lat()<<'\n';cout<<"Aria
dreptunghiului:"<<a.calcul_arie(s1)<<'\n';cout<<"Dimens. uniunii:"<<sizeof(dreptunghi)<<'\n';}
CAP. 2
11
Clasesiobiecte
#include <iostream.h> class dreptunghi{ double Lung, lat; public: void seteaza_dimen(double, double );
double arata_Lung() {return Lung;} double arata_Lat() {return lat;} double calcul_arie() {return Lung*lat;}
}; voiddreptunghi::seteaza_dimen(double L, double l) {Lung=L; lat=l;} intmain() { dreptunghia;doublel1,
l2; cout<<"Lungime="; cin>>l1;cout<<"Latime="; cin>>l2; a.seteaza_dimen(l1, l2);
cout<<"Dimensiuniledreptunghiuluisunt:"; cout<<a.arata_Lung()<<" si"<<a.arata_Lat()<<'\n';
cout<<"Aria dreptunghiului:"<<a.calcul_arie()<<'\n'; cout<<"Dimens:"<<sizeof(a)<<'\n'; }
În implementareacu clase, nivelul de acees implicit la membrii clasei este private. Dacă pentru metode
nu s-ar fi folosit modificatorul de acces public, metodele nu ar fi putut fi folosite în funcţia main.
CAP. 2
12
Clasesiobiecte
CAP. 2
13
Clasesiobiecte
Clasaestedescriereaabstractaaobiectelorcuajutorulatributelorsimetodelor.Oclasasepoatereprezentaprint
r-odiagrama,incaresuntspecificatenumele,atributelesimetodele.
<class name><atributul1><atributul2><atributul3>…<metoda1><metoda2><metoda3>…
Diagrama
Automobilculoaremarcausi…citire_date()afisare_date()modificare_date()…
Exemplu
Numeleclasei
Datelemembre(atribute)
Functiilemembre(metodele)
CAP. 2
14
CAP. 2
15
Clasesiobiecte
CAP. 2
16
Clasesiobiecte
Pentrumembriicareaparînlista_membrilorsepoateprecizaunanumitmoddeacces.Modificator_control_acc
espoatefipublic,privatesauprotected(eventualfriend).Dacănusespecifică,esteconsideratcelimplicit(privat
e).
CAP. 2
17
Clasesiobiecte
Modificatoruldeaccespublicseutilizeazăpentrumembriicaredorimsăfieneprotejaţi,ultimiidoimodificatoria
sigurândprotecţiamembrilordindomeniuldeacţiunealor.Membriicuaccesprivatepotfiaccesaţinumaiprinm
etodeleclasei(sauprinfuncţiileprietene).Ceicuaccesprotectedposedăcaracteristicilecelorprivaţiiar,înplus,p
otfiaccesaţişidinclaselederivate.Specificatoriimoduluideaccespotapareîndeclarareaclaseidemaimulteori,î
noriceordine.
CAP. 2
18
Clasesiobiecte
Accesulla membriiuneiclase
CAP. 2
19
aparemodificatorulrespectiv,pânălasfârşituldeclaraţiei
claseisaualîntâlniriialtuimodificatordeacces.
CAP. 2
20
Clasesiobiecte
Observaţie:ÎnlimbajulC++,încazultipurilordedate
definitecuajutorulstructurilor,sepotaplicamodificatorii
deacces.Încazultipurilordefinitecuajutoruluniunilor,accesulimplicit(public)nupoatefimodificat.
CAP. 2
21
Clasesiobiecte
Exemplu:class masina{char *culoare; // dată membru la care accesul este, implicit, privateint capacit_cil;
// dată membru la care accesul este, implicit, privatepublic:void citire_date();//metodă cu acces public,
care permite introducerea datelor despre o instanţă a claseiint ret_capacit(); //metodă cu acces
public};Membrii culoare şi capacitate_cil (accesul private) pot fi accesaţi doar prin intermediul
metodelor clasei.
CAP. 2
22
Clasesiobiecte
Exemplu:
classpersoana{char *nume; //dată membru privatăpublic:void citire_inf_pers(); //metodă
publicăprivate:int varsta; //dată membru privată};
CAP. 2
23
2.1.2. DECLARAREACLASELOR
Clasesiobiecte
Clasesiobiecte
24
CAP. 2
25
2.2InstantiereaclaselorClasesiobiecte
Instanţierea unei clase constă în declararea unor variabile de tip definit cu ajutorul clasei. O astfel de
variabilă, numită obiect (sau instanţă a clasei) este o dată de tip definit prin clasă. Daca, în funcţia main,
se declară obiectul (variabila) a de tip dreptunghi, punem că obiectul a este o instanţă a clasei
dreptunghi. Se pot declara oricâte obiecte (instanţe) ale clasei. Aşa cum se observă din exemplu,
declararea obiectelor de un anumit tip are o formă asemănătoare celei pentru datele de tip predefinit:
<nume_clasa> <lista_obiecte>;
Exemple:
dreptunghia; dreptunghib, c, d;
CAP. 2
26
2.2InstantiereaclaselorClasesiobiecte
CAP. 2
27
2.2InstantiereaclaselorClasesiobiecte
Clasesiobiecte
28
CAP. 2
29
2.3MembriiuneiclaseClasesiobiecte
obiect.VariabilaMembra= valoare
pentruaccesulla o variabilamembra, si
obiect.FunctieMembra()
pentruapelareauneifunctiimembre.
CAP. 2
30
2.3MembriiuneiclaseClasesiobiecte
Datele membru se alocă distinct pentru fiecare instanţă (atribute ale instanţei) a clasei (pentru
declararea obiectelor a, b, c, d de tip dreprunghi). Excepţia de la această regulă o constituie datele
membru statice, care există într-un singur exemplar, comun, pentru toate instanţele clasei.
CAP. 2
31
2.3MembriiuneiclaseClasesiobiecte
Exemplu:
CAP. 2
32
2.3 MembriiuneiclaseClasesiobiecte
Am folositun operator nou, specific C++, ::, numitoperator de rezolutie( numitsioperator de accessaude
domeniu). El permiteaccesulla un identificator, dintr-un bloc in care acestanu
estevizibildatoritauneialtedeclaratiilocale. Un exemplude folosireesteurmatorul:char *sir =
"variabilaglobala";void functie(){ char *sir = "variabilalocala";printf("%s\n", ::sir); //
afiseazavariabilaglobalaprintf("%s\n", sir); //
afiseazavariabilalocala}Pentrudefinitiilefunctiilormembreaflatein
afaradeclaratieiclaseiestenecesaraspecificareanumeluiclaseiurmatde acestoperator,
indicandfaptulcafunctiaareacelasidomeniucu declaratiaclaseirespective siestemembraa ei,
desiestedefinitain afaradeclaratiei.
CAP. 2
33
2.3 MembriiuneiclaseClasesiobiecte
O funcţie membru se apelează totdeauna în strânsă dependenţă cu un obiect din clasa respectivă.
Legătura dintre obiect şi funcţia membră se face prin operatorul .sau operatorul ->, după cum obiectul
este desemnat prin numesau prin pointer.
CAP. 2
34
2.3 MembriiuneiclaseClasesiobiecte
CAP. 2
35
2.3 MembriiuneiclaseClasesiobiecte
CAP. 2
36
2.3 MembriiuneiclaseClasesiobiecte
Exemplul1:.
class dreptunghi{ double Lung, lat; public: void seteaza_dimen(double, double ); double arata_Lung();
double arata_Lat(); double calcul_arie(); }; //…………………………………………………………………………….. main()
{ dreptunghia; //…………………………………………………………………… cout<<"Aria
dreptunghiului:"<<a.calcul_arie()<<'\n'; dreptunghi*pa; pa=&a; double arie=pa->calcul_arie(); }
CAP. 2
37
2.3 MembriiuneiclaseClasesiobiecte
calendaristică). #include <iostream.h> class Data { intluna, zi, an; public: void initializ(intl, intz, inta)
{luna=l; zi=z; an=a; } intget_an() { return an; } // functiemembracare returneazaanulintget_luna() { return
luna; } // functiemembracare returneazalunaintget_zi() { return zi; } int& an_data() { return an; } /*
functiemembracare permiteschimbareavaloriidateimembrean */
CAP. 2
38
2.3 MembriiuneiclaseClasesiobiecte
Exemplul 2: continuare
int& luna_data() { return luna; } int& zi_data() { return zi; } }; main() { Data dt; dt.initializ(4, 1, 89); cout<<
"\nAnuleste: " << dt.get_an(); cout<< "\nZiuaeste: " << dt.get_zi(); cout<< "\nLunaeste: " <<
dt.get_luna(); // ------folosireametodelorcare schimbaanul, lunasiziuapentruinstantadtdt.an_data() =
90;dt.luna_data()=12; dt.zi_data()=31; cout<< "\nNoulan este: " << dt.get_an(); cout<<
"\nNoualunaeste: " << dt.get_luna();
CAP. 2
39
2.3 MembriiuneiclaseClasesiobiecte
legate de membrii statici ai unei clase. #include <iostream.h> #include <conio.h> class exemplu{ int i; //
dată membră privată, acces la ea doar prin metode public: static intcontor; // dată membră publica,
//neprotejată (scop didactic) void inc(void) {i++;} void arata_i() {cout<<"i="<<i<<'\n';}
CAP. 2
40
2.3 MembriiuneiclaseClasesiobiecte
Exerciţiu: cont
void inc_contor(void) {contor++;} void init(void) {i=0;} static void arata_contor() {cout<<"Contor=";
cout<<contor<<'\n';} static void functie(exemplu*); } a1, a2, a3;
se poate observa că metoda statică funcţie poate fi apelată ca o metodă obişnuită, sau folosind
operatorul ::. Pentru data membră statică contor se rezervă o zonă de memorie comună obiectelor a1,
a2, a3. Pentru data membră i se realizează o copie pentru fiecare instanţă a clasei. Deasemenea,
deoarece data membră contor este statică, nu aparţine unui anume obiect, ea apare prefixată de
numele clasei şi operatorul de apartenenţă.
CAP. 2
41
2.3 MembriiuneiclaseClasesiobiecte
Exerciţiu: cont
intexemplu::contor=0; //iniţialiazareadateimembrustaticevoidexemplu::functie(exemplu*pe)
{//i+=3; //eroare, nu se cunoasteobiectulcare-l posedapei pe->i++; //corect, este specificat proprietarul
lui i contor++; //variabilă statică, comună tuturor obiectelor } main() { a1.init(); a2.init(); a3.init();
//a1.i=0, a2.i=0, a3.i=0 a1.arata_i();a2.arata_i();a3.arata_i(); //i=0, i=0, i=0
CAP. 2
42
2.3 MembriiuneiclaseClasesiobiecte
Exerciţiu: cont
a1.inc(); a2.inc(); a3.inc(); //a1.i=1, a2.i=1, a3.i=1 a1.arata_i();a2.arata_i();a3.arata_i(); //i=1, i=1, i=1
a1.functie(&a1); //contor=1, i=2 exemplu::functie(&a2); //contor=2, i=2 //functie();
//incorecta1.inc_contor(); //contor=3 exemplu::arata_contor(); a2.inc_contor(); //contor=4
exemplu::arata_contor(); a3.inc_contor(); //contor=5 exemplu::arata_contor(); exemplu::arata_contor();
exemplu::contor+=100; // membrupublic; contor=105 cout<<"Contor="<<exemplu::contor<<'\n'; //
Contor=105 }
Clasesiobiecte
43
CAP. 2
44
this
, argument transmis în mod automat de către compilator. Această variabilă (locală funcţiilor membru)
reprezintă pointerul către obiectul curent (cel care apelează metoda).
CAP. 2
45
2.4 PointerulTHISClasesiobiecte
Clasesiobiecte
46
CAP. 2
47
2.5.1. Domeniulunuinume
CAP. 2
48
2.5.1. DomeniulunuinumeDacă un nume care are ca domeniu un fişier este redefinit într-un bloc inclus
în domeniul său, el poate fi folosit în acest bloc dacă este precedat de operatorul rezoluţie.
Exemplu:
#include <iostream.h> int i=80; // i declarat în afara oricărei funcţii, domeniul numelui este fişierul
main() {double i=99.9; // redeclarareavariabileii , începedomeniullocal cout<<"Valoarea lui
i="<<i<<'\n'; // Valoarea lui i=80 cout<<"Valoarea lui i="<<::i<<'\n'; } // Valoarea lui i=99.9
CAP. 2
49
2.5.1. Domeniulunuinume
Domeniul numelui unui tip de date definit printr-o clasă (structură sau uniune, deoarece acestea sunt
cazuri particulare de clase, cu toţi membrii publici) se stabileşte în mod similar domeniului oricărei
variabile. Numele unui membru al unei clase are un domeniu de tip clasă. Ca orice nume, un nume de
clasă poate fi redeclarat. Exemplu:
class a{ //…………… }; //………….. { //instrucţiune bloc aflată în domeniul numelui a double a=99;
//redeclararealuia class::a x; //x este un obiectde tipula (definitprintr-o clasă) }
CAP. 2
50
2.5.2. Vizibilitate
CAP. 2
51
Timpul de viaţă a unei variabile (obiect) este determinat de clasa de memorare a variabilei (obiectului).
În limbajul C++, alocarea dinamică a memoriei se realizează cu operatorii new şi delete.
Clasesiobiecte
52
CAP. 2
53
2.6 FunctiiinlineClasesiobiecte
La apelul unei funcţii obişnuite se întrerupe execuţia funcţiei apelante şi se execută un salt la adresa de
memorie la care se găseşte corpul funcţiei apelate. La terminarea execuţiei funcţiei apelate se revine în
funcţia apelantă, reluându-se execuţia cu instrucţiunea imediat următoare apelului de funcţie. În
situaţiile în care corpul funcţiei apelate este format din câteva instrucţiuni, operaţiile descrise anterior
(implicate în apel şi revenire) pot fi mai complicate decât un apel prin expandare (în care apelul funcţiei
în funcţia apelantă este înlocuit cu însuşi corpul funcţiei apelate). Pentru eliminarea acestor dezavantaje,
se folosesc funcţiile inline.
CAP. 2
54
2.6 FunctiiinlineClasesiobiecte
Prezenţa funcţiilor inline anunţă compilatorul să nu mai genereze instrucţiunile în cod maşină necesare
apelului şi revenirii, ceea ce conduce la mărirea timpului de compilare în favoarea micşorării timpului de
execuţie.Utilizarea funcţiilor inline se justifică doar în situaţiile în care codul generat de compilator
pentru execuţia corpului funcţiei este mai mic decât codul generat pentru apel şi revenire.
CAP. 2
55
2.6 FunctiiinlineClasesiobiecte
Practic, funcţiile care au corpul format din maximum trei instrucţiuni şi nu conţin instrucţiuni repetitive
(for, while, do-while), pot fi declarate inline. Declararea unei funcţii inline se realizează explicit,
specificând în antetul funcţiei respective cuvântul cheie inline.
CAP. 2
56
2.6 FunctiiinlineClasesiobiecte
În cazul metodelor unei clase, dacă acestea sunt definite în interiorul clasei, ele sunt considerate,
implicit, funcţii inline (în exerciţiul anterior, funcţiile arată_Lung, arată_Lat şi calcul_arie sunt, implicit,
funcţii inline). Există şi posibilitatea de a declara metoda la declararea clasei şi de a specifica, explicit, că
este funcţie inline la definirea funcţiei.
CAP. 2
57
2.6 FunctiiinlineClasesiobiecte
anterior să fie funcţie inline, fără a modifica declaraţia tipului dreptunghi, se poate proceda astfel: class
dreptunghi{ // . . . public: // . . . void seteaza_dimen(double, double );// declarareametodei// . . . }; inline
void dreptunghi::seteaza_dimen(double L, double l) //funcţieinline, explicit {Lung=L; lat=l;} Prefixarea
definiţiei funcţiei seteaza_dimen cu cuvântul cheie inline este echivalentă cu definirea metodei în cadrul
declaraţiei clasei dreptunghi.
Clasesiobiecte
58
PROGRAMAREACALCULATOARELORŞILIMBAJEDE PROGRAMAREII
59
Clasesiobiecte
60
CAP. 2
61
http://www.unixinside.org/papers/C++-Book/cap3.htmlConstructori..
62
CAP. 2
SFARSITUL Capitolului2
Clasesiobiecte
Programareacalculatoarelorşilimbajede programareII