Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
информатика.doc
Скачиваний:
58
Добавлен:
09.02.2015
Размер:
450.05 Кб
Скачать

1 Основные принципы перегрузки операций

Ранее мы познакомились с классами С++ и с абстрактными типами данных (ADT). Операции с объектами класса (т.е. представителями ADT) осуществлялись посредством посылки сообщений объектам (в форме вы­зова функций-элементов). Нотация такого вызова функции становится гро­моздкой для определенных категорий классов, в особенности для математиче­ских. Чтобы оперировать с объектами таких классов, было бы удобно исполь­зовать широкий набор встроенных операций С++. В этой лекции мы пока­жем, как разрешить операциям С++ работать с объектами класса. Этот про­цесс называется перегрузкой операций и является прямым и естественным пу­тем к расширению С++ за счет этих новых возможностей.

Операция << в С++ может иметь различный смысл и используется в каче­стве операции передачи в поток и операции сдвига влево. Это пример перегру­женной операции. Операция >> также перегружена, поскольку она использу­ется как операция извлечения из потока и как операция правого сдвига. Обе эти операции перегружаются в библиотеке классов С++. Сам по себе С++ уже перегружает операции + и -. Эти операции выполняют различные функции, которые зависят от контекста применения - в целочисленной арифметике, арифметике чисел с плавающей точкой и арифметике указателей.

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

Несмотря на то, что перегрузка операций может восприниматься как не­кая экзотическая возможность, большинство программистов неявно использу­ют перегруженные операции. Например, операция плюс (+) работает сущест­венно различным образом с целыми, числами с плавающей точкой и числами с двойной точностью. Но плюс, тем не менее, прекрасно работает с переменны­ми типа int, float и double, а также с числами других встроенных типов, по­скольку операция плюс (+) перегружена уже в самом языке С++.

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

Чтобы использовать операцию с объектами класса, эта операция должна быть перегружена, но здесь есть два исключения. Операция присваивания (=) может использоваться с любым классом без перегрузки. Поведение по умолча­нию операции присваивания (в тех случаях, когда она не перегружена) обеспе­чивается поэлементным копированием элементов данных класса. Такая поэлементная копия, создаваемая по умолчанию, представ­ляет опасность для классов, элементы которых ссылаются на динамически вы­деляемые области памяти; для таких классов мы, как правило, будем перегру­жать операцию присваивания. Операция адреса (&) также может использовать­ся с объектами любого класса без перегрузки; эта операция просто возвращает адрес объекта в памяти. Операция адреса может быть также перегружена.

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