3.1. Declararea claselor

3.1. Declararea claselor

Forma general? de declarare a unei clase de baz? (adic?, a clasei care nu mo?tene?te nici de la o alt? clas?) este urm?toarea:

class nume_clasa{

      [date_func?ii_prototipuri_prieteni]

   [specificator_de_acces:

      date_func?ii_prototipuri_prieteni

   specificator_de_acces:

      date_func?ii_prototipuri_prieteni

   …

   specificator_de_acces:

      date_func?ii_prototipuri_prieteni]

} [list?_de_obiecte];

[defini?ia_func?iei_membre_sau_prietene

defini?ia_func?iei_membre_sau_prietene

defini?ia_func?iei_membre_sau_prietene]

Descriind construc?iile limbajului C++, vom folosi perechea de caractere [ ] pentru a marca subconstruc?iile a c?ror prezen?? nu este obligatorie ?n construc?ia respectiv?. Totodat?, caracterele [ ] vor ?nsemna caractere care reprezint? partea component? a construc?iei de descriere.

Dup? cum se vede, declara?ia ?ncepe cu cuv?ntul-cheie class, dup? care urmeaz? denumirea clasei. Denumirea clasei este orice identificator creat de c?tre programator conform sintaxei limbajului C++ ?i care este liber ?n momentul declar?rii. Apoi, urmeaz? corpul clasei luat ?n acolade { ?i }. Corpul poate fi gol, ?ns? practic ?ntotdeauna el reprezint? declar?ri de c?mpuri (date) membre, declar?ri de prototipuri ale func?iilor membre ?i ale func?iilor prietene, definiri de func?ii membre ?i de func?ii prietene, declar?ri de clase prietene.

Declararea c?mpurilor ?i a func?iilor membre se repartizeaz? pe sec?iuni ?n dependen?? de regimul dorit de accesare a lor. Acest regim este stabilit prin utilizarea a trei specificatori de acces: public, protected, private. Ordinea sec?iunilor, precum ?i num?rul de repet?ri sunt arbitrare. Dac? la ?nceputul corpului de declarare a clasei, pentru un set de c?mpuri ?i func?ii membre specificatorul de acces nu este indicat, implicit, pentru c?mpuri ?i func?ii membre din aceast? sec?iune va fi stabilit regimul de accesare private (privat sau particular) – cel mai dur regim de accesare din trei posibile.

C?mpurile ?i func?iile membre private sunt accesibile numai din interiorul acestei clase, adic? acces la ele au numai func?iile membre ale sale, sau func?iile de tip prieten (friend) al acestei clase. Regimul de accesare protected (protejat) este pu?in mai liber ?n compara?ie cu regimul private. El stabile?te c? c?mpurile ?i func?iile membre ale clasei definite vor fi accesibile ?i din interiorul claselor derivate ale clasei definite. Specificatorul de acces public este cel mai liber din cei trei. El admite accesarea c?mpurilor ?i a func?iilor membre ale acestei sec?iuni din orice loc al programului unde va fi vizibil obiectul concret al clasei definite. A?a o accesare este asigurat? prin intermediul numelui acestui obiect.

?n C++ declararea claselor este similar? cu declararea structurilor. ?n cazul structurilor se folose?te cuv?ntul-cheie struct ?n loc de class. Unica diferen?? const? ?n aceea c? ?n cazul structurilor, implicit, va fi stabilit regimul de accesare public ?i nu private, cum a fost descris mai sus pentru clase.

Imediat dup? descrierea corpului clasei (acolada de ?nchidere) putem crea un set de obiecte ale acestei clase. ?ns?, acest lucru nu este obligatoriu. Obiectele pot fi create ?i mai departe ?n program.

Dup? caracterul ';' urmeaz? defini?iile (realiz?rile) func?iilor membre, dac? prototipurile lor au fost declarate ?n corpul clasei.

Trecem la exemplu. Declar?m versiunea simplificat? la maximum a clasei pentru operarea cu frac?ii ra?ionale f?r? semn. Vom numi aceast? clas? fractie_rationala:

#include 
 
class fractie_rationala
{
   protected:
      unsigned int numarat;
      unsigned int numit;
};
 
void main()
{
   fractie_rationala fr1; // cre?m un obiect numit fr1, 
                          // reprezentantul clasei 
                          // fractie_rationala 
   fractie_rationala fr2; // mai cre?m un obiect numit
                          // fr2, reprezentantul aceleia?i
                          // clase 
   fr1 = fr2; // atribuim obiectului fr1 obiectul fr2 
 
   char c; 
   cin >> c; // a?tept?m ap?sarea oric?rei taste
}
//De fapt, conform sintaxei, versiunea minimal? 
//a clasei fractie_rationala este:
class fractie_rationala
{
 
};

 


?ns?, fiind perfect valid? din punctul de vedere al sintaxei, ea nu este interesant? din punctul de vedere al semanticii, de aceea nici nu va fi examinat?.

Clasa fractie_rationala con?ine dou? c?mpuri numarat ?i numit pentru memorizarea, respectiv, a num?r?torului ?i a numitorului ce compun o frac?ie ra?ional? f?r? semn. Ambele c?mpuri sunt de tipul unsigned int ?i au unul ?i acela?i regim de acces protected. Dac? ?nl?tur?m linia:

   protected:

din programul de mai sus, atunci, implicit, c?mpurile numarat ?i numit vor avea regimul de acces private.

?ns?, ?n ambele cazuri nu avem altceva de f?cut dup? crearea obiectelor clasei fractie_rationala dec?t s? atribuim valorile de la un obiect la altul, cum este ar?tat ?n func?ia main(). Operatorul de atribuire este implicit realizat cu orice clas? declarat?. El presupune copierea pe bi?i a con?inutului memoriei ocupate de c?tre obiectul din partea dreapt? a semnului operatorului de atribuire (?n exemplul nostru – obiectul fr2), ?n zona de memorie ocupat? de c?tre obiectul din partea st?nga a semnului operatorului de atribuire (?n exemplul nostru – obiectul fr1).

Nu se ?tie ce va fi copiat ?n fr1 ?n exemplul nostru, fiindc? nici ?n c?mpurile obiectului fr1, nici ?n c?mpurile obiectului fr2 nu a fost ?nscris? nici o valoare c?nd aceste obiecte au fost create ?n memoria operativ?. Ini?ializarea pur ?i simplu nu a fost prev?zut? ?n versiunea clasei de mai sus. Mai mult ca at?t, nici nu exist? posibilitatea de a ?nscrie cumva valorile ?n c?mpurile obiectelor fr1 ?i fr2. Unicul lucru care poate fi spus este c? dup? atribuire, con?inuturile zonelor de memorie ocupate de c?tre obiectele fr1 ?i fr2 vor fi identice.

?n primul r?nd, nu putem accesa c?mpurile obiectelor. Astfel, orice ?ncerc?ri de acest tip de accesare, cum ar fi, de exemplu, atribuiri (?i nu numai) ca:

fr1.numarat = 2;

   fr2.numit = 3;

vor fi respinse de c?tre compilator, fiind interzise.

?n versiunea propus? a clasei fractie_rationala nu putem ini?ializa c?mpurile obiectelor create, nu putem afi?a obiectele, nu putem efectua calculele asupra lor etc. Lucrul acesta se face cu ajutorul func?iilor membre (metodelor) ale clasei.

Exerci?iul 3.1. Aduce?i exemple de declarare a claselor pentru fiecare defini?ie de obiect din vocabularele explicative ale limbii rom?ne.
_________________________
Autorul: dr.conf. S. Pereteatcu

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов