
- •1 Основные принципы перегрузки операций
- •Запреты на перегрузку операций
- •3 Структуры
- •Доступ к элементам структур
- •Динамическое распределение памяти
- •Связанные списки
- •Очереди
- •7. Программные продукты и их основные характеристики: основные понятия программного обеспечения; характеристики программных продуктов; защита программных продуктов; классификация программных продуктов
- •4. Классы программных продуктов
- •1) Составление технического задания на программирование
- •2) Составление технического проекта
- •3) Создание рабочей документации (рабочего проекта)
- •4) Ввод в действие
- •1) Диалоговый режим
- •2) Графический интерфейс пользователя
- •9. Сети эвм и протоколы передачи информации:
- •10. Экспертные системы: архитектура, типы решаемых задач, методика построения, области применения. Различные подходы к построению систем ии.
- •11. Понятие модели данных. Иерархическая, сетевая, реляционная, объектная модель. Типы структур данных. Операции над данными. Ограничения целостности.
- •2.3. Иерархическая модель данных (имд)
- •12. Нормализация отношений. Нормальные формы. Запросы и операторы манипулирования данными. Язык запросов sql.
1 Основные принципы перегрузки операций
Ранее мы познакомились с классами С++ и с абстрактными типами данных (ADT). Операции с объектами класса (т.е. представителями ADT) осуществлялись посредством посылки сообщений объектам (в форме вызова функций-элементов). Нотация такого вызова функции становится громоздкой для определенных категорий классов, в особенности для математических. Чтобы оперировать с объектами таких классов, было бы удобно использовать широкий набор встроенных операций С++. В этой лекции мы покажем, как разрешить операциям С++ работать с объектами класса. Этот процесс называется перегрузкой операций и является прямым и естественным путем к расширению С++ за счет этих новых возможностей.
Операция << в С++ может иметь различный смысл и используется в качестве операции передачи в поток и операции сдвига влево. Это пример перегруженной операции. Операция >> также перегружена, поскольку она используется как операция извлечения из потока и как операция правого сдвига. Обе эти операции перегружаются в библиотеке классов С++. Сам по себе С++ уже перегружает операции + и -. Эти операции выполняют различные функции, которые зависят от контекста применения - в целочисленной арифметике, арифметике чисел с плавающей точкой и арифметике указателей.
В целом С++ дает программисту возможность перегружать большинство операций, так чтобы они были чувствительны к контексту, в котором применяются. Компилятор генерирует соответствующий программный код, исходя из способа применения данной операции. Некоторые операции перегружаются достаточно часто, особенно операции присваивания и различные арифметические операции, такие как + и -. Программист также может использовать операции с типами, определенными пользователем. Несмотря на то, что С++ не позволяет создавать новые операции, он позволяет перегружать существующие операции и, когда они применяются к объектам класса, операции приобретают смысл, соответствующий новым типам. Это очень сильная сторона С++.
Несмотря на то, что перегрузка операций может восприниматься как некая экзотическая возможность, большинство программистов неявно используют перегруженные операции. Например, операция плюс (+) работает существенно различным образом с целыми, числами с плавающей точкой и числами с двойной точностью. Но плюс, тем не менее, прекрасно работает с переменными типа int, float и double, а также с числами других встроенных типов, поскольку операция плюс (+) перегружена уже в самом языке С++.
Операции перегружаются посредством написания обычного определения функции (с заголовком и телом) за исключением того, что именем функции становится ключевое слово operator с последующим символом перегружаемой операции. Например, имя функции operator могло бы использоваться для перегрузки аддитивной операции.
Чтобы использовать операцию с объектами класса, эта операция должна быть перегружена, но здесь есть два исключения. Операция присваивания (=) может использоваться с любым классом без перегрузки. Поведение по умолчанию операции присваивания (в тех случаях, когда она не перегружена) обеспечивается поэлементным копированием элементов данных класса. Такая поэлементная копия, создаваемая по умолчанию, представляет опасность для классов, элементы которых ссылаются на динамически выделяемые области памяти; для таких классов мы, как правило, будем перегружать операцию присваивания. Операция адреса (&) также может использоваться с объектами любого класса без перегрузки; эта операция просто возвращает адрес объекта в памяти. Операция адреса может быть также перегружена.
Перегрузка в наибольшей степени подходит для математических классов. Они часто требуют перегрузки большого перечня операций, чтобы сохранялась согласованность со способом обработки математических объектов, которые существуют в реальной жизни.