6.3. Alocarea dinamic? a memoriei pentru obiecte

6.3. Alocarea dinamic? a memoriei pentru obiecte

Obiectele pot fi create dinamic ?n memoria heap cu operatorul new ?i apoi eliminate dup? utilizarea cu operatorul delete. ?ns?, specific pentru obiecte este faptul c? la crearea obiectului va fi automat apelat unul din constructori, iar la distrugerea obiectului va fi automat apelat destructorul clasei. Care din constructori va fi apelat depinde de lista parametrilor dup? numele clasei ?n operatorul new.

Indicarea numai a numelui de clas?, f?r? parametri, se admite doar dac? clasa are constructorul f?r? parametri, sau are constructorul la care pentru to?i parametrii este definit? valoarea implicit?. Pentru exemple mai ad?ug?m la func?ia main() urm?torul cod:
 

   p1 = new fractie_rationala(1, 3);
   cout << "*p1=" << *p1 << endl;
   cout << "*p1="; p1->print(); cout << endl;
 
   fractie_rationala fr22 = *p1;
   cout << "fr22=" << fr22 << endl;
 
   p2 = new fractie_rationala;
   cout << "*p2=" << *p2 << endl;
 
   delete p1;
   delete p2;
sau:
   delete p1, delete p2;
Fragmentul ad?ugat va afi?a urm?torul text:
*p1=1/3
*p1=1/3
fr22=1/3
*p2=0/1


?n instruc?iunea:

p1 = new fractie_rationala(1, 3);

operatorul new apeleaz? constructorul clasei fractie_rationala, transmi??nd dou? argumente, respectiv 1 ?i 3.

?n instruc?iunea:

p2 = new fractie_rationala;

operatorul new apeleaz? acela?i constructor, ?ns? cu valorile implicite pentru ambele argumente, respectiv 0 ?i 1. Ne amintim c? constructorul clasei fractie_rationala are o a?a facilitate.

?n instruc?iunea:

delete p1;

operatorul delete apeleaz? destructorul clasei fractie_rationala.

Dac? o clas? admite apelul constructorului f?r? indicarea explicit? a argumentelor, atunci pot fi create dinamic matrice de obiecte ale acestei clase. ?n acest caz ?n operatorul new se indic? dup? numele clasei, ?n paranteze p?trate, num?rul de obiecte-elemente. Operatorul new va aloca respectiv at?tea obiecte consecutiv ?n memoria heap, ?i pentru fiecare din aceste obiecte va apela constructor f?r? argumente explicite. Mai ad?ug?m la func?ia main() ?nc? un fragment de cod, care va demonstra cele expuse:

// vector dinamic de obiecte 
   fractie_rationala *v;
   v = new fractie_rationala[5]; // cre?m dinamic un
                                 // vector din 5 elemente 
                                 // fiecare element fa fi
                                 // ini?ializat cu 0/1
   int i;
   for(i=0; i<5; i++)       
             v[i].modif(v[i].numarator()+i+1,(v+i)->numitor()+i+1);
 
   for(i=0; i<5; i++)
      cout << "v[" << i << "]=" << *(v+i) << endl;
 
   delete []v;


?n acest exemplu se creeaz? dinamic un vector din 5 elemente fractie_rationala, fiecare din care se ini?ializeaz? cu valoarea implicit? 0/1.  Apoi,  ?n ciclu se modific?  toate  elementele ale acestui vector prin utilizarea func?iei modif() – membr? a clasei fractie_rationala. ?n fiecare frac?ie la num?r?tor ?i numitor se ad?ug? valoarea indicelui elementului plus 1. Dup? aceasta, elementele vectorului se afi?eaz? pe ecran. ?n sf?r?it, se elibereaz? memoria alocat? pentru acest vector.

Deoarece v este un vector de obiecte, operatorul delete va apela destructorul pentru fiecare obiect al acestui vector. Rezultatul afi?at este:

v[0]=1/2
v[1]=2/3
v[2]=3/4
v[3]=4/5
v[4]=5/6


?n unele cazuri, ?n loc de alocare dinamic? a unui vector de obiecte este mai comod de a crea un vector de pointeri la obiecte. ?n a?a cazuri nu este necesar constructorul f?r? parametri. Ad?ug?m urm?torul fragment ?n func?ia main():

// vector static de pointeri la obiecte
   fractie_rationala *vp[5]; // declar?m un vector static
                             // de pointeri
   int j;
   for(j=0; j<5; j++)
   {
      vp[j] = new fractie_rationala(j+1, j+2);
   }
 
   for(j=0; j<5; j++)
      cout << "*vp[" << j << "]=" << *vp[j]
           << endl;
 
   for(j=0; j<5; j++)
      delete vp[j];


?n acest exemplu cre?m un vector static din 5 pointeri la obiecte fractie_rationala. Apoi, cre?m ?n ciclu c?te un obiect dinamic fractie_rationala, atribuind adresa obiectului de r?nd pointerului-element corespunz?tor. Mai departe, ?n ciclu afi??m obiectele pointate de c?tre elementele vectorului vp. ?n ciclul de finisare eliber?m memoria ocupat? de c?tre aceste obiecte. De fiecare dat? operatorul delete va apela destructorul pentru obiectul de cur?nd. Acest fragment va afi?a urm?torul text:

*vp[0]=1/2
*vp[1]=2/3
*vp[2]=3/4
*vp[3]=4/5
*vp[4]=5/6

Vectorul de pointeri la obiecte poate fi alocat ?i dinamic. Cercet?m ?nc? un fragment cu care vom ?nlocui ?n func?ia main() fragmentul precedent:

// vector dinamic de pointeri la obiecte
   fractie_rationala **vp; // pointer la un pointer la obiecte
 
   int no = 5; // num?rul de obiecte
   vp = new fractie_rationala* [no]; // aloc?m vector
                                     // din no pointeri
 
   int j;
   for(j=0; j<no; j++)
   {
      vp[j] = new fractie_rationala(j+1, j+2);
   }
 
   for(j=0; j<no; j++)
      cout << "*vp[" << j << "]=" << *vp[j]
           << endl;
 
   for(j=0; j<no; j++)
      delete vp[j]; // pentru fiecare obiect va fi apelat
                    // destructorul
 
   delete []vp; // eliber?m memoria ocupat? de c?tre vectorul
                // de pointeri, nu va fi apelat nici un destructor

Acest fragment va afi?a aceea?i ie?ire ca ?i fragmentul precedent.
_________________________
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 сайтов