5.2. Supra?nc?rcarea operatorilor de incrementare/decrementare

5.2. Supra?nc?rcarea operatorilor de incrementare/decrementare

Operatorii de incrementare ++ ?i decrementare –– au fiecare c?te dou? forme: una cu prefix ?i cealalt? cu sufix. Supra?nc?rc?nd ace?ti operatori, ?n mod normal, trebuie de scris pentru fiecare c?te dou? func?ii membre sau prietene. Supra?nc?rcarea pentru operatorii ++ ?i -- cu prefix se face ?n mod obi?nuit. \

Posibilitatea de supra?nc?rcare a acelora?i operatori cu sufix a ap?rut ?n versiunile relativ noi ale C++. Este clar c? supra?nc?rcarea cu sufix trebuie cumva s? difere de supra?nc?rcarea respectiv? cu prefix, cel pu?in prin prototipuri. La supra?nc?rcarea versiunilor cu sufix trebuie de ad?ugat un parametru fictiv de tipul int. El nu va fi folosit ?n codul func?iei, ci serve?te numai ca indicator al compilatorului.

Ca exemplu, supra?nc?rc?m operatorul ++ sub formele cu prefix ?i cu sufix prin func?iile membre, iar operatorul -- sub formele cu prefix ?i cu sufix prin func?iile prietene ale clasei fractie_rationala.

Inser?m urm?torul cod ?n sec?iunea public a clasei fractie_rationala din programul precedent:

      fractie_rationala operator ++()
      {
         numarat+=numit;
         return *this;
      }
 
      fractie_rationala operator ++(int fictiv)
      {
         unsigned int numarat_vechi=numarat;
         numarat+=numit;
         return fractie_rationala(numarat_vechi, numit);
      }

Iar la func?ia main() ad?ug?m verificarea operatorului ++ supra?nc?rcat:

   (++fr3).print(); // va afi?a 3/2
   cout << endl;
   fr3.print(); // va afi?a 3/2
   cout << endl;
   (fr3++).print(); // va afi?a 3/2
   cout << endl;
   fr3.print(); // va afi?a 5/2
   cout << endl;


Afi?area ce corespunde codului ad?ugat va fi clar?, dac? vom lua ?n considera?ie c? valoarea precedent? a fr3 era 1/2. Urm?ri?i func?iile ce supra?ncarc? operatorul ++. Ambele ?ntorc un obiect fractie_rationala. Prima func?ie supra?ncarc? ++ cu prefix. Ea modific? obiectul la care se aplic? ?i, ca rezultat, tot pe el ?l ?ntoarce (folosind pointerul this). Acesta, la r?ndul s?u, poate fi folosit la construirea expresiilor mai complicate.

A doua func?ie supra?ncarc? ++ cu sufix. Ea modific? obiectul la care se aplic? ?i ?ntoarce obiectul temporar egal cu valoarea veche a obiectului de aplicare. Func?ia are un parametru fictiv de tipul int, ce reprezint? o excep?ie de la regula de supra?nc?rcare a operatorilor unari prin func?ie membr? (conform regulii, func?ia nu trebuia s? posede nici un parametru).

Urm?torul cod poate fi inserat ?n orice sec?iune a clasei fractie_rationala, fiindc? el supra?ncarc? operatorul ?n form? de func?ii prietene:

  friend fractie_rationala operator –(fractie_rationala &x)
  {
     x.numarat-=x.numit
     return x;
  }
  friend fractie_rationala operator --(fractie_rationala &x, int fictiv)
  {
     unsigned int numarat_vechi=x.numarat;
     x.numarat-=x.numit;
     return fractie_rationala(numarat_vechi, x.numit);
  }


Func?iile din codul ad?ugat reprezint? versiunile simplificate de  supra?nc?rcare  a  operatorului -- cu prefix ?i, respectiv, cu sufix. Aici nu se verific? dac? num?r?torul este mai mare dec?t numitorul ?i este posibil? sc?derea. Deoarece func?iile date au fost incluse ?n ?ntregime cu defini?iile sale ?n defini?ia clasei fractie_rationala, ele vor fi desf??urate inline de c?tre compilator. Pentru verificarea operatorului -- supra?nc?rcat ad?ug?m la func?ia main():

   (--fr3).print(); // va afi?a 3/2
   cout << endl;
   fr3.print(); // va afi?a 3/2
   cout << endl;
   (fr3--).print(); // va afi?a 3/2
   cout << endl;
   fr3.print(); // va afi?a 1/2
   cout << endl;


?in?nd cont c? fr3 are deja valoarea 5/2. Analiz?nd ultimele dou? func?ii, men?ion?m, cum va fi returnat rezultatul de data aceasta ?i c? a doua func?ie are doi parametri, dintre care al doilea este fictiv, dar neap?rat trebuie s? fie de tipul int. Totu?i, cel mai important este faptul c? primul parametru se transmite prin referin?? ?i nu prin valoare, fiindc? obiectul la care se aplic? operatorul ??i schimb? valoarea.
_________________________
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 сайтов