Необходимо уяснить, что перегружаемые операторы C++ в зависимости от количества операндов бывают унарными (1 операнд) и бинарными (2 операнда, a+b a+=b a<b). Унарные операторы, в свою очередь, в зависимости от положения относительно операнда, бывают префиксными (напр. –a ++a) и постфиксными (a++).
Для перегрузки оператора необходимо написать соответствующую ему операторную функцию в классе либо вне класса (но не обе одновременно). Для правильного составления операторной функции достаточно знать формы вызова операторной функции в ее развернутой форме (табл.1).
Таблица 1. Формы вызовов операторов
Вид оператора |
Вызов |
||
оператора |
оп. функции-члена кл. |
оп. функции не-члена |
|
Бинарный |
aa@bb |
aa.operator@(bb) |
operator@(aa,bb) |
Унарный преф. |
@aa |
aa.operator() |
operator@(aa) |
Унарн. постф. |
aa@ |
aa.operator(nn) |
operator@(aa,nn) |
Примечание: aa,bb – операнды, @ - знак оператора, nn – неиспользуемый операнд типа int
Нужно обращать внимание на правильное определение типа возвращаемого значения. Следует также различать операторы, изменяющие свои операнды, и не изменяющие их. Это влияет на константность формальных параметров операторной функции. В отношении типов параметров и возвращаемого значения рекомендуется придерживаться правила: перегруженный оператор должен быть аналогичен соответствующему встроенному оператору для типа int. Например, если встроенный оператор ‘<’ не изменяет значений своих операндов и возвращает bool, то и перегруженный оператор для типа Date не должен изменять свои операнды и возвращать bool.
Что касается выбора подходящего символа оператора для того или иного действия, то общее правило таково: желательно использовать такой оператор, который имеет соответствующее по смыслу действие для типа int.
Пример использования операторов:
++, -- для того, чтобы «увеличить» и «уменьшить» характеристику объекта на некоторую фиксированную величину (перейти к следующему (предыдущему) дню для типа Date).
+=, -= для того, чтобы «увеличить» и «уменьшить» характеристику объекта на некоторую заданную величину.
< <= > >= для сравнения объектов (в случае, если для данного типа это имеет смысл).
[] () для доступа по индексу (индексам) к объекту-контейнеру (матрице, вектору).
Ислючение составляют операторы << и >>, которые принято использовать для вывода в поток (файл) и ввода из потока (файла).
3.4. Задание на лабораторную работу
Варианты 1-6.
Класс фигуры (согласно своему варианту из л/р.2) изменить таким образом, чтобы передвигать фигуру при помощи вызова операторов. Подходящие операторы подобрать самостоятельно
Например: влево <<=, вправо >>=, вверх +=, вниз -=. Правый операнд указывает количество клеток, на которые нужно пойти.
Перегрузить операторы «больше» и «меньше», операндами которых являются две фигуры. Эти операторы сравнивают положение двух фигур по вертикали. Проверить действие операторов.
Вариант 7.
Написать класс Vector, реализующий концепцию математического вектора. Два вектора можно складывать, вычитать, умножать с помощью операций “+”, “-“, “*”. Реализовать также операцию «унарный минус». Размер вектора задается в конструкторе. Доступ к элементам осуществляется по индексу с помощью операции индексирования []. Проверить действие операторов.
Вариант 8.
Написать класс Matrix, реализующий концепцию математической матрицы. Две матрицы можно складывать, вычитать, умножать с помощью операций “+”, “-“, “*”. Реализовать также операцию «унарный минус». Размер матрицы – 3x3. Доступ к элементам осуществляется по индексу с помощью операции вызова функции (). Проверить действие операторов.
Вариант 9.
Напишите класс clock (часы), который можно использовать для хранения значений времени в виде часов, минут и секунд. Класс clock должен допускать следующее использование:
clock c;c++;/*увеличение на 1 с*/; с--/*уменьшение на 1 с*/; с+=n/* увеличение на n секунд*/;
Два значения времени можно сравнивать на равенство и на больше-меньше
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.