Laborator 6 - POO
Membri statici
Principala utilizare a variabilelor membru statice const in eliminarea in cat mai mare masura a
variabilelor globale utilizate intr-un program.
Cuvantul cheie “static” poate fi utilizat in prefixarea membrilor unei clase. Odat’ declarant
“static”, membrul in cauza are proprietati diferite, datorita faptului ci membr
unui anumit object, ci sunt comuni tuturor instantierilor unei clase.
Pentru o variabilé membru static’ se rezervi o singura zon’ de memorie, care este comun’
tuturor instantierilor unei clase (obiectelor).
Variabilele membru statice pot fi prefixate doar de numele clasei, urmat de operatorul de de
rezolutie “::”. Apelul metodelor statice se face exact ca si accesarea variabilelor membru statice.
Deoarece metodele statice nu sunt apelate de un obiect anume, nu lise transmite pointerul
ascuns “this”.
Dac’ intr-o metodd staticd se folosesc variabile membru nestatice, e nevoie s& se furnizeze un
parametru explicit de genul obiect, pointer la obiect sau referinté 1a obiect. Toti membrii staticl
sunt doar declarati in cadrul clasei, ei urmand a fi obligatoriu initializati.
Exemplu
clase exenplu
(
int 47
publ
static int contor; // variabila membru =i
static inc (void) {i++s} // metoda statica
vold inc contor {void} {contor++;}
void init (void) {i = Or}
static void functie (exemplu *); // metoda stat
} obl, ob2, ob37
int exempluzrcontor ~ 0; // initislizares yariabilei stat:
vold exenplu::functie(exemplu *ptrEz)
{
Mite 6 It
// apartine i
ptrix > its; // correct
contor +7 // corect
}
void main(void)
{
obl-init (1;
ob3.init();
ob1.inc(}z
ob2-ine();
ob3-inc(};obl.functis{eobl); // corect
exemplu zt functie(éob2); // corect
// functie(); // incorect - in afara cazului in
// exista o metoda ne-membru cu acest nume
Ane_contor(}7
exemplu i: contort
}
Functif friend
O functie friend este o functie care nu e membru a unei clase, dar are acces la membrii de tip
private si protected ai clasei respective. Orice functie poate fi friend unet clase, indiferent daca
este 0 functie obignuitd sau este membru al unei alte clase.
Exemplu:
class exemplu {
int az
int £ (void);
friend int fl(exemplu &);
public:
friend int M:
£2lexemplu @, int);
int fl(exemplu ex)
{
return ex.f (3
t
int Mit £2(exemplu eex, int 4
(
if (ex.a > 7) retuen j++;
else return j--7
1
Dupa cum se observa, nu conteaza dacé o functie este declarata friend in cadrul sectiuni
private sau public a unei clase.
Clase friend
Daca se doreste ca toti membrii unei clase “M” si aiba acces la partea privat a unei clase “B”,
in loc s8 se atribuie toate metodele lui “M” ca fiind friend ai lui “B”, se poate declara clasa “M”
ca si clasé friend lui “B".
Exemplu:
class M {
TL sve
lass B
8{
PP cave
friend class Ms
te
Relatia de friend nu este tranzitiva, adicd dacd clasa A este friend clasei 8, iar clasa B este friend
clasei C, aceasta nu implicé faptul cd, clasa A este implicit friend clasei C. Functillor friend nu li
se transmite parametrul ascuns this. Aceast carenta este suplinita prin transmiterea unor
parametrii obignuiti de tip pointer, obiect sau referintd la obiect.
Exemplu:
class rational; // declarare incompleta
class complex
P
double p_reala, p_imaginara;
friend complex& ponderare (complex&, rationals);
{double r, double i} : p_reala (r), p_imaginara (4)
double get_real (void) (return p_realas}
double get_imaginar (void) [return p_imaginara;}
ea
class rational
{
int numarator, numitors
double val;
public:
friend complex& ponderare (complexs , rationals):
rational (int nl, int n2) : mumarator [n1}
t
numitor = n2t=0 2 2:1
val = ((double)numarator} /numitor
t
double get_valoare(void) { return val;
he
// fiind "friend", functia ponderare are acces la membrii
privati ai
// claselor "complex" si "rational"
complex sponderare(complexé c, rationals r)
t
complex *t = new complex (c.p_reala *r.val, c.p_imaginara
ve.val)i
return *t;
}// nefiind "friend", "ponderare ineficienta" nu are acces la
membrd 1
// privati ai claselor “complex” si "rational"
complex §ponderare ineficienta (complex &c, rational sr
{
complex *t = new complex (c.get_real[)*r.get_valoare(|
e.get_imaginar()*r.get_valoare(}}
return ‘te
1
void main{void}
{
complex a(2,4),b(6,9)2
rational d(1,2),e(1)3)¢
a = ponderare(a,d)z
b = ponderare(b,e):
a = ponderare ineficienta(a,d};
b = ponderare _ineficienta(b,e};
1
Problema 1
Sa se implementeze clasa Complex si doua functii friend pentru adunarea, respectiv inmultirea
a doua numere complexe.
#include
#include
class Complex
{
private:
float real,imaginar;
public:
Complex (float £,float im);
void afisare();
friend Complex adunare (Complex a,Complex b)+
friend Complex inmultire(Complex a,Complex b)#
te
Complex:
{
real=r;
imaginar=imy
}
void comple:
{
if (imaginar<-0)
cout<
#include
class Complex
{
private:
float real,imaginar;
public:Complex(float r,float im}
void afisare();
friend Complex adunare(Complex a,Complex b)i
friend Complex inmultire(Complex a,Complex b);
friend float lungime(Complex a,Complex b)s
friend aria(Complex a,Complex b, Complex c);
le
Complex
{
real=ti
imaginar=imy
t
void Comple:
{
if (imaginar>=0)
cout<
class persoana
{
static int total_pers;
static int total_b;
char sex;
public:
persoana{char sx
Constructor de clasa";}
~persoana() {total_pers--;cout<<"\n Destructor de clasa’
static int spune _total() {return total_pers
static int spune_total_b() {return total_b,
static void numara_b(persoana *pp)
{if (pp->sex=="B') total_b++:}
B') (total_pers++;se:
7 COURSE” \n
} [101s
int persoana::total_per:
int persoana::total_b=0;
void main()
f
plO0]=persoana('F'); p[Sl=persoanal*P')+
cout<<"\n In cele "<
finclude
define dim 20
using namespace st
ass Sstiva
int s{din] ;
int vf; //varful stivei
public:
Sstiva();
~Sstiva()+
void Push(int e); //introduce elementul e in stiva
int Pop(}; //extrage un element din stiva. Se aplica tehnica
LIF
int Lungime() //returneaza marimea stivei
{
return vty
}
int Blem[int index); //returneaza elementul de pe un anumit
index
void Afisare()7
Sstiva(void)
cout<<"Stiva initializata."<>es
if(e)
iffe
q
“an
ob. Push (e) 7
ob. Afisare()?
cout<<"Dimensiunea stived est
"cob. Lungime(}<>g7