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



         

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


      return *ptr;

   }

   ++offset;

   return *ptr++;

}

Screen& ScreenPtr::operator--(int)

{

   if ( size == 0 ) {

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

      return *ptr;

   }

   if ( offset == -1 ) {

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

      return *ptr;

   }

   --offset;

   return *ptr--;

}

Обратите внимание, что давать название второму параметру нет необходимости, поскольку внутри определения оператора он не употребляется. Компилятор сам подставляет для него значение по умолчанию, которое можно игнорировать. Вот пример использования постфиксного оператора:

const int arrSize = 10;

Screen *parray = new Screen[ arrSize ];

ScreenPtr parr( *parray, arrSize );

for ( int ix = 0; ix < arrSize; ++ix)

    printScreen( parr++ );

При его явном вызове необходимо все же передать значение второго целого аргумента. В случае нашего класса ScreenPtr это значение игнорируется, поэтому может быть любым:

parr.operator++(1024);   // вызов постфиксного operator++

Перегруженные операторы инкремента и декремента разрешается объявлять как дружественные функции. Изменим соответствующим образом определение класса ScreenPtr:

class ScreenPtr {

   // объявления не членов

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

   friend Screen& operator--( Screen & );

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

   friend Screen& operator--( Screen &, int);

public:

   // определения членов

};

Упражнение 15.7

Напишите определения перегруженных операторов инкремента и декремента для класса ScreenPtr, предположив, что они объявлены как друзья класса.

Упражнение 15.8

С помощью ScreenPtr можно представить указатель на массив объектов класса Screen. Модифицируйте перегруженные operator*() и operator?>() (см. раздел 15.6) так, чтобы указатель ни при каком условии не адресовал элемент перед началом или за концом массива. Совет: в этих операторах следует воспользоваться новыми членами size и offset.




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