С++ для начинающих


         

Операторы инкремента и декремента - часть 2


class ScreenPtr {

public:

   Screen& operator++();

   Screen& operator--();

   // ...

};

Такие операторы определяются как унарные операторные функции. Использовать префиксный оператор инкремента можно, к примеру, следующим образом:

const int arrSize = 10;

Screen *parray = new Screen[ arrSize ];

ScreenPtr parr( *parray, arrSize );

for ( int ix = 0;

      ix < arrSize;

      ++ix, ++parr )  // эквивалентно parr.operator++()

    }

      printScreen( parr );

Определения этих перегруженных операторов приведены ниже:

Screen& ScreenPtr::operator++()

{

   if ( size == 0 ) {

      cerr << "не могу инкрементировать указатель для одного объекта\n";

      return *ptr;

   }

   if ( offset >= size - 1 ) {

      cerr << "уже в конце массива\n";

      return *ptr;

   }

   ++offset;

   return *++ptr;

}

Screen& ScreenPtr::operator--()

{

   if ( size == 0 ) {

      cerr << "не могу декрементировать указатель для одного объекта\n";

      return *ptr;

   }

   if ( offset <= 0 ) {

      cerr << "уже в начале массива\n";

      return *ptr;

   }

   --offset;

   return *--ptr;

}

Чтобы отличить префиксные операторы от постфиксных, в объявлениях последних имеется дополнительный параметр типа int. В следующем фрагменте объявлены префиксные и постфиксные варианты операторов инкремента и декремента для класса ScreenPtr:

class ScreenPtr {

public:

   Screen& operator++();    // префиксные операторы

   Screen& operator--();

   Screen& operator++(int); // постфиксные операторы

   Screen& operator--(int);

   // ...

};

Ниже приведена возможная реализация постфиксных операторов:

Screen& ScreenPtr::operator++(int)

{

   if ( size == 0 ) {

      cerr << "не могу инкрементировать указатель для одного объекта\n";

      return *ptr;

   }

   if ( offset == size ) {

      cerr << "уже на один элемент дальше конца массива\n";




Содержание  Назад  Вперед