Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ShPOR_OOP.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
261.06 Кб
Скачать

13. Перегрузка операций

Для обеспечения механизма подобных операций, имеется механизм перегрузки операций. Для перегрузки операций в определении класса должна быть объявлена функция с ключевым словом operator и следующим за этим словом знаком операции. Определение функии выглядит следующим образом:

возвр.значение имя_класса::operator#(список_аргументов)

{

//выполняемые_действия...

}

Вместо значка # ставится знак перегружаемой операции.

Количество операндов у перегружаемой функции определяется тем, какая операция перегружается: одноместная или двухместная, а также наличием неявного аргумента у методов класса.

Point2D Point2D::operator-(Point2D p2)

{

Point2D temp;

temp.x=x-p2.x;

temp.y=this->y-p2.y;

return temp;

}

Когда перегружается бинарная операция, у функции будет только один параметр. Этот параметр получит объект, расположенный справа от знака операции. Объект слева вызывает функцию операции и передается неявно посредством использования указателя this. Важно понимать, что для написания функции операции имеется множество вариантов. Рассмотрим вторую реализацию

Point2D operator-(Point2D p2) const;

//Point2D.cpp

Point2D Point2D::operator-(Point2D p2) const

{

return Point2D(x-p2.x, y-p2.y);

}

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

//Point2D.h

Point2D operator-() const;

//Point2D.cpp

Point2D Point2D::operator-() const

{

return Point2D(-x, -y);

}

void main()

{

const Point2D p1(1,2);

Point2D p2(2,3), p3;

(p1-p2).print();//неявный вызов операции минус

p1.operator-(p2).print();//явный вызов

cout<<p1*p2<<”\n”;

(p1-20).print();//будет использоваться операция преобразования типов

}

Надо обратить внимания, что имеется оператор с двумя переменными, выражение p1-20 будет корректно выполняться. В этом случае конструктор автоматически организует вызов конструктора с одним параметром и конструируется для него временный объект. И лишь после этого вызовет функцию-операцию. 2.0-p1 конструироваться не будет, потому что перегруженная операция является методом класса своего первого оператора, а для своего типа данных никакие перегрузки операций недопустимы.

Операции с С++ можно перегружать. Не перегружаются следующие операции:

  1. .

  2. .*

  3. ::

  4. ? :

  5. sizeof

Можно перегружать + * / % ^ & |~ != <> += -= /= == && || ++ ->* -> [] () new delete

Большинство операций не может быть равно перегрузке. То есть те операции, которые выполняются раньше при перегрузке будут вести себя раньше. Изменить количество оперантов, которые берет на себя операция, невозможно. Перегружаемые унарные операции остаются унарными, а бинарные – бинарными. Нельзя создавать новые операции, можно перегружать только существующие. Нельзя изменить с помощью перегрузки операций смысла работы с переменами встроенного типа.

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