- •1 Основные принципы перегрузки операций
- •Запреты на перегрузку операций
- •3 Структуры
- •Доступ к элементам структур
- •Динамическое распределение памяти
- •Связанные списки
- •Очереди
- •7. Программные продукты и их основные характеристики: основные понятия программного обеспечения; характеристики программных продуктов; защита программных продуктов; классификация программных продуктов
- •4. Классы программных продуктов
- •1) Составление технического задания на программирование
- •2) Составление технического проекта
- •3) Создание рабочей документации (рабочего проекта)
- •4) Ввод в действие
- •1) Диалоговый режим
- •2) Графический интерфейс пользователя
- •9. Сети эвм и протоколы передачи информации:
- •10. Экспертные системы: архитектура, типы решаемых задач, методика построения, области применения. Различные подходы к построению систем ии.
- •11. Понятие модели данных. Иерархическая, сетевая, реляционная, объектная модель. Типы структур данных. Операции над данными. Ограничения целостности.
- •2.3. Иерархическая модель данных (имд)
- •12. Нормализация отношений. Нормальные формы. Запросы и операторы манипулирования данными. Язык запросов sql.
Запреты на перегрузку операций
Большая часть операций С++ может быть перегружена. Эти операции приведены ниже.
Операции, которые могут быть перегружены | |||||||
+ |
- |
* |
/ |
% |
^ |
& |
| |
~ |
! |
= |
< |
> |
+= |
-= |
*= |
/= |
%= |
^= |
&= |
|= |
<< |
>> |
>>= |
<<= |
= = |
!= |
<= |
>= |
&& |
|| |
++ |
-- |
->* |
, |
-> |
[] |
( ) |
new |
delete |
Теперь приведем операции, которые не могут перегружаться.
Операции, которые не могут быть перегружены | ||||
. |
.* |
:: |
?: |
sizeof |
Приоритет операций не может быть изменен посредством перегрузки. Это может привести к неудобным ситуациям, когда операция перегружается так, что ее фиксированный приоритет плохо соответствует смыслу выполняемых действий. Тем не менее, остается возможность использовать скобки для определения порядка оценки перегруженных операций в выражении.
Ассоциативность операций также не может быть изменена посредством перегрузки. Для перегрузки операций нельзя использовать аргументы по умолчанию.
Отсутствует возможность изменить число операндов, которое подразумевает операция. Одноместная операция остается одноместной и при перегрузке, а двухместная остается двухместной. Единственная трехместная операция С++, условная (?:), не может быть перегружена. Каждая из операций &, *, + и - имеет одноместную и двухместную формы, которые могут перегружаться раздельно.
Нельзя создавать новые операции; только существующие операции могут быть перегружены. Это запрещает программисту пользоваться такими популярными нотациями, как операция **, означающая в языке Basic возведение в степень.
При перегрузке ( ), [ ], -> или = перегружающая операцию функция должна объявляться как функция-элемент. Для других операций перегружающие функции могут быть друзьями.
Перегрузка операции присваивания и операции суммирования с целью разрешить такие операции, как
object2 = object2 + object1;
не означает, что автоматически будет перегружена операция +=, чтобы выполнялся такой оператор, как
object2 += object1;
Однако такое поведение может быть достигнуто посредством явной перегрузки операции += для этого класса.
2 Базовые и производные классы.
Наследование представляет собой механизм повторного использования программного обеспечения, в соответствии с которым новые классы создаются на основе существующих. Эти классы наследуют свойства и поведение базовых классов и приобретают дополнительно новые, необходимые для новых классов, качества. Возможность повторного использования программного обеспечения сберегает время, затраченное на его разработку, способствует повторному использованию апробированного и отлаженного высококачественного программного обеспечения и уменьшает число эксплутационных проблем, когда система начинает функционировать. Это сулит богатые возможности. Полиморфизм позволяет нам писать программы в общем виде для обработки большого разнообразия существующих и определяемых в дальнейшем логически связанных классов. Наследование и полиморфизм представляют собой эффективные методики для разработки сложных программных систем.
При создании нового класса вместо того, чтобы писать совершенно новые элементы данных и функции-элементы, программист может просто указать, что новый класс должен наследовать элементы ранее определенного базового класса. Этот новый класс называется производным классом. Каждый производный класс, в свою очередь, может быть базовым для каких-то будущих производных классов. При простом наследовании производный класс получается на основе только одного базового класса. При сложном наследовании производный класс наследует свойства от многих (возможно, логически не связанных) классов. Новый класс, как правило, вводит свои элементы данных и функции, поэтому производный класс, вообще говоря, «больше» исходного базового класса. Новый производный класс имеет больше специфических свойств в сравнении с исходным базовым и представляет меньшую группу объектов. В случае простого наследования производный класс в своей основе остается по существу таким же, как базовый класс. Настоящая сила наследования определяется возможностью добавлять, замещать и уточнять наследуемые от базовых классов свойства.
Каждый объект производного класса является также объектом базового класса, из которого получен этот производный класс. Однако противоположное неверно - объекты базового класса не являются объектами производных классов базового объекта. Мы воспользуемся этим отношением - «объект производного класса является объектом базового класса», чтобы выполнять некоторые интересные преобразования. Например, мы можем перечислить много разных объектов, связанных отношением наследования, в связанном списке объектов базового класса. Это позволит обрабатывать разные объекты одним общим образом. Как мы в дальнейшем увидим в этой и следующей главах, это является одним из важнейших методов объектно-ориентированного программирования.
Мы введем в этой лекции новое средство для управления доступом к элементу - речь идет о защищенном доступе. Производные и дружественные им классы имеют право доступа к защищенным элементам базового класса; у остальных функций такого права нет.
Производный класс не может иметь доступа к закрытым элементам своего базового класса; такой доступ нарушал бы инкапсуляцию последнего. Однако производный класс может иметь доступ к открытым и защищенным элементам базового класса. Элементы базового класса, доступ к которым не разрешен для производного класса через отношение наследования, должны быть объявлены в базовом классе как закрытые. Производный класс может иметь доступ к закрытым элементам базового класса только через специальные функции доступа, предоставляемые открытым интерфейсом базового класса.
Одна проблема с наследованием заключается в том, что производный класс может наследовать открытые функции-элементы, которые не нужно или не следовало бы иметь в «потомстве» явно. Если какой-нибудь элемент базового класса не подходит для производного класса, этот элемент может быть переопределен в самом производном классе с соответствующей реализацией.
Часто объект одного класса «является» также и объектом другого класса. Прямоугольник - rectangle, конечно же, является четырехугольником - quadrilateral (как являются и квадрат, и параллелограмм, и трапеция). Таким образом, о классе Rectangle можно сказать, что он наследует классу Quadrilateral. В этом смысле класс Quadrilateral называется базовым, а класс Rectangle называется производным. Прямоугольник является специальным типом четырехугольника, но нельзя исходя из этого утверждать, что четырехугольник является прямоугольником.
Защищенные элементы.
Все функции программы имеют доступ к открытым элементам базового класса. Доступ к закрытым элементам базового класса имеют только элементы-функции самого класса и его «друзья».
Защищенный доступ представляет собой промежуточный уровень защиты между закрытым и открытым доступом. Защищенные элементы базового класса могут быть доступны только для элементов и друзей самого класса и для элементов и друзей производных классов.
Элементы производного класса могут вызывать открытые и защищенные элементы базового класса просто по имени элемента. При этом не обязательно использовать операцию разрешения области действия - по умолчанию имеется в виду текущий объект.
Сложное наследование.
До сих пор мы обсуждали механизм простого наследования, в котором каждый класс выводится только из одного базового класса. Однако класс может быть получен из нескольких базовых классов; такой механизм образования класса называется сложным наследованием. Сложное наследование означает, что производный класс наследует элементы нескольких базовых классов. Этот мощный механизм дает интересные формы повторного использования программного обеспечения, но вместе с тем может порождать ряд проблем, связанных с неоднозначностью.
Абстрактные базовые классы и конкретные классы
Когда мы говорим о классе как о типе, мы подразумеваем, что будут создаваться объекты этого типа. Однако во многих случаях бывает полезно определять классы, объекты которых не будут создаваться. Такие классы называются абстрактными классами. Поскольку они используются в наследовании в качестве базовых классов, мы будем называть их абстрактными базовыми классами. Объекты абстрактного базового класса создавать нельзя.
Единственная цель определения абстрактного класса состоит в том, чтобы предусмотреть обобщенныйбазовый класс, на основе которого строится иерархия наследования. Классы, для которых могут создаваться объекты, называются конкретными классами.Например, мы могли бы определить абстрактный базовый класс TwoDimensionalObject и произвести от него классы типа Square, Circle, Triangle