class
sau folosind cuvântul cheie struct
, cu următoarea sintaxă:class nume_clasă { specificator_acces_1: membru1; specificator_acces_2: membru2; ... } denumiri_obiecte; |
nume_clasă
este un identificator valid pentru clasa respectivă, denumiri_obiecte
este o listă opțională cu identificatorii obiectelor aparținând acelei clase. Corpul definiției poate conține membri (care pot fi date sau funcții) și, opțional, specificatori de acces.private
, public
sau protected
. Acești specificatori modifică drepturile de accesare a membrilor, după cum urmează:private
ai clasei pot fi accesați numai de către alți membri ai aceleiași clase (sau de către "friends" = prieteni).protected
ai clasei pot fi accesați de către alți membri ai aceleiași clase (sau de către "friends" = prieteni), dar și de către membri ai claselor derivate din acea clasă.public
sunt accesibili de oriunde obiectul este vizibil.class
au accces de tip private. De aceea, orice membru declarat înainte de orice specificator de acces este privat automat. De exemplu:
|
|
Dreptunghi
si un obiect (adică, o variabilă) al acestei clase, numit drept
. Această clasă conține patru membri: două date de tip int
(membrii latime
si inaltime
) cu acces privat (deoarece private este nivelul de acces implicit) și două funcții membru cu acces public: funcțiile seteaza_valori
și aria
, pentru care, deocamdată, am inclus numai declarațiile, nu și definițiile lor.Dreptunghi
reprezintă numele clasei (adică, tipul de dată), în timp ce drept
este un obiect de tipul Dreptunghi
. Avem exact aceeași relație ca între int
și a
din următoarea declarație:
|
|
int
este tipul de dată (clasa) și a
este numele variabilei (obiectul). Dreptunghi
si drept
, oricare dintre membrii publici ai obiectului drept
poate fi accesat ca o funcție, respectiv ca o variabilă obișnuită, doar inserând un punct (.
) între numele obiectului și numele membrului. Respectă exact sintaxa de accesare a membrilor unei structuri de date obișnuite. De exemplu:
|
|
drept
care nu pot fi accesați din afara clasei sunt latime
și inaltime
, deoarece ei au acces privat și pot fi referiți numai de către alți membri ai aceleiași clase.
|
|
aria: 12 |
::
, de două ori două puncte), pe care l-am întâlnit în capitolele anterioare referitoare la spații de nume. Aici este folosit în definiția funcției seteaza_valori
pentru a defini un membru al clasei din afara clasei.aria
a fost inclusă direct în definiția clasei Dreptunghi
dată fiind simplitatea ei. În schimb, pentru seteaza_valori
s-a declarat doar prototipul în interiorul clasei, iar definiția a fost dată în exterior. În această definiție externă, operatorul scope (::
) este folosit pentru a preciza că funcția ce se definește este membră a clasei Dreptunghi
și nu o funcție obișnuită nemembră.::
) precizează clasa căreia îi aparține membrul ce urmează a fi definit, acordându-i exact același domeniu ca în cazul în care funcția ar fi fost definită direct în interiorul definiției clasei. De exemplu, funcția seteaza_valori
din exemplul anterior are acces la variabilele latime
și inaltime
, care sunt membri privati ai clasei Dreptunghi
, fiind accesibili doar de către alți membri ai clasei precum acesta.latime
și inaltime
au acces privat (să ne amintim că dacă nu se precizează altceva, toți membrii unei clase definiți cu cuvântul cheie class
au nivel de acces privat). Dacă sunt declarați privat, accesul din exteriorul clasei nu este permis. Și chiar are sens, căci am definit deja o funcție membru care să seteze valorile pentru acei membri din interiorul obiectului: funcția seteaza_valori
. De aceea, restul programului nu are nevoie de acces direct la ei. Probabil că într-un program așa simplu cum este acesta, este mai greu de înțeles cât de utilă poate fi restricționarea accesului la aceste variabile, dar în proiecte mai mari poate fi foarte important ca valorile să nu poată fi modificate în mod neașteptat (neașteptat din punctul de vedere al obiectului).Dreptunghi
, am fi putut declara și obiectul dreptb
pe lângă drept
:
|
|
aria lui drept: 12 aria lui dreptb: 30 |
Dreptunghi
și avem două instanțe (adică obiecte): drept
și dreptb
. Fiecare dintre ele are propriile variabile membru și funcții membru.drept.aria()
nu are același rezultat ca apelul dreptb.aria()
. Acest lucru se întâmplă deoarece fiecare obiect al clasei Dreptunghi
are propriile sale variabile latime
și inaltime
, așa cum, într-un fel, au și propriile funcții membru seteaza_valori
si aria
care operează chiar cu variabilele membru ale obiectului.drept.aria
și dreptb.aria
. Acele funcții membru au folosit direct datele membru ale obiectelor respective, drept
și dreptb
.aria
înainte să fi apelat seteaza_valori
? Am fi avut rezultat nedeterminat, deoarece membrilor latime
și inaltime
nu li s-ar fi atribuit nicio valoare.void
.Dreptunghi
de mai sus poate fi îmbunătățită ușor prin implementarea unui constructor:
|
|
aria lui drept: 12 aria lui dreptb: 30 |
Dreptunghi
nu conține funcția membru seteaza_valori
, având în schimb un constructor care are rol asemănător: inițializează valorile variabilelor latime
și inaltime
prin transmiterea lor ca parametri.
|
|
void
: Constructorii niciodată nu returnează valori, ei doar inițializează obiecte.
|
|
aria lui drept: 12 aria lui dreptb: 25 |
drept
și dreptb
ale clasei Dreptunghi
. drept
este construit transmițând două argumente, ca în exemplul anterior.dreptb
. Să observăm că pentru construcția lui dreptb
nu s-au pus nici parantezele - de fapt, chiar nu este permisă folosirea parantezelor fârâ parametri la apelul constructorului implicit:
|
|
dreptc
în loc de declarația unui obiect: ar fi interpretată ca o funcție care nu are argumente și returnează o valoare de tip Dreptunghi
.nume_clasă id_obiect = valoare_de_inițializare;
{}
) în loc de paranteze (()
):nume_clasă id_obiect { valoare, valoare, valoare, ... }
|
|
circumferinta lui foo: 62.8319 |
|
|
lista_de_inițializare
.:
) și lista de inițializări pentru membrii clasei. De exemplu, să considerăm o clasă cu următoarea declarație:
|
|
|
|
|
|
|
|
|
|
volumul lui foo: 6283.19 |
Cilindru
are un membru obiect al cărui tip este altă clasă (baza
este de tipul Cerc
). Deoarece obiectele clasei Cerc
pot fi construite doar cu un parametru, constructorul lui Cilindru
trebuie să apeleze constructorul lui baza
, iar singura cale de a face acest lucrueste prin lista de inițializare a membrilor.{}
în loc de paranteze ()
:
|
|
|
|
Dreptunghi
.->
). Iată un exemplu cu câteva posibile combinații:
|
|
*
, &
, .
, ->
, []
). Ei pot fi interpretați astfel:Expresia | Se citește |
---|---|
*x | pointat de x |
&x | adresa lui x |
x.y | member y of object x |
x->y | membrul y al obiectului pointat de x |
(*x).y | membrul y al obiectului pointat de x (echivalentă cu anterioara) |
x[0] | primul obiect pointat de x |
x[1] | al doilea obiect pointat de x |
x[n] | al (n+1 )-lea obiect pointat de x |
[]
) și capitolul despre structurile de date normale a prezentat operatorul săgeată (->
).class
, ci și cu cuvintele cheie struct
și union
.struct
, folosit în general pentru a declara structuri de date obișnuite, poate fi folosit și pentru declararea de clase care au ca mambri funcții, cu aceeași sintaxă ca în cazul lui class
. Singura diferență între cele două constă în faptul că membrii clasei declarate cu struct
au acces implcit de tip public
, în timp ce membrii claselor declarate cu class
au accesul implicit private
. În rest, cele două cuvinte cheie sunt echivalent în acest context.struct
sau class
, căci uniunea stochează o singură dată membru la un moment dat, dar altfel poate conține, ca și clasa, funcții membru. Nivelul implicit de acces pentru o uniune este public
.Previous: Alte tipuri de date | Index | Next: Clase (II) |