Справочник от Автор24
Найди эксперта для помощи в учебе
Найти эксперта
+2

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

Определение 1

Перегрузка оператора присваивания — это по сути процедура копирования величин из объекта в объект.

Введение

Процедура перегрузки операторов, фактически, считается самым удобным способом задания функций. Использовать её нужно с целью упрощения представления кодов, но это не должно вызывать препятствий в их чтении. Необходимо учитывать, так же, невозможность перегрузки операторов совместно с их типами, если они включены. Перегрузку возможно делать только для классов пользователя. По синтаксису форматы перегрузки операторов похожи на представление функций по их имени operator@. В данном случае @ выступает как определитель оператора (возможные символы +, -, ). Существуют два основных способа перегрузки операторов:

  1. С помощью функций глобального масштаба.
  2. С помощью дружественных функций для класса или функций, которые представляют сам класс.

Обычно, операторы (кроме условных) возвращают объект или ссылку на тип аргументов, которые к нему относятся.

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

Следует заметить, что конструктор копирования и оператор присваивания осуществляют практически одинаковую операцию, они оба выполняют копирование величину из одного объекта в величину другого объекта. Но надо учитывать, что конструктор копирования применяется при инициализации вновь сформированных объектов, а оператор присваивания подменяет содержание уже созданных ранее объектов. Когда новый объект сформирован до осуществления процедуры копирования, то применяется конструктор копирования, то есть пересылка или возврат объектов делаются по значению. Но когда формирования нового объекта ещё не было, а действия выполняются с уже сформированным объектом, то применяется оператор присваивания. Процедура перегрузки оператора присваивания (=) достаточно несложная, и осуществляется посредством метода класса, правда с некоторыми нюансами. Ниже пример:

«Перегрузка оператора присваивания» 👇
Помощь эксперта по теме работы
Найти эксперта
Решение задач от ИИ за 2 минуты
Решить задачу
Найди решение своей задачи среди 1 000 000 ответов
Найти

Программа. Автор24 — интернет-биржа студенческих работ

Рисунок 1. Программа. Автор24 — интернет-биржа студенческих работ

Итогом работы, приведённой выше программы, будет 6/7. Функция перегрузки operator= выполняет возврат скрытого указателя *this и имеется возможность соединить осуществление набора операций присваивания в едином комплекте:

Программа. Автор24 — интернет-биржа студенческих работ

Рисунок 2. Программа. Автор24 — интернет-биржа студенческих работ

Самоприсваивание

Язык программирования С++ обладает возможностью осуществлять самоприсваивание. Пример ниже:

Программа. Автор24 — интернет-биржа студенческих работ

Рисунок 3. Программа. Автор24 — интернет-биржа студенческих работ

В этом примере самоприсваивание не ведёт к смене значений и чаще всего самоприсваивание не нужно использовать. Но при использовании динамического выделения памяти, операция самоприсваивания способна стать опасной:

Программа. Автор24 — интернет-биржа студенческих работ

Рисунок 4. Программа. Автор24 — интернет-биржа студенческих работ

Если выполнить эту программу, то в конце она выведет на монитор сообщение Anton, что и планировалось. Рассмотрим, какие события произойдут при осуществлении процедуры присваивания, если неявный и пересылаемый как аргумент объекты будут считаться объектом anton. При этом m_data будет равняться str.m_data (то есть Anton). Во-первых, функция перегрузки выполнит проверку на обладание неявным объектом строки Anton. Если эта строка есть, то выполняется удаление этой величины для предотвращения утечки памяти. То есть величина m_data неявного объекта будет удалена, но ведь и str.m_data получила этот же адрес памяти, который подлежит удалению. То есть str.m_data может стать повисшим указателем. В итоге эти действия приведут к сбою в работе программы.

Обнаружение и обработка самоприсваивания

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

Программа. Автор24 — интернет-биржа студенческих работ

Рисунок 5. Программа. Автор24 — интернет-биржа студенческих работ

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

Оператор присваивания по умолчанию

При компиляции происходит автоматическое предоставление открытого оператора присваивания по умолчанию для выбранного класса при его применении (если это не было заложено в программе), чего не делается для других операторов. В операторе присваивания по умолчанию осуществляется присваивание по членам. Оно аналогично почленной инициализации, применяемой в конструкторах копирования, которые изначально предоставляются С++. Нужно отметить, что существует возможность, как и для других операторов и конструкторов, запрета осуществления операции присваивания с объектами выбранных классов. Для этого нужно сделать оператор закрытым или применить ключевое слово delete.

Программа. Автор24 — интернет-биржа студенческих работ

Рисунок 6. Программа. Автор24 — интернет-биржа студенческих работ

Пример перегрузки оператора присваивания для класса, содержащего одиночные переменные

Объявлен класс Complex, который содержит пару внутренних скрытых (private) переменных. При помощи этих переменных сформирована вещественная и мнимая части комплексного числа. Внутри класса Complex выполнено объявление операторной функции:

Complex operator= (Complex cm)
{
 // ...
}

Она выполняет перегрузку оператора присваивания = для данного класса. Когда будет осуществляться вызов оператора присваивания для объектов (экземпляров), которые принадлежат классу Complex, то последует вызов как раз этой операторной функции.

Символика класса Complex будет следующая:

Программа. Автор24 — интернет-биржа студенческих работ

Рисунок 7. Программа. Автор24 — интернет-биржа студенческих работ

Пример перегрузки оператора присваивания для класса, содержащего массив чисел

Приведём пример, где для класса CArrayFloat100 выполняется реализация операторной функции operator=(), перегружающей массив чисел вида float. Для того, чтобы упростить коды, сделан выбор в классе фиксированного массива чисел из ста компонентов. Операторная функция выполняет пошаговое назначение элементов массивов. Символика класса CArrayFloat100 имеет следующий вид:

Программа. Автор24 — интернет-биржа студенческих работ

Рисунок 8. Программа. Автор24 — интернет-биржа студенческих работ

Пример перегрузки оператора присваивания для класса, содержащего динамический массив структур заданного типа

Определена структура ВООК, описывающая книгу. Выполнено объявление класса ArrayBooks, реализующего динамический массив вида ВООК. Программа приведена ниже:

Программа. Автор24 — интернет-биржа студенческих работ

Рисунок 9. Программа. Автор24 — интернет-биржа студенческих работ

Дата написания статьи: 29.01.2020
Получи помощь с рефератом от ИИ-шки
ИИ ответит за 2 минуты
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot