Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.doc
Скачиваний:
13
Добавлен:
25.04.2019
Размер:
1.34 Mб
Скачать

Void operator delete(void * memory) {

if(memory == 0) return; // для нулевого указателя ничего не делать

... // Специальная обработка пользователя ::operator delete(memory); // освободить память

...

}

Операция operator delete[] перегружается аналогично, но, как и operator new[], характеризуется жесткими ограничениями.

Вопросы для самопроверки

  1. Опишите сущность механизма перегрузки стандартных операций.

  2. Перечислите основные ограничения перегрузки операций.

  3. Как можно определить функцию-операцию по отношению к классу, для которого выполняется перегрузка операции?

  4. Как должен в общем виде выглядеть прототип функции-операции, перегружающей префиксную унарную операцию?

  5. Почему операцию = невозможно перегрузить глобальной функцией? Обоснуйте ответ.

  6. Прототип функции-операции, суммирующей две матрицы, имеет вид const Matrix & operator + (const Matrix & m2) const; Какая в нем имеется ошибка и каковы ее потенциальные последствия?

  7. Прототип функции-операции присваивания, определенной для класса матриц, имеет вид Matrix & operator = (const Matrix & m) const; Какого рода ошибка содержится в приведенном прототипе?

  8. Требуется реализовать операцию суммирования матриц класса CMatrix с вещественным выражением с сохранением свойства коммутативности операции. Как следует определить эту функцию-операцию? Дайте эскиз определения.

  9. Как правильно построить заголовок функции-операции operator –, которая изменяет знак всех элементов матриц класса CMatrix на противоположный?

  10. Почему функция operator = в общем случае должна проверять присваивание объекта самому себе? Когда такая проверка избыточна?

  11. Опишите алгоритм работы функции operator =, если класс, для которого она перегружена, является производным от другого класса.

  12. Пусть для класса CRationalNumber, представляющего рациональные числа, требуется определить функцию operator <<. Как это сделать наиболее грамотно?

  13. Как правильно задать заголовок функции operator <<, чтобы были возможны операторы вида cout << m1 << m2 << m3, где m1,m2,m3 – объекты класса, для которого определяется функция operator<< ?

  14. Можно ли операцию [] перегрузить дружественной функцией? Поясните ответ.

  15. Почему операция operator [] обычно перегружается дважды?

  16. В классе Matrix, описывающем прямоугольные матрицы, имеется функция const Matrix operator + (double r) const; Она увеличивает элементы матрицы на выражение r. Можно ли этой функцией вычислить выражение 0.5+m? Обоснуйте ответ.

  17. Программа содержит оператор m1 = m1 + m2, где m1 и m2 – объекты некоторого класса C, для которого перегружены операции = и +. Перепишите этот оператор в эквивалентной функциональной форме.

  18. Чем отличаются заголовки функций-операций пре-инкремента (++c) и постинкремента (c++)?

  19. Почему функция-операция префиксного декремента (--c) должна возвращать ссылку на класс? Обоснуйте ответ.

  20. Заголовок операции суммирования, определенной для класса матриц, имеет вид: virtual const Matrix operator + (const Matrix & m2) const; Как правильно переопределить эту операцию в производном классе, например, поименованных матриц? Приведите только заголовок и обоснуйте выбранный вариант.

  21. В базовом классе BasicMatrix, представляющем матрицы, определена операция вывода в поток с заголовком: friend ostream & operator << (ostream & stream, const BasicMatrix & m); От класса BasicMatrix порожден производный класс NamedMatrix, описывающий поименованные матрицы. Как наиболее рационально реализовать операцию записи в поток для этого производного класса?

  22. Для класса NamedMatrix, являющегося производным от класса Matrix, определена операция чтения из потока: istream & operator >> (istream & stream, Matrix & m) { return stream >> dynamic_cast<Matrix &>(m); } Какого рода ошибка есть в этом определении? Каковы “симптомы” ее проявления?

  23. В классе, представляющем двоичные векторы BoolVector, определена операция индексации с заголовками bool & operator [] (int i); (вариант 1) и const bool operator [] (int i) const; (вариант 2). Какой из вариантов операции будет использован в операторе cout<<v[i], если вектор v определен как неконстантный объект класса BoolVector? Обоснуйте ответ.

  24. В классе, представляющем двоичные векторы BoolVector, определена операция с заголовком const BoolVector & operator | (const BoolVector & v) const; обеспечивающая поэлементное ИЛИ над векторами-операндами. Какого рода ошибка заключена в приведенном заголовке?

  25. Запишите заголовок функции-операции явного преобразования объекта класса CClass2 в ранее определенный класс CClass1.

  26. Чем вызвана невозможность корректной перегрузки операций && и ||? Почему операции & и | в отличие от первых двух можно легко перегрузить корректно? Дайте обоснование.

  27. Приведите пример определения класса функциональных объектов (функторов).

  28. Имеется прототип функции-операции: double operator () (double, double, double, ...)? Покажите как можно вызвать эту функцию.

  29. В классе функторов CRandomGenerator (генератор случайных чисел с равномерным распределением на отрезке [a,b]) определена лишь одна следующая операция: double operator () (double a, double b) { randomize(); return a + fabs(b - a) * random(10000) / 10000; } Как воспользоваться функциональностью этого класса в программе (получить случайное число)? Приведите фрагмент кода.

  30. Каким образом можно перегрузить функцию operator new? Опишите общие принципы перегрузки.

  31. В чем состоит отличие между операциями new и operator new, delete и operator delete?

  32. Как можно установить специальный обработчик ошибок выделения памяти операцией new? Ответ поясните примером.

  33. В программе есть оператор вида CNamedArray * parr = new (MyNewHandlerFunc) CNamedArray("array", array, sizeof(array)/sizeof(array[0])); Он создает в динамической памяти объект класса CNamedArray (поименованный массив). Что представляет из себя имя MyNewHandlerFunc и как должна выглядеть его декларация?

Задачи

Решить задачи 1, 2 главы 5, используя возможности механизма перегрузки операций38. Использовать по возможности как компонентные, так и глобальные функции-операции.

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