5.3. Supra?nc?rcarea operatorilor de atribuire

5.3. Supra?nc?rcarea operatorilor de atribuire

Este posibil? supra?nc?rcarea oric?rui operator de atribuire at?t simpl? =, c?t ?i compus? „opera?ie=”.

A?a cum a fost spus mai ?nainte, pentru orice clas? este definit automat operatorul de atribuire simpl? care copie „pe bi?i” con?inutul obiectului-operand din partea dreapta ?n obiectul-operand din partea st?ng? a semnului de atribuire =. Pentru o clas? oarecare poate ap?rea necesitatea de a redefini acest operator ?n a?a mod ?nc?t operatorul de atribuire supra?nc?rcat va face careva ac?iuni suplimentare sau specifice acestei clase.

De exemplu, pentru clasa fractie_rationala astfel de ac?iune poate fi reducerea frac?iei care a ob?inut valoarea. Ad?ug?m ?n sec?iunea public a clasei fractie_rationala urm?torul cod de supra?nc?rcare a operatorului = :

fractie_rationala operator=(const fractie_rationala &y)
      {
         numarat=y.numarat;
         numit=y.numit;
         reducere();
         return *this;
      }


Men?ion?m c? operatorul de atribuire ?ntoarce ca rezultat operandul care a primit valoarea. Anume aceasta ?i execut? func?ia de mai sus dup? ce a ?nscris valorile noi ?n c?mpurile numarat ?i numit ale destina?iei ?i a apelat func?ia de reducere (acea ac?iune suplimentar? despre care s-a vorbit mai sus). Pentru verificare ad?ugam la func?ia main():

fractie_rationala fr6(3, 6);
   cout << "fr6=";
   fr6.print(); // va afi?a 3/6
   cout << endl;
 
   fractie_rationala fr7;
   fr7=fr6; // atribuirea supra?nc?rcat?
   cout << "fr7=";
   fr7.print(); // va afi?a 1/2
   cout << endl;
 
   fractie_rationala fr8, fr9;
   fr9=fr8=fr6; // ?nl?n?uirea atribuirii supra?nc?rcate 
   fr8.print(); // va afi?a 1/2
   cout << endl;
   fr9.print(); // va afi?a 1/2
   cout << endl;
Este u?or de ?n?eles c? fragmentul ad?ugat afi?eaz? urm?torul text:
fr6=3/6
fr7=1/2
1/2
1/2


La declararea clasei nici unul din operatorii de atribuire compus? nu se creeaz? automat, ?ns? fiecare din ei poate fi supra?nc?rcat prin func?ie membr? sau chiar prieten? a clasei. Pentru exemplu supra?nc?rc?m operatorul += pentru clasa fractie_rationala prin func?ie membr?:

fractie_rationala operator +=(fractie_rationala y)
      {
         numarat=numarat*y.numit+numit*y.numarat;
         numit=numit*y.numit;
         reducere();
         return *this;
      }


Este clar c? codul dat trebuie s? fie inserat ?n sec?iunea public a clasei fractie_rationala. Iar la func?ia main() ad?ug?m:

fractie_rationala fr10(1,4);
   fractie_rationala fr11(1,4);
   fractie_rationala fr12(1,4);
   fr12+=fr11+=fr10; // lan? de atribuiri cu + 
   cout << "fr10=";
   fr10.print(); // va afi?a 1/4
   cout << endl;
   cout << "fr11=";
   fr11.print(); // va afi?a 1/2 fiindc? 1/4+1/4=1/2
   cout << endl;
   cout << "fr12=";
   fr12.print(); // va afi?a 3/4 fiindc? 1/4+1/2=3/4
   cout << endl;
 
Fragmentul acesta afi?eaz?: 
 
fr10=1/4
fr11=1/2
fr12=3/4
 
Exact acela?i rezultat va fi dac? ?n fragmentul precedent vom ?nlocui:
 
   fr12+=fr11+=fr10; 
 
cu:
 
fr11=fr11+fr10;
fr12=fr12+fr11;


_________________________
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 сайтов