ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 08.11.2023

Просмотров: 137

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Наследование — это механизм создания нового класса на основе уже существующего. При этом к существующему классу могут быть добавлены новые элементы (данные и функции), либо существующие функции могут быть изменены. Основное назначение механизма наследования — повторное использование кодОбщее наследование (public) При общем наследовании порожденный класс имеет доступ к наследуемым членам базового класса с видимостью public и protected. Члены базового класса с видимостью private – недоступны.Частное наследование Порожденный класс может быть базовым для следующего порождения. При порождении private наследуемые члены базового класса, объявленные как protected и public, становятся членами порожденного класса с видимостью private. При этом члены базового класса с видимостью public и protected становятся недоступными для дальнейших порождений. Цель такого порождения — скрыть классы или элементы классов от использования в дальнейших порождениях.Наследование свойствДля производного класса (дочернего) могут быть введены дополнительные члены (данные и функции) и переопределены функции-члены базового класса. Производный класс наследует свойства базовых классов: Данные-члены базовых классов существуют также и для объектов производного класса; Функция-член базового класса может быть вызвана для объектов производного класса; Функции-члены производного класса имеют доступ к членам базового класса, которые объявлены как public или protected. Private-члены базового класса никогда не бывают доступны в производном классе. Производный класс может наследовать свойства нескольких классов. Когда один класс наследует другой: все публичные члены базового класса становятся публич­ными членами производного класса частные члены базового класса не доступны внутри производного класса при наследовании защищенного члена производный класс также имеет к нему доступ.Спецификатор доступ принимает значение:public - все публичные и защищенные члены базового класса становятся соответственно публичными и защищенными членами производного класса private - все публичные и защищенные члены базового класса становятся частными членами производного класса.protected - все публичные и защищенные члены базового класса становятся защищенными членами производного класса.Конструкторы и деструкторы при наследовании Если А – базовый класс, В – производный из А, а С – производный из В (А-В-С), то при создании объекта класса С вызов конструкторов будет иметь следующий порядок: конструктор класса А конструктор класса В конструктор класса С (ABC)
Конструкторы и деструкторы при наследовании Вызов деструкторов при удалении этого объекта произойдет в обратном порядке:  деструктор класса С деструктор класса В деструктор класса А. (CBA)Конструкторы с параметрами При необходимости передать аргумент из производного класса конструктору родительского класса используется расширенная запись конструктора производного класса: КонструкторПроизводногоКласса (СписокФормальныхАргументов) : КонструкторБазовогоКласса (СписокФактическихАргументов) { // тело конструктора производного класса }Наследование конструкторов и деструкторов При создании объектов производного класса осуществляется вызов конструкторов базового класса.  Конструктор базового класса выполняется до конструктора производного класса.  При множественном наследовании вызываются конструкторы от самого верхнего в иерархии класса вниз. Последним вызывается конструктор класса, объект которого создается.  Когда класс имеет несколько базовых классов, их конструкторы вызываются в том порядке, в котором они записаны в описании производного класса. Например: class X: public B1, public B2 { } // Новый класс Х создается на базе // классов B1 и B2 Дальше (в программе) X a; // При создании нового объекта первым будет вызван // конструктор B1, потом B2, а потом конструктор Х.  Деструкторы базовых объектов вызываются в последовательности, обратно той, в которой вызывались их конструкторы.ВИРТУАЛЬНЫЕ ФУНКЦИИ - это специальный вид функций-членов класса. Виртуальная функция отличается об обычной функции тем, что для обычной функции связывание вызова функции с ее определением осуществляется на этапе компиляции. Для виртуальных функций это происходит во время выполнения программы.Виртуальные функции Для объявления виртуальной функции используется ключевое слово virtual. Функция-член класса может быть объявлена как виртуальная, если:  класс, содержащий виртуальную функцию, базовый в иерархии порождения;  реализация функции зависит от класса и будет различной в каждом порожденном классе.Виртуальная функция — это функция, которая определяется в базовом классе, а любой порожденный класс может ее переопределить. Виртуальная функция вызывается только через указатель или ссылку на базовый класс. Определение того, какой экземпляр виртуальной функции вызывается по выражению вызова функции, зависит от класса объекта, адресуемого указателем или ссылкой, и осуществляется во время выполнения программы. Этот механизм называется динамическим (поздним) связыванием или разрешением типов во время выполнения.

Виртуальные функции являются особыми функциями, потому что при вызове объекта производного класса с помощью указателя или ссылки на него во время исполнения программы определяется какую функцию надо вызвать, основываясь на типе объекта.Ключевым моментом в использовании виртуальной функции для обеспечения полиморфизма времени исполнения служит то, что используется указатель именно на базовый класс. Полиморфизм времени исполнения достигается только при вызове виртуальной функции с использованием указателя или ссылки на базовый классАбстрактные базовые классы Базовый класс иерархии обычно содержит ряд виртуальных функций, которые обеспечивают динамическую типизацию. Часто в самом базовом классе сами виртуальные функции фиктивны и имеют пустое тело. Определенное значение им придается лишь в порожденных классах. Такие функции называются чистыми виртуальными функциями.Чистая виртуальная функция — это функциячлен класса, тело которой не определено. В базовом классе такая функция записывается следующим образом: virtual ПрототипФункции = 0; Например virtual void func() = 0;Чистая виртуальные функции используются для того, чтобы отложить решение задачи о реализации функции на более поздний срок. В терминологии ООП это называется отсроченным методом. Класс, имеющий по крайней мере одну чистую виртуальную функцию, называется абстрактным классом.Множественное наследование Если порожденный класс наследует элементы одного базового класса, то такое наследование называется одиночным. Возможно и множественное наследование. Множественное наследование позволяет порожденному классу наследовать элементы более, чем от одного базового класса.Для доступа к членам порожденного класса, унаследованного от нескольких базовых классов, используются те же правила, что и при порождении из одного базового класса. Проблемы могут возникнуть в следующих случаях:  если в порожденном классе используется член с таким же именем, как в одном из базовых классов;  когда в нескольких базовых классах определены члены с одинаковыми именами. В этих случаях необходимо использовать оператор разрешения контекста для уточнения элемента (::).Порядок выполнения конструкторов при порождении из нескольких классов следующий: конструкторы базовых классов в порядке их задания; конструкторы членов, являющихся объектами класса; конструктор порожденного класса.
Деструкторы вызываются в порядке обратном вызову конструкторов.Когда два или более класса порождаются от одного общего базового класса, можно предотвратить включение нескольких копий базового класса в объект-потомок этих классов путем объявления базового класса виртуальным при его наследовании.Обычные и виртуальные базовые классы отличаются друг от друга только тогда, когда какой- либо объект наследует базовый класс более одного раза. При использовании виртуального базового класса только одна копия базового класса содержится в объекте. В случае использования обычного базового класса в объекте могут содержаться несколько копийШаблоны классов Аналогично шаблонам функций определяется шаблон семейства классов: template

ОпределениеКласса

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

Передача параметров в программу (аргументы функции main) При автоматизированном создании консольного приложения в языке программирования С++, автоматически создается главная функция очень похожая на эту: int main(int argc, char* argv[]) {...} Заголовок функции содержит сигнатуру главной функции main() с аргументами argс и argv.

Параметр argc имеет тип int, и содержит количество параметров + 1, передаваемых в функцию main. Причем argc всегда не меньше 1, даже когда функции main не передается никакой информации, так как первым параметром считается имя приложения. Параметр argv[] представляет собой массив указателей на строки. Через командную строку можно передать только данные строкового типа. argv[0] – путь к приложению и его имя

UML – это система обозначений, которую можно применять для объектно-ориентированного анализа и проектирования. Его (язык UML) можно использовать для визуализации, спецификации, конструирования и документирования программных систем. Словарь UML включает три вида строительных блоков:  Диаграммы.  Сущности.  Связи.

UML - язык графический UML - это язык моделирования. Причем объектно-ориентированного моделирования.

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

СПЕЦИФИКАЦИИ

ВИЗУАЛИЗАЦИИ

ПРОЕКТИРОВАНИЯ

ДОКУМЕНТИРОВАНИЯ

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

UML включает три вида «строительных» блоков:

Диаграммы.

Сущности.

Связи.

Сущности – это абстракции, которые являются основными элементами модели, связи соединяют их между собой, а диаграммы группируют представляющие интерес наборы сущностей

Диаграмма – это графическое представление набора элементов, чаще всего изображенного в виде связного графа вершин (сущностей) и путей (связей). Язык UML включает несколько видов диаграмм, среди которых на первом месте— диаграмма классов (про нее поговорим отдельно и подробно).

В UML используется четыре вида элементов нотации: фигуры, линии, значки, надписи

Виды диаграмм UML

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

Подсистема - это система, функционирование которой не зависит от сервисов других подсистем.

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

Модель - это некий объект, отображающий лишь наиболее значимые для данной задачи характеристики системы.

Виды диаграмм. Все диаграммы разделенных на три группы. Это диаграммы которые представляют:

статическую структуру приложения;

поведенческие аспекты системы;

физические аспекты функционирования системы (диаграммы реализации).

Рассмотрим кратко основные виды диаграмм:

диаграмма прецедентов;

диаграмма классов;

диаграмма объектов;

диаграмма последовательностей;

диаграмма взаимодействия;

диаграмма состояний;

диаграмма активности;

диаграмма развертывания.

Диаграмма прецедентов (use case diagram) Любые системы проектируются с учетом того, что в процессе своей работы они будут использоваться людьми и/или взаимодействовать с другими системами. Сущности, с которыми взаимодействует система в процессе своей работы, называются экторами. При этом каждый эктор ожидает, что система будет вести себя строго определенным, предсказуемым образом.

Диаграмма прецедентов (use case diagram) Эктор (actor) - это множество логически связанных ролей, исполняемых при взаимодействии с прецедентами или сущностями (система, подсистема или класс). Эктором может быть человек или другая система, подсистема или класс, которые представляют нечто вне сущности.

Прецедент (use-case) - описание отдельного аспекта поведения системы с точки зрения пользователя. Более широко Прецедент (use case) - описание множества последовательных событий (включая варианты), выполняемых системой, которые приводят к наблюдаемому эктором результату. Прецедент представляет поведение сущности, описывая взаимодействие между экторами и системой. Прецедент не показывает, "как" достигается некоторый результат, а только "что" именно выполняется.

Итог. Цели создания диаграмм прецедентов:

определение границы и контекста моделируемой предметной области на ранних этапах проектирования;

формирование общих требований к поведению проектируемой системы;

разработка концептуальной модели системы для ее последующей детализации;

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

Диаграмма классов (class diagram) (пока кратко) Класс (class) - категория вещей, которые имеют общие атрибуты и операции. Классы - это строительные блоки любой объектно-ориентированной системы. Они представляют собой описание совокупности объектов с общими атрибутами, операциями, отношениями и семантикой. При проектировании объектно-ориентированных систем диаграммы классов обязательны.

Диаграмма объектов (object diagram) Что такое объект? Если кратко, то это - экземпляр класса. Объект (object)

конкретная материализация абстракции;

сущность с хорошо определенными границами, в которой инкапсулированы состояние и поведение;

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

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

Диаграмма объектов показывает множество объектов - экземпляров классов (изображенных на диаграмме классов) и отношений между ними в некоторый момент времени. Диаграмма объектов - это своего рода снимок состояния системы в определенный момент времени, показывающий множество объектов, их состояния и отношения между ними в данный момент.

Диаграмма последовательностей (sequence diagram) Если диаграмма объектов показывает отношения между объектами в некоторый момент времени, т. е. предоставляет нам снимок состояния системы, являясь статической, то диаграмма последовательностей отображает взаимодействие объектов в динамике

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

Диаграмма взаимодействия (кооперации, collaboration diagram) Диаграммы последовательностей – это средство документирования поведения системы, детализации логики сценариев использования. Диаграмма объектов показывает статику (снимок системы) связи между объектами в данный момент времени. А диаграмма взаимодействия, как и диаграмма последовательностей, показывает взаимодействие объектов во времени, т. е. в динамике.

Диаграмма состояний (statechart diagram) Объекты характеризуются поведением и состоянием, в котором находятся (объекты что-то делают и что-то «знают»). Диаграммы состояний применяются для того, чтобы объяснить, каким образом работают сложные объекты. Состояние (state) - ситуация в жизненном цикле объекта, во время которой он удовлетворяет некоторому условию, выполняет определенную деятельность или ожидает какого-то события. Состояние объекта определяется значениями некоторых его атрибутов.

Диаграмма активности (деятельности, activity diagram) Мы знаем что такое блок-схемы и зачем они нужны. Моделируя поведение проектируемой системы, часто недостаточно изобразить процесс смены ее состояний, а нужно также раскрыть детали алгоритмической реализации операций, выполняемых системой. Для этого традиционно использовались блок-схемы. В UML для этого существуют диаграммы деятельности, являющиеся частным случаем диаграмм состояний.

Диаграмма развертывания (deployment diagram) Программа создается для работы на компьютере, который имеет аппаратную конфигурацию и работает под управлением операционной системы. Корпоративные приложения часто требуют для своей работы некоторую ИТ-инфраструктуру. Для решения всех проблем хорошо иметь графическое представление инфраструктуры, на которую будет развернуто приложение. Для этого и нужны диаграммы развертывания, которые иногда называют диаграммами размещения.

Советы Процесс построения диаграммы активностей можно описать в виде последовательности действий: 1. Составление перечня деятельностей в системе

2. Принятие решения о необходимости построения диаграммы деятельностей

3. Определение зависимостей между деятельностями

4. Выделение параллельных потоков деятельностей

5. Определение условий переходов

6. Уточните сложные деятельности

Выводы

Диаграммой деятельности можно дополнить любой элемент модели, имеющий динамическое поведение.

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

На диаграммах активности можно использовать дорожки, распределяющие деятельности в соответствии с ролями (объектами), их выполняющими

Сообщения бывают синхронными и асинхронными. Синхронные сообщения приостанавливают поток выполнения до тех пор, пока не будет получен ответ.

Асинхронные сообщения не ждут ответа, не приостанавливают поток выполнения - сразу после их посылки происходит немедленный переход к следующему шагу, и последовательность продолжается

Диаграммы кооперации предназначены для описания динамических аспектов моделируемой системы. Обычно они применяются для того, чтобы:  показать набор взаимодействующих объектов в реальном окружении;  распределить функциональность между классами, основываясь на результатах изучения динамических аспектов системы;  описать логику выполнения сложных операций, особенно в тех случаях, когда один объект взаимодействует еще с несколькими объектами;  изучить роли, выполняемые объектами внутри системы, а также отношения между объектами, в которые они вовлекаются, выполняя эти роли.
Говоря о диаграммах кооперации, часто упоминают два «уровня»: уровень экземпляров (Instance-Level) уровень спецификации (Specification-Level). Уровень экземпляров отображает взаимодействия между объектами (экземплярами классов) (такая диаграмма обычно создается, чтобы исследовать внутреннее устройство объектноориентированной системы).

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

Нотации диаграмм взаимодействия Кооперация (collaboration) - это статическая конструкция для моделирования набора сущностей, взаимодействующих друг с другом до 120 стр(еше 86 стр не осилил этой хрени)

STL — это часть Стандартной библиотеки С++, которая содержит набор шаблонов контейнерных классов, алгоритмов и итераторов. Изначально она была сторонней разработкой, но позже была включена в Стандартную библиотеку С++. Если нужен какой-нибудь общий класс или алгоритм, то, скорее всего, в стандартной библиотеке шаблонов он уже есть.

Библиотека содержит пять основных видов компонентов:  алгоритм (algorithm): определяет вычислительную процедуру.  контейнер (container): управляет набором объектов в памяти.  итератор (iterator): обеспечивает для алгоритма средство доступа к содержимому контейнера.  функциональный объект (function object): инкапсулирует функцию в объекте для использования другими компонентами.  адаптер (adaptor): адаптирует компонент для обеспечения различного интерфейса

Рассмотрим их  Контейнер — хранение набора объектов в памяти.  Итератор — средство доступа к содержимому отдельных объектов в контейнере.  Алгоритм — определение наиболее стандартных вычислительных процедур на контейнерах.  Адаптер — адаптация основных категорий для обеспечения наиболее употребляемых интерфейсов (таких как стек или очередь).  Функтор (функциональный объект) — сокрытие функции в объекте для использования её другими категориями

Если говорить в общем, то контейнеры делятся на три основные категории:  последовательные;  ассоциативные;  адаптеры.

STL вводит целый ряд разнообразных типов контейнеров:  последовательные контейнеры — вектор (vector), двусвязный список (list), дэк (deque);  ассоциативные контейнеры — множества (set и multiset ), хэш-таблицы (map и multimap);  псевдо-контейнеры — битовые маски (bitset), строки (string и wstring), массивы (valarray);

Класс vector (или просто «вектор») — это динамический массив, способный увеличиваться по мере необходимости для содержания всех своих элементов. Класс vector обеспечивает произвольный доступ к своим элементам через оператор индексации [], а также поддерживает вставку и удаление элементов.

Хотя о классе string (и wstring) обычно не говорят, как о последовательном контейнере, но он, по сути, таковым является, поскольку его можно рассматривать как вектор с элементами типа char (или wchar).

Контейнер вектор является аналогом обычного массива, за исключением того, что он автоматически выделяет и освобождает память по мере необходимости. Контейнер эффективно обрабатывает произвольную выборку элементов с помощью операции индексации []. Однако вставка элемента в любую позицию, кроме конца вектора, неэффективна. Для этого потребуется сдвинуть все последующие элементы путем копирования их значений. По этой же причине неэффективным является удаление любого элемента, кроме последнего

Контейнер список организует хранение объектов в виде двусвязного списка. Каждый элемент списка содержит три поля: значение элемента, указатель на предшествующий и указатель на последующий элементы списка. Вставка и удаление работают эффективно для любой позиции элемента в списке. Однако список не поддерживает произвольного доступа к своим элементам: например, для выборки n-го элемента нужно последовательно выбрать предыдущие n–1 элементов

Контейнер двусторонняя очередь (дек) во многом аналогичен вектору, элементы хранятся в непрерывной области памяти. Но в отличие от вектора дек эффективно поддерживает вставку и удаление первого элемента (так же, как и последнего).

insert(iterator position, const T& value) Вставка элемента со значением valueв позицию, заданную итератором position

insert(iterator position, size_type n, const T& value) Вставка nэлементов со значением value, начиная с позиции position

template void insert(iterator position, InputIter first, InputIter last) Вставка диапазона элементов, заданного итераторами firstи last, начиная с позиции position

erase(iterator position) Удаление элемента, на который указывает итератор position

erase(iterator first, iterator last) Удаление диапазона элементов, заданного позициями first и last

set — это контейнер, в котором хранятся только уникальные элементы, повторения запрещены. Элементы сортируются в соответствие с их значениями.

multiset — это set, но в котором допускаются повторяющиеся элементы

map (или ещё «ассоциативный массив») — это set, в котором каждый элемент является парой «ключ-значение». Ключ используется для сортировки и индексации данных и должен быть уникальным. А значение — это фактические данные.  multimap (или ещё «словарь») — это map, который допускает дублирование ключей. Все ключи отсортированы в порядке возрастания, и вы можете посмотреть значение по ключу.

Адаптеры — это специальные предопределённые контейнерные классы, которые адаптированы для выполнения конкретных заданий. Самое интересное заключается в том, можно выбрать, какой последовательный контейнер должен использовать адаптер

stack (стек) — это контейнерный класс, элементы которого работают по принципу LIFO («Last In, First Out» = «Последним Пришёл, Первым Ушёл»),

queue (очередь) — это контейнерный класс, элементы которого работают по принципу FIFO («First In, First Out» = «Первым Пришёл, Первым Ушёл»),

priority_queue (очередь с приоритетом) — это тип очереди, в которой все элементы отсортированы (с помощью оператора сравнения

Итератор — это объект, который способен перебирать элементы контейнерного класса без необходимости пользователю знать реализацию определённого контейнерного класса.

Функционал итераторов Об итераторе можно думать, как об указателе на определённый элемент контейнерного класса с дополнительным набором перегруженных операторов для выполнения чётко определённых функций:

Оператор * возвращает элемент, на который в данный момент указывает итератор.

Оператор ++ перемещает итератор к следующему элементу контейнера. Большинство итераторов также предоставляют оператор −− для перехода к предыдущему элементу

Операторы == и != используются для определения того, указывают ли два итератора на один и тот же элемент или нет. Для сравнения значений, на которые указывают два итератора, нужно сначала разыменовать эти итераторы, а затем использовать оператор == или !=.

Оператор = присваивает итератору новую позицию (обычно начало или конец элементов контейнера). Чтобы присвоить значение элемента, на который указывает итератор, другому объекту, нужно сначала разыменовать итератор, а затем использовать оператор =.

Каждый контейнерный класс имеет 4 основных метода для работы с оператором =:

begin() возвращает итератор, представляющий начало элементов контейнера. end() возвращает итератор, представляющий элемент, который находится после последнего элемента в контейнере.

cbegin() возвращает константный (только для чтения) итератор, представляющий начало элементов контейнера.

cend() возвращает константный (только для чтения) итератор, представляющий элемент, который находится после последнего элемента в контейнере.

Все контейнеры предоставляют (как минимум) два типа итераторов:  container::iterator — итератор для чтения/записи;  container::const_iterator — итератор только для чтения.

Алгоритмы STL реализованы в виде глобальных функций, которые работают с использованием итераторов. Это означает, что каждый алгоритм нужно реализовать всего лишь один раз, и он будет работать со всеми контейнерами, которые предоставляют набор итераторов (включая и наши собственные (пользовательские) контейнерные классы)