Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекция 5-6_n — копия.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
144.59 Кб
Скачать

83

Введение в перегрузку операций

Мы уже знаем, что перегрузка функций обеспечивает механизм создания и выполнения вызовов функций с одним и тем же именем, но с разными параметрами. Это позволяет одной функции работать с несколькими разными типами данных (без необходимости придумывать уникальные имена для каждой из функций).

В языке C++ реализована перегрузка операций и реализована она в виде функций.

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

Использование функции перегрузки для перегрузки операций называется коротко перегрузкой операций.

Операции, как функции

Рассмотрим следующий фрагмент:

double m = 4.0;

double p = 5.0;

std::cout << m + p << '\n';

Компилятор также предоставит встроенную версию операции плюс (+) для операндов типа double.

Выражение m + p приведет к вызову функции operator+ (m, p), а, благодаря перегрузке операции + для стандартных типов, вызовется версия для типа double.

Теперь рассмотрим, что произойдет, если мы попытаемся сложить два объекта класса:

Mystring hello = "Hello, ";

Mystring world = "World!";

std::cout << hello + world << '\n';

Как вы думаете, какой будет результат?

Наверное, вывод строки Hello, World!

Нет, результатом будет ошибка, так как класс Mystring является пользовательским типом данных, а компилятор не имеет встроенной версии функции operator+() для использования с операндами типа Mystring.

Для того, чтобы сделать то, что мы хотим, нам придется написать свою версию функции operator+ () и указать в ней алгоритм работы с операндами типа Mystring.

Использование перегруженных операций

При обработке выражения, содержащего операцию, компилятор использует следующие алгоритмы действий:

    - Если все операнды являются фундаментальных типов данных, то вызывать следует встроенные соответствующие версии операций (если таковые существуют).

- Если таковых не существует, то компилятор выдаст ошибку.

    - Если какой-либо из операндов является пользовательского типа данных (например, объект класса или перечисление), то компилятор будет искать версию операции, которая работает с таким типом данных.

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

Ограничения в перегрузке операций

Во-первых, почти любая существующая операция в языке C++ может быть перегружена. 

Исключениями являются:

    тернарная операция (?:);

    операция sizeof;

    операция разрешения области видимости (::);

   операция выбора члена . и .*.

Во-вторыхвы можете перегрузить только существующие операции.

Вы не можете создавать новые или переименовывать существующие.

Например, вы не можете создать операцию ** для выполнения операции возведения в степень.

В-третьихпо крайней мере один из операндов перегружаемой операции должен быть пользовательского типа данных.

Это означает, что вы не можете перегрузить operator+ () для выполнения операции сложения значения типа int со значением типа double.

Однако вы можете перегрузить operator+ () для выполнения операции сложения значения типа int с объектом класса Mystring.

В-четвертыхизначальное количество операндов, поддерживаемых операцией, изменить невозможно.

Т.е. с бинарной операцией используются только два операнда, с унарной — только один, с тернарной — только три.

Наконец, в – пятых, все операции сохраняют свой приоритет и ассоциативность по умолчанию (независимо от того, для чего они используются), и это не может быть изменено.

Правило:

При перегрузке операций старайтесь максимально приближенно сохранять функционал операций в соответствии с их первоначальными применениями.

Для чего использовать перегрузку операций?

Вы можете перегрузить операцию + для соединения объектов вашего класса String или для выполнения операции сложения двух объектов вашего класса Fraction.

Вы можете перегрузить операцию (<< ) для вывода объекта вашего класса на экран (или записи в файл).

Вы можете перегрузить операцию равенства (==) для сравнения двух объектов класса и т.д.

Подобные применения делают перегрузку операций одной из самых полезных особенностей языка C++, так как это упрощает процесс работы с классами и открывает новые возможности.