Лабораторная работа №3. Тема: “Перегрузка операций”

Тема: “Перегрузка операций”

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

Перегруженными могут быть практически все операторы, кроме операторов разрешения области видимости, выбора элемента класса, структуры или объединения, условного.

Перегрузка операторов напоминает перегрузку функций и поэтому называется операторной функцией. Однако при этом вводятся некоторые дополнительные правила:

Ø Так как перегружаемый оператор всегда связан с классом, то нельзя переопределять операторы для встроенных типов и нельзя определять дополнительные операторы для встроенных типов;

Ø Нельзя изменять предопределенный приоритет операторов;

Ø Нельзя изменять «-арность» операций, то есть нельзя бинарную операцию сделать унарной или наоборот унарную – бинарной;

Ø Операторная функция может быть перегружена, как и обыкновенная функция с соблюдением правил перегрузки.

Ø Нельзя создавать новых операторов кроме тех, которые определены стандартом С++.

Ø Для операторной функции нельзя задавать стандартные значения параметров.

В общем случае операторная функция объявляется следующим образом:

type operator знак_оператора( список_аргументов );

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

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

При создании класса некоторые функции компилятор «подсовывает» по умолчанию. И если Вас не удовлетворяют такие функции, не поленитесь перегрузить их. К таким функциям относится функция присваивания.

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

Иногда нужно объявить два класса, которые так тесно связаны друг с другом концептуально, что хотелось бы обеспечить одному из них неограниченный доступ к членам второго. Проблемы подобного рода в язык С++ решаются через дружественный класс, который имеет доступ как к общим элементам, так и к частным и защищенным элементам класса. Для того, чтобы объявить весь класс или только какую-либо функцию дружественной какому-либо классу используется ключевое слово friend. На еще необъявленный класс можно ссылаться, как на дружественный.

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

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: