Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_otvety_k_ekzamenu.doc
Скачиваний:
55
Добавлен:
13.04.2015
Размер:
786.94 Кб
Скачать

15. Перегрузка операторов индексной выборки, префиксного и постфиксного инкремента/декремента. Перегрузка операторов преобразования типа.

Для операторов разыменования и индексной выборки необходимо предоставлять 2 версии - константную и неконстантную, поскольку такие операторы могут быть использованы как в правой так и в левой части присвоения. Константная версия возвращает значение в массиве. Неконстантная - ссылку на место его хранения.

// Оператор разыменования с целью чтения значения из указателя

int IntegerArrayPtr::operator * () const

{

// Проверка валидности - вызов преобразования к типу bool

assert( * this );

// Доступ к значению - элементу массива

return m_pData[ m_currentPosition ];

}

//*******************************************************************************

// Оператор разыменования с целью записи значения через указатель

int & IntegerArrayPtr::operator * ()

{

// Проверка валидности - вызов преобразования к типу bool

assert( * this );

// Возврат ссылки на интересующую ячейку массива

return m_pData[ m_currentPosition ];

}

Оператор индексной выборки с целью чтения значения

int IntegerArrayPtr::operator [] ( int _index ) const

{

// Проверка валидности - вызов преобразования к типу bool

// Проверка корректности переданного индекса

assert( * this && ( m_currentPosition + _index ) < m_length );

// Доступ к значению - элементу массива

return m_pData[ m_currentPosition + _index ];

}

//*******************************************************************************

// Оператор индексной выборки с целью записи значения

int & IntegerArrayPtr::operator [] ( int _index )

{

// Проверка валидности - вызов преобразования к типу bool

// Проверка корректности переданного индекса

assert( * this && ( m_currentPosition + _index ) < m_length );

// Возврат ссылки на интересующую ячейку массива

return m_pData[ m_currentPosition + _index ];

}

Префиксные операторы инкремента/декремента всегда возвращает ссылку на себя. Сначала объект модифицируется, а затем идет возврат ссылки, поскольку изменение должно вступить в силу и сразу использоваться в дальнейшем выражении.

Постфиксные операторы инкремента/декремента всегда возвращают новый объект по значению. Сначала создается копия текущего состояния объекта. Затем сам объект модифицируются. А возвращается ранее созданная копия. Таким образом сначала используется старое значение, а затем происходит его изменение.

С точки зрения синтаксиса перегрузки, отличить префиксные операторы от постфиксных можно по фиктивному аргументу типа int. Такой аргумент фактически не передается, его нельзя использовать при реализации. Этот неиспользуемый аргумент является лишь синтаксическим средством-обманом, позволяющим отличать перегружаемые префиксные и постфиксные операторы друг от друга

// Префиксный оператор инкремента

IntegerArrayPtr& IntegerArrayPtr::operator ++ ()

{

// Проверяем валидность

assert( * this );

// Увеличиваем позицию на 1

++ m_currentPosition;

// Используем новое состояния сразу, возвращаем ссылку на себя

return * this;

}

// Постфиксный оператор инкремента - с фиктивным аргументом

IntegerArrayPtr IntegerArrayPtr::operator ++ ( int )

{

// Проверяем валидность

assert( * this );

// Создаем объект, копируем в него текущее состояние

IntegerArrayPtr copy( * this );

// Увеличиваем позицию на 1

++ m_currentPosition;

// Возвращаем копию по значению

return copy;

}

// Префиксный оператор декремента

IntegerArrayPtr& IntegerArrayPtr::operator -- ()

{

// Проверяем валидность

assert( * this );

// Уменьшаем позицию на 1

--m_currentPosition;

// Используем новое состояния сразу, возвращаем ссылку на себя

return * this;

}

//*******************************************************************************

// Постфиксный оператор декремента - с фиктивным аргументом

IntegerArrayPtr IntegerArrayPtr::operator -- ( int )

{

// Проверяем валидность

assert( * this );

// Создаем объект, копируем в него текущее состояние

IntegerArrayPtr copy( * this );

// Уменьшаем позицию на 1

-- m_currentPosition;

// Возвращаем копию по значению

return copy;

}

Перегрузка операторов преобразования типа:

Если тип первого операнда является классом, существует 2 альтернативы для перегрузки операторов:

  • реализация перегруженного оператора внутри класса в виде функции-члена:

    • для унарных операций единственным операндом является объект, на который указывает неявно передаваемый указатель this;

    • для бинарных - неявно передаваемый указатель this указывает на левый операнд, а правый операнд передается в качестве аргумента оператора;

Операторы преобразования типа могут быть реализованы только таким способом, второй вариант не доступен.

// Оператор преобразования к логическому типу:

// истина => если указатель указывает на валидную позицию в массиве

// ложь => если позиция вызодит за допустимую границу

IntegerArrayPtr::operator bool () const

{

return m_currentPosition < m_length;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]