Читайте также:
|
|
Ранее мы познакомились с классами С++ и с абстрактными типами данных (ADT). Операции с объектами класса (т.е. представителями ADT) осуществлялись посредством посылки сообщений объектам (в форме вызова функций-элементов). Нотация такого вызова функции становится громоздкой для определенных категорий классов, в особенности для математических. Чтобы оперировать с объектами таких классов, было бы удобно использовать широкий набор встроенных операций С++. В этой лекции мы покажем, как разрешить операциям С++ работать с объектами класса. Этот процесс называется перегрузкой операций и является прямым и естественным путем к расширению С++ за счет этих новых возможностей.
Операция << в С++ может иметь различный смысл и используется в качестве операции передачи в поток и операции сдвига влево. Это пример перегруженной операции. Операция >> также перегружена, поскольку она используется как операция извлечения из потока и как операция правого сдвига. Обе эти операции перегружаются в библиотеке классов С++. Сам по себе С++ уже перегружает операции + и -. Эти операции выполняют различные функции, которые зависят от контекста применения - в целочисленной арифметике, арифметике чисел с плавающей точкой и арифметике указателей.
В целом С++ дает программисту возможность перегружать большинство операций, так чтобы они были чувствительны к контексту, в котором применяются. Компилятор генерирует соответствующий программный код, исходя из способа применения данной операции. Некоторые операции перегружаются достаточно часто, особенно операции присваивания и различные арифметические операции, такие как + и -. Программист также может использовать операции с типами, определенными пользователем. Несмотря на то, что С++ не позволяет создавать новые операции, он позволяет перегружать существующие операции и, когда они применяются к объектам класса, операции приобретают смысл, соответствующий новым типам. Это очень сильная сторона С++.
Несмотря на то, что перегрузка операций может восприниматься как некая экзотическая возможность, большинство программистов неявно используют перегруженные операции. Например, операция плюс (+) работает существенно различным образом с целыми, числами с плавающей точкой и числами с двойной точностью. Но плюс, тем не менее, прекрасно работает с переменными типа int, float и double,а также с числами других встроенных типов, поскольку операция плюс (+) перегружена уже в самом языке С++.
Операции перегружаются посредством написания обычного определения функции (с заголовком и телом) за исключением того, что именем функции становится ключевое слово operator с последующим символом перегружаемой операции. Например, имя функции operator могло бы использоваться для перегрузки аддитивной операции.
Чтобы использовать операцию с объектами класса, эта операция должна быть перегружена, но здесь есть два исключения. Операция присваивания (=) может использоваться с любым классом без перегрузки. Поведение по умолчанию операции присваивания (в тех случаях, когда она не перегружена) обеспечивается поэлементным копированием элементов данных класса. Такая поэлементная копия, создаваемая по умолчанию, представляет опасность для классов, элементы которых ссылаются на динамически выделяемые области памяти; для таких классов мы, как правило, будем перегружать операцию присваивания. Операция адреса (&) также может использоваться с объектами любого класса без перегрузки; эта операция просто возвращает адрес объекта в памяти. Операция адреса может быть также перегружена.
Перегрузка в наибольшей степени подходит для математических классов. Они часто требуют перегрузки большого перечня операций, чтобы сохранялась согласованность со способом обработки математических объектов, которые существуют в реальной жизни.
Дата добавления: 2015-07-16; просмотров: 68 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Описать класс, реализующий стек. | | | Запреты на перегрузку операций |