Sunteți pe pagina 1din 10

CAPITOLUL 2

Clasesiobiecte
3
Clasesiobiecte
4
1. Definitiaclaselor, accesla membri2. Instantiereaclaselor3. Membriiuneiclase4.
Pointerulthis5. Domeniulnumelui, vizibilitatesi timp de viata6. Functiiinline7.
Constructorisidestructori8. Tablouride obiecte9. Functiiprietene(friend)CAP. 2
CAP. 2
5
2.1Definitiaclaselor, accesla membri
2.1.1. LEGATURA CLASA-STRUCTURA-UNIUNE
Oclasa reprezinta un tip abstract de date, care �ncapsuleaza 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 sau metode).
�nlimbajulC+
+,structurilesiuniunilereprezintacazuriparticularealeclaselor,put�ndaveanunumaidate
membresauc�mpuridedate,darsifunctiimembre.
Clasesiobiecte
CAP. 2
6
2.1Definitiaclaselor, accesla membri
2.1.1. LEGATURA CLASA-STRUCTURA-UNIUNE Diferenta �ntre structurisiuniuniconsta �n
faptul ca la uniuni, pentru memorarea valorilor datelor membre se foloseste -�n
comun -aceeasi zona de memorie.structuri si uniuni vsclase->>> modul de acces la
membri: la structuri si uniunimembrii (datele si metodele) sunt implicit publici,
iar la clase-implicit privati (membrii sunt �ncapsulati).
Clasesiobiecte
CAP. 2
7
2.1Definitiaclaselor, accesla membri
2.1.1. LEGATURA CLASA-STRUCTURA-UNIUNE Lipsa unor modalitati de protectie a datelor
face ca tipurile de date introduse prin structurisau uniunisa nu poata fi strict
controlate �n ceea ce priveste operatiile executate asupra lor. �n cazul claselor,
modul de acces la membrii tipului de date (�n scopul protejarii acestora) poate fi
schimbat prin utilizarea modificatorilor de control ai accesului: public, private,
protected.
Clasesiobiecte
CAP. 2
8
2.1Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
Exercitiul 1: Sa se defineasca tipul de date dreptunghi, cu ajutorul unei
structuri, a unei uniuni si a unei clase. Datele membre sunt lungimea si latimea
(variabilele Lung, lat). Functiilemembresunt: void seteaza_dimen(double, double)
-primeste ca argumente doua valori reale si initializeaza datele membre cu valorile
argumentelor. double arata_Lung( ) -returneaza valoarea lungimii (a datei membre
Lung). double arata_Lat( ) -returneaza valoarea latimii (a datei membre lat).
double calcul_arie( )-returneaza valoarea ariei dreptunghiului.
CAP. 2
9
2.1 Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
//a) Implementareatipuluidreptunghicu ajutoruluneistructuri
. #include <iostream.h> structdreptunghi{ double Lung, lat;void
seteaza_dimen(double, double ); //prototipulfunctieiseteaza_dimendouble
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; double l1, l2; cout<<"Lungime="; cin>>l1;
cout<<"Latime="; cin>>l2;a.seteaza_dimen(l1, l2); // sau: Lung=l1; lat=l2;
cout<<"Dimensiuniledreptunghiuluisunt:"; cout<<a.arata_Lung(); cout<<"
si"<<a.arata_Lat()<<'\n'; cout<<"Aria dreptunghiului:"<<a.calcul_arie()<<'\n';
cout<<"Dimensstructurii:"<<sizeof(a)<<'\n'; }
Se defineste tipul dreptunghi printr-o structura.Tipul contine at�t datele membre,
c�t si metodele care implementeaza operatiile care pot fi realizate asupra
variabilelor de tipul dreptunghi. Metodele arata_Lung, arata_Lat, calcul_arie sunt
definite �n structura (uniune). Metoda seteaza_dimen este doar declarata �n
interiorul structurii (uniunii), fiind abia apoi definita.
CAP. 2
10
2.1Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
//b) Implementareatipuluidreptunghicu ajutoruluneiuniuni
#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';}
�n varianta de implementare cu uniune pentru memorarea valorilor datelor membre se
utilizeaza aceeasi zona de memorie, astfelincatpentru a pastra valorile at�t pentru
lungimea dreptunghiului, c�t si pentru latime, metodele au fost modificate.Metodele
arata_Lung, arata_Lat, calcul_arie sunt definite �n structura (uniune). Metoda
seteaza_dimen este doar declarata �n interiorul structurii (uniunii), fiind abia
apoi definita.
CAP. 2
11
2.1Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
//c) Implementareatipuluidreptunghicu ajutoruluneiclase
#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.
Daca pentru metode nu s-ar fi folosit modificatorul de acces public, metodele nu ar
fi putut fi folosite �n functia main.
CAP. 2
12
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
CAP. 2
13
2.1 Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
Clasaestedescriereaabstractaaobiectelorcuajutorulatributelorsimetodelor.Oclasasepoa
tereprezentaprintr-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
2.1Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Modulde declararea uneiclaseestesimilar celuide declararea structurilorsia
uniunilor:
Clasesiobiecteclass[<nume_tip>]{ <modificator_control_acces>:
<lista_declaratii_membri>; } [<lista_variabile>];
CAP. 2
15
2.1Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
Membriiuneiclasesunt: ?Datele membre -datele declarate �n cadrul clasei;
( caracteristicileobiectelor )?Metodele-functiile membre, functiile declarate sau
definite �n cadrul clasei. ( comportamentulobiectelor)Se admite ca �n cadrul
declaratiei de clasa sa se specifice doar prototipurile functiilor membre,
definitiile put�nd fi facute oriunde �n cadrul aceluiasi fisier, sau �ntr-un alt
fisier.
CAP. 2
16
2.1Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
Pentrumembriicareapar�nlista_membrilorsepoateprecizaunanumitmoddeacces.Modificator_
control_accespoatefipublic,privatesauprotected(eventualfriend).Dacanusespecifica,es
teconsideratcelimplicit(private).
CAP. 2
17
2.1Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
Modificatoruldeaccespublicseutilizeazapentrumembriicaredorimsafieneprotejati,ultimi
idoimodificatoriasigur�ndprotectiamembrilordindomeniuldeactiunealor.Membriicuaccesp
rivatepotfiaccesatinumaiprinmetodeleclasei(sauprinfunctiileprietene).Ceicuaccesprot
ectedposedacaracteristicilecelorprivatiiar,�nplus,potfiaccesatisidinclaselederivate
.Specificatoriimoduluideaccespotapare�ndeclarareaclaseidemaimulteori,�noriceordine.
CAP. 2
18
2.1Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
?private: membrii(date simetode) la care accesulesteprivate pot fi
accesatidoarprinmetodeleclasei(nivelde accesimplicit); ?protected: acestimembripot
fi accesatiprinfunctiilemembreale claseisifunctiilemembreale claseiderivate; ?
public: membrii la care accesul este public pot fi accesati din orice punct al
domeniului de existenta a clasei respective; ?friend: acestimembripot fi
accesatiprinfunctiilemembreale functieiprietenespecificate.
Accesulla membriiuneiclase
CAP. 2
19
2.1Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
ClasesiobiecteDomeniulunuimodificatordeaccestinedinpunctul�ncare
aparemodificatorulrespectiv,p�nalasf�rsituldeclaratiei
claseisaual�nt�lniriialtuimodificatordeacces.
classdreptunghi{ double Lung, lat; public: void seteaza_dimen(double, double );
private:double arata_Lung() {return Lung;} double arata_Lat() {return lat;} public:
double calcul_arie() {return Lung*lat;} };
CAP. 2
20
2.1Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
Observatie:�nlimbajulC++,�ncazultipurilordedate
definitecuajutorulstructurilor,sepotaplicamodificatorii
deacces.�ncazultipurilordefinitecuajutoruluniunilor,accesulimplicit(public)nupoatef
imodificat.
CAP. 2
21
2.1Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
Exemplu:class masina{char *culoare; // data membru la care accesul este, implicit,
privateint capacit_cil; // data membru la care accesul este, implicit,
privatepublic:void citire_date();//metoda cu acces public, care permite
introducerea datelor despre o instanta a claseiint ret_capacit(); //metoda cu acces
public};Membrii culoare si capacitate_cil (accesul private) pot fi accesati doar
prin intermediul metodelor clasei.
CAP. 2
22
2.1 Definitiaclaselor, accesla membri
2.1.2. DECLARAREA CLASELOR
Clasesiobiecte
Exemplu:
classpersoana{char *nume; //data membru privatapublic:void citire_inf_pers();
//metoda publicaprivate:int varsta; //data membru privata};
CAP. 2
23
2.1Definitiaclaselor, accesla membri
2.1.2. DECLARAREACLASELOR
Clasesiobiecte
Sa se descrieo clasa�complex� cepermitememorareapartiirealesia celeiimaginare�ntr-
un numarcomplex sicalculeazamodululacestuia. Datelenu vorsuferinicio
protectie�ninteriorulclaseiastfel�nc�tse poateaveaaccesdirect la acesteadin afara.
Sa se realizezeun program care folosesteaceastaclasasicitestedate �ntr-un
numarcomplex afis�ndu-l �mpreunacu modululsau.
Clasesiobiecte
24
1. Definitiaclaselor, accesla membri2. Instantiereaclaselor3. Membriiuneiclase4.
Pointerulthis5. Domeniulnumelui, vizibilitatesi timp de viata6. Functiiinline7.
Constructorisidestructori8. Tablouride obiecte9. Functiiprietene(friend)CAP. 2
CAP. 2
25
2.2InstantiereaclaselorClasesiobiecte
Instantierea unei clase consta �n declararea unor variabile de tip definit cu
ajutorul clasei. O astfel de variabila, numita obiect (sau instanta a clasei) este
o data de tip definit prin clasa. Daca, �n functia main, se declara obiectul
(variabila) a de tip dreptunghi, punem ca obiectul a este o instanta a clasei
dreptunghi. Se pot declara oric�te obiecte (instante) ale clasei. Asa cum se
observa din exemplu, declararea obiectelor de un anumit tip are o forma
asemanatoare 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
1. Definitiaclaselor, accesla membri2. Instantiereaclaselor3. Membriiuneiclase4.
Pointerulthis5. Domeniulnumelui, vizibilitatesi timp de viata6. Functiiinline7.
Constructorisidestructori8. Tablouride obiecte9. Functiiprietene(friend)CAP. 2
CAP. 2
29
2.3MembriiuneiclaseClasesiobiecte
Accesareamembriloruneiclasese face cain cazulstructurilordin limbajulC:
obiect.VariabilaMembra= valoare
pentruaccesulla o variabilamembra, si
obiect.FunctieMembra()
pentruapelareauneifunctiimembre.
CAP. 2
30
2.3MembriiuneiclaseClasesiobiecte
Datele membru se aloca distinct pentru fiecare instanta (atribute ale instantei) a
clasei (pentru declararea obiectelor a, b, c, d de tip dreprunghi). Exceptia de la
aceasta regula o constituie datele membru statice, care exista �ntr-un singur
exemplar, comun, pentru toate instantele clasei.
CAP. 2
31
2.3MembriiuneiclaseClasesiobiecte
Exemplu:
classPoint {unsigned x, y;unsigned long Arie() { return x * y; };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; }
Pentruexemplificaresaconsideramo implementarea notiuniide punct.
Cavariabilemembreavemnevoiedoarde coordonatelex siy care definescpozitiain spatiua
unuipunct.
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 functie membru se apeleaza totdeauna �n str�nsa dependenta cu un obiect din clasa
respectiva. Legatura dintre obiect si functia membra se face prin operatorul .sau
operatorul ->, dupa cum obiectul este desemnat prin numesau prin pointer.
CAP. 2
34
2.3 MembriiuneiclaseClasesiobiecte
�nplus, metodelestaticepot fi apelateindependent de un obiectal clasei,
folosindoperatorulde rezolutie(::). Accesul la o metoda presupune o activitate de
adresare, transparenta utilizatorului. De fapt, �n interiorul obiectului creat se
afla doar punctatori la clasa din care provin. �n interiorul definitiei clasei se
aloca o singura copie a fiecarei functie membra si punctatorii respectiv, prin care
obiectul va avea acces la metoda respectiva. Exceptia de la aceasta regula o
constituie metodele virtuale .
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
Exemplul 2: Se implementeaza tipul Data (pentru data
calendaristica). #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
Exercitiu: Sa urmarim exercitiul urmator, care ilustreaza problemele
legate de membrii statici ai unei clase. #include <iostream.h> #include <conio.h>
class exemplu{ int i; // data membra privata, acces la ea doar prin metode public:
static intcontor; // data membra publica, //neprotejata (scop didactic) void
inc(void) {i++;} void arata_i() {cout<<"i="<<i<<'\n';}
1
CAP. 2
40
2.3 MembriiuneiclaseClasesiobiecte
Exercitiu: 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 ca metoda statica functie poate fi apelata ca o metoda obisnuita,
sau folosind operatorul ::. Pentru data membra statica contor se rezerva o zona de
memorie comuna obiectelor a1, a2, a3. Pentru data membra i se realizeaza o copie
pentru fiecare instanta a clasei. Deasemenea, deoarece data membra contor este
statica, nu apartine unui anume obiect, ea apare prefixata de numele clasei si
operatorul de apartenenta.
/
CAP. 2
41
2.3 MembriiuneiclaseClasesiobiecte
Exercitiu: cont
intexemplu::contor=0;
//initialiazareadateimembrustaticevoidexemplu::functie(exemplu*pe) {//i+=3;
//eroare, nu se cunoasteobiectulcare-l posedapei pe->i++; //corect, este specificat
proprietarul lui i contor++; //variabila statica, comuna 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
Exercitiu: 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
1. Definitiaclaselor, accesla membri2. Instantiereaclaselor3. Membriiuneiclase4.
Pointerulthis5. Domeniulnumelui, vizibilitatesi timp de viata6. Functiiinline7.
Constructorisidestructori8. Tablouride obiecte9. Functiiprietene(friend)CAP. 2
CAP. 2
44
2.4 PointerulTHISClasesiobiecteFiecare functie membra poseda un argument ascuns,
numit
this
, argument transmis �n mod automat de catre compilator. Aceasta variabila (locala
functiilor membru) reprezinta pointerul catre obiectul curent (cel care apeleaza
metoda).
CAP. 2
45
2.4 PointerulTHISClasesiobiecte
Sa reimplementam metoda calcul_arie, folosind pointerulTHISExemplu:
class dreptunghi{ double Lung, lat; public: //������������������.. void
seteaza_dimen(double, double); }; voiddreptunghi::seteaza_dimen(double L, double l)
{//Lung=L; lat=l; this->Lung=L; this->lat=l;} Deoarece o metoda statica se apeleaza
independent de un obiect al clasei, pointerul this nu mai poate fi utilizat.
Clasesiobiecte
46
1. Definitiaclaselor, accesla membri2. Instantiereaclaselor3. Membriiuneiclase4.
Pointerulthis5. Domeniulnumelui, vizibilitatesi timp de viata6. Functiiinline7.
Constructorisidestructori8. Tablouride obiecte9. Functiiprietene(friend)CAP. 2
CAP. 2
47
2.5 Domeniulnumelui, vizibilitatesi timp de viataClasesiobiecte
2.5.1. Domeniulunuinume
Unuinume�icorespundeun domeniu, specificatprindeclaratiavariabilei. �nfunctiede
pozitiadeclaratiei(definirii) unuinume, �nlimbajulC++, domeniulpoatefi:?
local(dacanumeleeste declarat�ntr-un bloc); ?fisier(daca numele este declarat �n
afara oricarui bloc sau declaratie (definitie) de clasa); ?clasa.
CAP. 2
48
2.5 Domeniulnumelui, vizibilitatesi timp de viataClasesiobiecte
2.5.1. DomeniulunuinumeDaca un nume care are ca domeniu un fisier este redefinit
�ntr-un bloc inclus �n domeniul sau, el poate fi folosit �n acest bloc daca este
precedat de operatorul rezolutie.
Exemplu:
#include <iostream.h> int i=80; // i declarat �n afara oricarei functii, domeniul
numelui este fisierul 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 Domeniulnumelui, vizibilitatesi timp de viataClasesiobiecte
2.5.1. Domeniulunuinume
Domeniul numelui unui tip de date definit printr-o clasa (structura sau uniune,
deoarece acestea sunt cazuri particulare de clase, cu toti membrii publici) se
stabileste �n mod similar domeniului oricarei variabile. Numele unui membru al unei
clase are un domeniu de tip clasa. Ca orice nume, un nume de clasa poate fi
redeclarat. Exemplu:
class a{ //����� }; //����.. { //instructiune bloc aflata �n domeniul numelui a
double a=99; //redeclararealuia class::a x; //x este un obiectde tipula
(definitprintr-o clasa) }
CAP. 2
50
2.5 Domeniulnumelui, vizibilitatesi timp de viataClasesiobiecte
2.5.2. Vizibilitate
Domeniulde vizibilitatea uneivariabile(obiect) estedeterminatde clasade memorarea
variabilei(obiectului). De obicei, domeniulde vizibilitateal unuinumecoincide cu
domeniulnumelui.
CAP. 2
51
2.5 Domeniulnumelui, vizibilitatesi timp de viataClasesiobiecte
2.5.2. Timpde viata
Timpul de viata a unei variabile (obiect) este determinat de clasa de memorare a
variabilei (obiectului). �n limbajul C++, alocarea dinamica a memoriei se
realizeaza cu operatorii new si delete.
Clasesiobiecte
52
1. Definitiaclaselor, accesla membri2. Instantiereaclaselor3. Membriiuneiclase4.
Pointerulthis5. Domeniulnumelui, vizibilitatesi timp de viata6. Functiiinline7.
Constructorisidestructori8. Tablouride obiecte9. Functiiprietene(friend)CAP. 2
CAP. 2
53
2.6 FunctiiinlineClasesiobiecte
La apelul unei functii obisnuite se �ntrerupe executia functiei apelante si se
executa un salt la adresa de memorie la care se gaseste corpul functiei apelate. La
terminarea executiei functiei apelate se revine �n functia apelanta, relu�ndu-se
executia cu instructiunea imediat urmatoare apelului de functie. �n situatiile �n
care corpul functiei apelate este format din c�teva instructiuni, operatiile
descrise anterior (implicate �n apel si revenire) pot fi mai complicate dec�t un
apel prin expandare (�n care apelul functiei �n functia apelanta este �nlocuit cu
�nsusi corpul functiei apelate). Pentru eliminarea acestor dezavantaje, se folosesc
functiile inline.
CAP. 2
54
2.6 FunctiiinlineClasesiobiecte
Prezenta functiilor inline anunta compilatorul sa nu mai genereze instructiunile �n
cod masina necesare apelului si revenirii, ceea ce conduce la marirea timpului de
compilare �n favoarea micsorarii timpului de executie.Utilizarea functiilor inline
se justifica doar �n situatiile �n care codul generat de compilator pentru executia
corpului functiei este mai mic dec�t codul generat pentru apel si revenire.
CAP. 2
55
2.6 FunctiiinlineClasesiobiecte
Practic, functiile care au corpul format din maximum trei instructiuni si nu contin
instructiuni repetitive (for, while, do-while), pot fi declarate inline. Declararea
unei functii inline se realizeaza explicit, specific�nd �n antetul functiei
respective cuv�ntul cheie inline.
inline <tip_val_ret> <nume_fct> (<lista_declar_par_formali>);
CAP. 2
56
2.6 FunctiiinlineClasesiobiecte
�n cazul metodelor unei clase, daca acestea sunt definite �n interiorul clasei, ele
sunt considerate, implicit, functii inline (�n exercitiul anterior, functiile
arata_Lung, arata_Lat si calcul_arie sunt, implicit, functii inline). Exista si
posibilitatea de a declara metoda la declararea clasei si de a specifica, explicit,
ca este functie inline la definirea functiei.
CAP. 2
57
2.6 FunctiiinlineClasesiobiecte
Exemplu: Daca se doreste ca metoda seteaza_dim din exercitiul
anterior sa fie functie inline, fara a modifica declaratia tipului dreptunghi, se
poate proceda astfel: class dreptunghi{ // . . . public: // . . . void
seteaza_dimen(double, double );// declarareametodei// . . . }; inline void
dreptunghi::seteaza_dimen(double L, double l) //functieinline, explicit {Lung=L;
lat=l;} Prefixarea definitiei functiei seteaza_dimen cu cuv�ntul cheie inline este
echivalenta cu definirea metodei �n cadrul declaratiei clasei dreptunghi.
Clasesiobiecte
58
1. Definitiaclaselor, accesla membri2. Instantiereaclaselor3. Membriiuneiclase4.
Pointerulthis5. Domeniulnumelui, vizibilitatesi timp de viata6. Functiiinline7.
Constructorisidestructori8. Tablouride obiecte9. Functiiprietene(friend)CAP. 2
Clasesiobiecte
PROGRAMAREACALCULATOARELORSILIMBAJEDE PROGRAMAREII
59
1. Definitiaclaselor, accesla membri2. Instantiereaclaselor3. Membriiuneiclase4.
Pointerulthis5. Domeniulnumelui, vizibilitatesi timp de viata6. Functiiinline7.
Constructorisidestructori8. Tablouride obiecte9. Functiiprietene(friend)CAP. 2
Clasesiobiecte
1
60
1. Definitiaclaselor, accesla membri2. Instantiereaclaselor3. Membriiuneiclase4.
Pointerulthis5. Domeniulnumelui, vizibilitatesi timp de viata6. Functiiinline7.
Constructorisidestructori8. Tablouride obiecte9. Functiiprietene(friend)CAP. 2
CAP. 2
61
2.1 Definitiaclaselor, accesla membriClasesiobiecte
http://www.unixinside.org/papers/C++-Book/cap3.htmlConstructori..
62
CAP. 2
SFARSITUL Capitolului2
Clasesiobiecte
1.Conceptede bazaale programariiorientate
peobiecte2.Clasesiobiecte3.Supraincarcareaoperatorilor4.Creareaierarhiilorde
clase5.Operatiide intrare/ iesirein limbajulC++6.Implementariale modelelorde
date7.Functiisiclasegenerice8.ExceptiisitratareaacestoraCuprinsulCursului
2
Programareacalculatoarelorsilimbajede programareII

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