Documente Academic
Documente Profesional
Documente Cultură
Clasesiobiecte
(continuare)
Clasesiobiecte
CAP. 2
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ţiileinline.
CAP. 2
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
2.6 FunctiiinlineClasesiobiecte
while), pot fi declarate inline. Declararea unei funcţii inline se realizează explicit, specificând în antetul
funcţiei respective cuvântul cheie inline.
inline <tip_val_ret> <nume_fct> (<lista_declar_par_formali>);
CAP. 2
2.6 FunctiiinlineClasesiobiecte
În cazul metodelor unei clase, dacă acestea sunt definite în interiorul clasei, ele sunt considerate,
implicit, funcţii inline. Există şi posibilitatea de a declara metoda la declararea
definirea funcţiei.
CAP. 2
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.
CAP. 2
10
2.6 FunctiiinlineClasesiobiecte
Exemplu:tipuldedatecomplex
Datelemembru:parterealăparteimaginară.Operatiile:Citireauneidatedetipcomplex(citireaval.ptrparte
arealăsiceaimaginară);afisareauneidatedetipcomplex;calcululmodululuiunuicomplex;calcululargume
ntuluiunuicomplex;incrementareapărtiiimaginare;decrementareapărtiiimaginare;functiicarereturnea
zăvaloareapărtiirealesiapărtiiimaginareauneidatedetipcomplex;adunareaadouădatedetipcomplex;înm
ulttireaadouădatedetipcomplex.
CAP. 2
11
2.6 FunctiiinlineClasesiobiecte
#include <iostream.h> #include <math.h> #define PI 3.14159 class complex{ double real, imag; public:
intcitire(); void afisare(); double modul(); double arg(); void incrpi() /*incrementeaza partea imaginara;
FUNCŢIE INLINE, implicit, fiind definită în interiorul clasei */ { imag++;} inlinevoid decrpi();
//decrementarea partii imaginare double retreal(); //returneazapartearealadouble retimag();
//returneazaparteaimaginaravoidadun_c(complex, complex); //aduna2 numerecomplexe void
inm_c(complex*, complex*); //produsula 2 numerecomplexe};
CAP. 2
12
2.6 FunctiiinlineClasesiobiecte
CAP. 2
13
2.6 FunctiiinlineClasesiobiecte
Clasesiobiecte
14
CAP. 2
15
2.7 ConstructorisidestructoriClasesiobiecte
Este indicat ca în cazul în care datele structurate au ca membrii pointeri, să se aloce memorie în mod
dinamic. 2.7.1. INIŢIALIZAREA DATELOR La declararea datelor de tip predefinit sau definit de utilizator
prin structuri, uniuni sau clase, compilatorul alocă o zonă de memorie corespunzătoare tipului respectiv.
CAP. 2
16
2.7 ConstructorisidestructoriClasesiobiecte
2.7.1. INIŢIALIZAREA DATELOR În general, datele statice sunt iniţializate automat cu valoarea 0. Celelalte
categorii de date, nu sunt iniţializate. Iniţializarea datelor simple de tip predefinit se poate realiza după
declararea acestora, sau în momentul declarării. Exemple:
CAP. 2
17
2.7 ConstructorisidestructoriClasesiobiecte
2.7.1. INIŢIALIZAREA DATELOR Iniţializarea datelor structurate se poate realiza în momentul declarării
acestora, prin listele de iniţializare. Exemple:
CAP. 2
18
2.7 ConstructorisidestructoriClasesiobiecte
2.7.1. INIŢIALIZAREA DATELOR În cazul tipurilor de date definite cu ajutorul claselor, care au date
membru private, listele de iniţializare nu pot fi utilizate. Pentru a elimina aceste neajunsuri, limbajul C++
oferă mecanismul constructorilorşi al desctructorilor.
CAP. 2
19
2.7 ConstructorisidestructoriClasesiobiecte
sunt apelaţi de fiecare dată când se crează noi instanţe ale clasei. Constructoriiasigură iniţializarea
corectă a tuturor variabilelor membre ale obiectelor unei clase şi constituie o garanţie a
faptului că iniţializarea unui obiect se realizează o singură dată.
CAP. 2
20
2.7 ConstructorisidestructoriClasesiobiecte
2.7.2.
CONSTRUCTORIOclasăpoateaveamaimulţiconstructori,carediferăîntreeiprinnumărulşitipulparametrilora
cestora.AcestlucruesteposibildeoarecelimbajulC++permitesupradefinirea(overloading)funcţiilor.
CAP. 2
21
2.7 ConstructorisidestructoriClasesiobiecte
2.7.2.
CONSTRUCTORISupraîncarcarea(supradefinirea)reprezintăposibilitateadeaatribuiunuinumemaimultese
mnificaţii,caresuntselectateînfuncţiedecontext.Practic,sepotdefinifuncţiicuacelaşinume,darculistedepara
metridiferite,canumărşi/saucatipurideparametri.Înmomentulapeluluifuncţiei,selectareafuncţieiadecvate
sefaceînurmacomparăriitipurilorparametrilorefectivicutipurileparametrilorformali.Deaceea,declarareau
norfuncţiicuacelaşinumeşiacelaşisetdeparametriesteilegalăşiestesemnalatăcaeroarelacompilare.
CAP. 2
22
2.7 ConstructorisidestructoriClasesiobiecte
2.7.2. CONSTRUCTORILa întâlnirea declaraţiei unui obiect, se apelează automat un constructor al clasei
respective. La fiecare instanţiere a clasei se alocă memorie pentru datele membre. Deci pentru fiecare
obiect declarat se alocă memorie pentru datele membre ale clasei.Excepţie de la această regulă o
constituie datele membru statice. Acestea figurează într-un singur exemplar pentru toate instanţele
clasei respective. Funcţiile membru există într-un singur exemplar pentru toate instanţele clasei.
Ordinea în care sunt apelaţi constructorii corespunde ordinii declarării obiectelor.
CAP. 2
23
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
24
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
25
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
26
2.7 ConstructorisidestructoriClasesiobiecte
explicit, compilatorul nu mai creează unul implicit. class complex { double real,imag; public:
complex(double x,doubley) // funcţieconstructorinline{ real=x; imag=y;} }; intmain() {complex z1(2,3);
complex z; // Eroare : nu există constructor implicit }
CAP. 2
27
2.7 ConstructorisidestructoriClasesiobiecte
28
2.7 ConstructorisidestructoriClasesiobiecte
2.7.2.1 Constructoricu listede initializareÎn exemplele anterioare, constructorii iniţializau membrii unui
obiect prin atribuiri. Există şi modalitatea de a iniţializa membrii printr-o listă de instanţiere (iniţializare),
care apare în implementarea constructorului, între antetul şi corpul acestuia. Lista conţine operatorul
, urmat de numele fiecărui membru şi valoarea de iniţializare, în ordinea în care membrii apar în
definiţia clasei.
CAP. 2
29
2.7 ConstructorisidestructoriClasesiobiecte
iniţializareculistădeinstanţiere.classcomplex{doublereal,imag;public:complex(doublex,doubley);//constr
uctor};complex::complex(doublex,doubley):real(x),imag(y)//Listădeiniţializareamembrilor{return;}intmai
n()
{complexz1(1,3),z2(2,3);}/////////////////Sau:classcomplex{doublereal,imag;public:complex(doublex,dou
bley):real(x),imag(y){}//constructorculistădeiniţializare};
CAP. 2
30
2.7 ConstructorisidestructoriClasesiobiecte
2.7.2.2 Constructoride copierePentru o clasă, se poate defini un contructor de copiere, care să permită
copierea obiectelor. Deoarece parametrii unui constructor nu pot fi de tipul definit de clasa al cărei
membru este, constructorul de copiere pentru clasa cu numele cls, are, de obicei, prototipul:
CAP. 2
31
2.7 ConstructorisidestructoriClasesiobiecte
2.7.2.2 Constructoride copiereParametrul transmis prin referinţă este obiectul a cărui copiere se
realizează, modificatorul de acces constinterzicând modificarea acestuia. Constructorul de copiere poate
avea şi alţi parametri, care trebuie să fie impliciţi. Dacă programatorul nu defineşte un constructor de
copiere, compilatorul generează un asemenea constructor, implicit. În situaţiile în care un tip de date
are ca membrii pointeri, este necesară implementarea unui constructor pentru iniţializare (este de dorit
să se aloce dinamic memorie) şi a unui constructor de copiere.
CAP. 2
32
2.7 ConstructorisidestructoriClasesiobiecte
2.7.2.2 Constructoride copiereExemplu: Exemplul următor, în care se definesc tipurile de date Punct şi
Linie, ilustrează utilizarea constructorilor (cu parametri impliciţi, de copiere, cu liste de iniţializare)
definiţi de programator. #include <iostream.h> class Punct{public: Punct(double _x=0.0, double
_y=0.0)// Constructorcuparametriimpliciti{ x = _x; y = _y; } Punct(constPunct& p) { x = p.x, y = p.y;}
//Constructor de copierevoid afiseaza(); // Metodaafiseazaprivate:double x, y; // Datelemembreprivate
(coodonatelepunctului: abscisasiordonata)};
CAP. 2
33
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
34
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 DestructoriDestructoriisunt metode ale claselor care acţionează în sens invers, complementar, faţă
de constructori. Constructorii sunt folosiţi pentru alocarea memoriei, iniţializarea datelor membru sau
alte operaţii (cum ar fi, incrementarea unui contor pentru instanţele clasei). Constructorul este apelat în
momentul declarării obiectelor. Destructorul eliberează memoria alocată de constructori. Destructorul
este apelat automat, la ieşirea din blocul în care este recunoscut acel obiect.
CAP. 2
35
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 DestructoriProprietăţile destructorilor •Destructorul are acelaşi nume ca şi clasa a căror metodă
este; •Numeledestructoruluiesteprecedatde semnul
; •O clasăare un singurdestructor;
•Destructorul nu are parametri şi nu returnează nici o valoare (antetul nu conţine cuvântul cheie void,
iar în corpul destructorului nu apare instrucţiunea return <expresie>;); •Dacă programatorul nu a definit
un destructor, compilatorul
CAP. 2
36
2.7 ConstructorisidestructoriClasesiobiecte
care măsoară timpul scurs între 2 evenimente (evenimente date de apelul constructorului şi al
destructorului). Se foloseşte funcţia clock din ANSI C. /* fişierul timp.h, cu definirea clasei */ #if !
defined(__TIMP_H) #define __TIMP_H #include <time.h> // definestetipulclock_tsiCLK_TCK #include
<iostream.h> class Timp{public: Timp() { start = clock();} // Constructor ~Timp() // Destructor
(calculeazasiafiseazatimpul, in secunde) { clock_tstop = clock(); cout<< "Timpul= "; cout<< (stop
-start)/CLK_TCK; cout<< " secunde" << ‘\n’; } private: clock_tstart; // pornestemasurareatimpului};
#endifClasa Timp are data membru privată start (de tipul clock_t), constructor şi destructor.
CAP. 2
37
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 Destructori/* fisierulde test, timptest.cpp, in care se utilizeazatipulde date Timp*/ #include
"timp.h" static void functie(unsigned long cont) { Timpt; // Declarareaobiectuluit, de tip
Timpfor(unsigned long i = 0; i < cont; i++) { double a = (double)(i-1); double b = (double)(i+1); double c =
(double)(i+i); double d = a*b -c; } } intmain() { unsigned long val_cont; cout<< "Valoarefinala: "; cin>>
val_cont; functie(val_cont); }
Se execută prelucrările din corpul funcţiei (calculul valorilor variabilelor a, b, c şi d pentru fiecare valoare
a contorului i). La ieşirea din funcţie, este apelat destructorul (definit de programator) clasei Timp (se
distruge obiectul t, variabilă locală funcţiei). Astfel, în variabila stop, variabilă locală destructorului, se
memorează valoarea returnată de funcţia clock (deci timpul momentului de încheiere a execuţiei
corpului funcţiei funcţie). Diferenţa între cele 2 evenimente (începutul execuţiei corpului funcţiei funcţie
şi sfârşitul acesteia) este transformată în secunde şi afişată.
CAP. 2
38
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 DestructoriExerciţiul2:
Să se definească tipul punct, cu datele membre x şi y, reprezentând abscisa şi ordonata unui punct.
Operaţiilecare pot fi realizate asupra obiectelor de tip punct, sunt: •afişare (afişează coordonatele unui
punct), •deplasare (deplasează un punct, noile coordonate ale punctului fiind obţinute prin adunarea
unor valori transmise ca parametri, la valorile anterioare ale coordonatelor), •abscisa (returnează
valoarea abscisei), •ordonata (returnează valoarea ordonatei). Se vor implementa, deasemenea,
constructor cu parametri impliciţi, constructor având ca parametri valorile abscisei şi a ordonatei,
constructor de copiere şi destructor.
CAP. 2
39
2.7 ConstructorisidestructoriClasesiobiecte
#include <iostream.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> //CLASA PUNCT class
punct{ double x,y; public: punct() {x=0;y=0; cout<<"Constr. implicitpentrupunct("<<x<<","<<y<<")\n";}
punct(double,double); //constructor initializarepunct(punct&); //constructor copiere~punct();
//destructor double abscisa(){return x;} double ordonata(){return y;} void afisare(); void
deplasare(double,double); };
CAP. 2
40
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 DestructoriSă se definească tipul segment, cu datele membre A şi B, de tip punct, reprezentând
capetele unui segment (originea şi vârful). Operaţiilecare pot fi realizate asupra obiectelor de tip
segment, sunt: •afişare (afişează coordonatele capetellor segmentului),•deplasare (translatează un
segment, deplasând capetele acestuia cu valorile transmise ca parametri), •origine (returnează originea
segmentului), vârf (returnează vârful segmentului). Se vor implementa, deasemenea, constructor,
constructor de copiere şi destructor. Săse testezetipurilede date punctşisegment.
CAP. 2
41
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
42
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 Destructori//METODELE CLASEI PUNCT punct::punct(double valx,doublevaly)
{ x=valx;y=valy;cout<<"Constructor punct("<<x<<","<<y<<")\n";} punct::~punct() {cout<<"Destructor
punct("<<x<<","<<y<<")\n";} punct::punct( punct&P) {x=P.x;y=P.y;cout<<"Constructor copiere"; cout<<"
pct("<<x<<","<<y<<")\n";} voidpunct::deplasare(double dx,doubledy) {x+=dx; y+=dy;} void
punct::afisare(){ cout<<"Punct("<<x<<','<<y<<')';}
CAP. 2
43
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
44
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
45
2.7 ConstructorisidestructoriClasesiobiecte
/
CAP. 2
46
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
47
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
48
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
49
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 Destructorisegment S2=S1; /* Constr. implicit pentru punct(0,0) (pentru S2.A) Constr. implicit
pentrupunct(0,0) (pentruS2.B) Constructor copieresegment [Punct(107.8,979.6)Punct(95.18,1008.897)]
Destructor segment [Punct(107.8,979.6),Punct(95.18,1008.897)]*/ cout<<"Segment S2
obtinutprincopiere:"; S2.afisare(); // Segment S2 obtinutprincopiere:
[Punct(107.8,979.6),Punct(95.18,1008.897)] cout<<"Iesiredinmain\n"; // Iesiredinmain }
CAP. 2
50
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 Destructori/* La ieşirea din funcţia main, deci la terminarea duratei de viaţă a obiectelor, se
apelează automat destructorii, în ordinea inversă în care au fost apelaţi constructorii, astfel: Destructor
segment [Punct(107.8,979.6),Punct(95.18,1008.897)] (pentrusegmentulS2) Destructor punct
(95.18,1008.897) (pentru membrii B, respectiv A, ai segmentului S2: S2.B, apoi S2.A) Destructor
punct(107.8,979.6) Destructor punct(7.8,-20.4) (pentruCC) Destructor punct(1,2) (pentruC) Destructor
punct(1,2) (pentruD) Destructor segment [Punct(107.8,979.6),Punct(95.18,1008.897)]
(pentrusegmentulS1) Destructor punct (95.18,1008.897) (pentru membrii B, respectiv A, ai segmentului
S1: S1.B, apoi S1.A) Destructor punct(107.8,979.6)
CAP. 2
51
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
52
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 DestructoriExerciţiul evidenţiază următoarele probleme: 1. În situaţia în care o clasă C1 are ca date
membre obiecte ale altei clase C2 (clasa segment are ca date membre obiecte de tipul punct), la
construirea unui obiect din C1, se apelează întâi constructorul C2 pentru membrii (de tip C2), apoi
constructorul C1. Un astfel de exemplu îl constituie declararea segmentului S: segment S(P,Q); Se
apelează întâi constructorul implicit al clasei punct pentru membrii A şi B ai segmentului S (deci pentru
S.A şi S.B), apoi constructorul clasei segment (figura). La distrugerea obiectului din clasa C1, destructorii
sunt apelaţi în ordinea inversă constructorilor (întâi se apelează destructorul clasei segment -învelişul
exterior, apoi destructorul pentru membrii de tip punct).
CAP. 2
53
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 Destructori2. Să revedem secvenţa: punct D(1,2); punct C; C=D; În acest caz, se realizează o
atribuire, membru cu membru, echivalentă cu: C.x=D.xşiC.y=D.y. 3. Să revedem secvenţa: punctCC=C; În
acest caz, se apelează constructorul de copiere, care crează punctul CC prin copierea punctului C. Apelul
constructorului de copiere se poate realiza şi explicit: punctCC=punct(C);
CAP. 2
54
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 Destructori4. Parametrii transmişi unei funcţii pot fi obiecte, pointeri către obiecte sau referinţe
către obiecte. Valoarea returnată de o funcţie poate fi un obiect, pointer către obiect sau referinţă către
obiect.
CAP. 2
55
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
56
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
57
2.7 ConstructorisidestructoriClasesiobiecte
CAP. 2
58
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 DestructoriConstructorului puteau să i se transmită parametri prin valoare:
segment::segment(punctA1,punct B1) { A=A1;B=B1;cout<<"Constructor segment\n";} Apelul: segment
S(P, Q); În această situaţie, la apel, pentru parametrii formali A1 şi B1 se rezervă memorie pe stivă:
obiectele locale constructorului, A1 şi B1, sunt iniţializate prin copiere (la transmiterea parametrilor prin
valoare, se realizează o copiere a parametrilor efectivi în parametrii formali).
CAP. 2
59
2.7 ConstructorisidestructoriClasesiobiecte
2.7.3 DestructoriLa terminarea execuţiei corpului funcţiei, punctele A1 şi B1 sunt distruse. De aceea,
mesajele din această situaţie, sunt:"Constructor copierepunct!!" (pentruA1, local constructorului)
"Constructor copierepunct!!" (pentruB1, local constructorului) "Constructor pct. implicit!!"
(pentrumembrulA al segmentului) "Constructor pct. implicit!!" (pentrumembrulB al segmentului)
"Constructor segment!" (pentrusegmentulS) "Destructor punct!" (pentruB1, la ieşireadinconstructor)
"Destructor punct!" (pentruA1, la ieşireadinconstructor)
Clasesiobiecte
60
CAP. 2
61
Obiecteledeacelaşitippotfigrupateîntablouri.Dacăuntablouestedeclaratfărăafiiniţializat,pentruconstruire
aelementelorsaleseapeleazăconstructorulimplicit.Elementeleunuitabloupotfiiniţializateşicuajutorulconst
ructorilorcuparametri.
CAP. 2
62
CAP. 2
63
2.8 Tablouride obiecteClasesiobiecte
PROGRAMAREACALCULATOARELORŞILIMBAJEDE PROGRAMAREII
Clasesiobiecte
64
CAP. 2
65
2.7 FunctiiprieteneClasesiobiecte
CAP. 2
66
2.7 FunctiiprieteneClasesiobiecte
Sintaxadeclarariiuneifunctiiprietenein
cadruldeclaratieiuneiclaseesteurmatoarea:friendNumeFunctieMecanismulde friend(sauprietenie) a
aparutdatoritaimposibilitatiicao metodasafie membrua maimultorclase.Functiileprietenesuntfunctiicare
nu suntmetodeale uneiclase, darcare au totusiaccesla membriiprivatiaiacesteia. Oricefunctiepoatefi
prietenaa uneiclase, indiferentde naturaacesteia.
CAP. 2
67
2.7 FunctiiprieteneClasesiobiecte
Funcţiileprietene(friend)suntfuncţiine-membrealeuneiclase,careau
accesladatelemembreprivatealeclasei.Funcţiileprietenealeuneiclasetrebuieprecizateîndefiniţiaclasei.
Înacestsens,prototipurileunorastfeldefuncţiisuntprecedatedecuvântulcheiefriend.Spredeosebiredefuncţi
ilemembre,funcţiileprietenealeuneiclasenuposedăpointerulimplicitthis.Deaceea,deosebireaesenţialăîntr
edouăfuncţiicarerealizeazăaceleaşiprelucrări,ofuncţiemembrăşiofuncţieprietenă,constăînfaptulcăfuncţia
prietenăareunparametruînplusfaţădefuncţiamembru.
CAP. 2
68
2.7 FunctiiprieteneClasesiobiecte
Ofuncţiepoatefiînacelaşitimpfuncţiemembrăauneiclaseşifuncţieprietenăaalteiclase.Înexemplulurmător,f
1estefuncţiemembrăaclaseicls1şifuncţieprietenăaclaseicls2.Exemplu:
class cls1{ // . . . int f1(int, char); // f1 -metodă a clasei cls1 // . . . }; class cls2{ //. . . friend intcls1::f1(int,
char); // f1 -prietenăa claseicls2 //. . . };
CAP. 2
69
2.7 FunctiiprieteneClasesiobiecte
În cazul în care se doreşte ca toate funcţiile membre ale unei clase să aibă acces la membrii privaţi ai
altei clase (să fie funcţii prietene), prima clasă poate fi declarată clasa prietenă pentru cea de-a doua
clasă. În exemplul următor, clasa cls1 este clasa prietenă a clasei cls2. Exemplu:
class cls1; class cls2{ //. . . friendcls1;// clasa cls1 este clasă prietenă a clasei cls2 //. . . };Observaţie:
Relaţia de clasa prietenă nu este tranzitivă. Astfel, dacă clasa
cls1 este clasa prietenă a clasei cls2, iar clasa cls2 este clasă prietenă a clasei cls3, aceasta nu implică
faptul că, cls1 este clasă prietenă pentru cls3.
CAP. 2
70
2.7 FunctiiprieteneClasesiobiecte
Iatasiun exemplu:class Point {friend unsigned long Calcul(unsigned X, unsigned Y);public:friend unsigned
long AltaClasa::Calcul(unsigned X, unsigned Y);... };unsigned long Calcul(unsigned X, unsigned Y){return
X * Y / 2;}unsigned long AltaClasa::Calcul(unsigned X, unsigned Y){ ... }Dupacum se vededin
exemplulde maisus, nu are nicio importantain cadrulcareisectiuniestedeclaratafunctiaprietena.
CAP. 2
71
2.7 FunctiiprieteneClasesiobiecte
Claseleprietenesuntclasecare au accesla membriiprivatiaiuneiclase.
Sintaxadeclarariiuneiclaseprieteneeste:
CAP. 2
72
2.7 FunctiiprieteneClasesiobiecte
73
CAP. 2
SFARSITUL Capitolului2
Clasesiobiecte
Programareacalculatoarelorşilimbajede programareII