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




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

Основные причины сложности ПО:

− сложность реальной предметной области;

− трудности управления процессом разработки ПО;

− обеспечение высокой гибкости ПО;

− отсутствие способов точного описания поведения больших дискретных систем (т.е. невозможно формально доказать работоспособность программы).

 

Общие признаки любой сложной системы:

− иерархичность;

− неопределенность элементарных объектов;

− наличие подсистем;

− огриченность типов подсистем;

− эволюционирование от простого к сложному.

 

Приемы борьбы со сложностью ПО:

− декомпозиция (алгоримическая и объектно-ориентрованная);

− абстракция;

− построение иерархий (объектная структура и структура классов).

 

Перечислить и дать характеристику основным разновидностям стилей (парадигм) программирования. Роль объектно-ориентированной парадигмы. Основные и дополнительные элементы объектной модели.

Парадигма – набор теорий, стандартов и методов, которые совместно представляют собой способ организации научного знания, способ видения мира.

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

Основные разновидности стилей программирования (парадигмы):

− процедурно-ориентированный (базируется на алгоритмах);

− объектно-ориентированный (классы и объекты);

− логико-ориентированный (основан на целях и исчислении предикатов);

− ориентированный на правила (правила типа "если-то");

− ориентированный на ограничения (инвариантные соотношения).

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

Объектная модель – это концептуальная основа объектно-ориентированного программирования. Изучение основных элементов объектной модели и их взаимодействия позволяет лучше разобраться в принципах организации объектно-ориентированных программ, а также понять, в чем сходства и различия поддержки объектно-ориентированной парадигмы различными языками.

Главные элементы объектной модели:

− абстрагирование (abstraction)

− инкапсуляция (encapsulation)

− иерархия (hierarchy)

− модульность (modularity)

Абстрагирование позволяет выделить существенные характеристики некоторого объекта, отличающие его от всех других видов объектов. Абстракция четко определяет концептуальные границы объекта с точки зрения наблюдателя.

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

Иерархия — это упорядочение абстракций, средство классификации объектов, систематизация связей между объектами.

Модульность — это представление системы в виде совокупности обособленных сегментов, связь между которыми обеспечивается посредством связей между классами, определяемыми в этих сегментах.

 

3. Ссылки в языке С++, использование ссылок. Отличие ссылок от указателей. Передача аргументов функций по ссылке. Перегрузка функций; правила перегрузки.

 

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

В отличие от указателей к ссылкам не применяется операция разыменования (*) и при инициализации ссылки используется не адрес переменной (&x), а сама переменная. Можно считать, что ссылка – это альтернативное (т.е. второе) имя существующей переменной.

Основное назначение ссылок – использование их в качестве параметров (аргументов) функций. В результате этого реализуется механизм передачи параметров «по имени», а не «по значению».

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

Перегрузка реализует один из видов функционального полиморфизма – статический полиморфизм, при котором реализация функции выбирается в зависимости от фактических типов параметров функции. Такой выбор происходит на этапе компиляции программы (т.н. «раннее связывание»).

Ещё бывает динамический полиморфизм, при котором реализация функции-члена класса выбирается в зависимости от фактического типа указателя на объект, через который она вызывается. Такой выбор происходит на этапе выполнения программы (т.н. «позднее связывание»). Этот вид полиморфизма реализуется виртуальными функциями.

Правила перегрузки

− Функции должны отличаться количеством или хотя бы типом аргументов, т.е. иметь различные сигнатуры.

− Не влияет на перегрузку тип возвращаемого значения.

− Использование параметров по умолчанию может отрицательно повлиять на перегрузку.

 

4. Общее понятие класса языка С++. Классы как абстрактные типы данных. Синтаксис описания класса. Виды членов класса. Управление доступом к членам класса. Инкапсуляция. Интерфейс и реализация класса. Объекты (экземпляры) класса и способы их создания.

В ООП имеется два основных вида абстракций:

Тип данных объектной природы (класс) — определяемое программистом расширение исходных типов языка.

Экземпляр класса (объект) — переменная класса. Объектов в сложной системе обычно гораздо больше, чем классов. Объект обладает состоянием, поведением и идентичностью.

Состояние объекта характеризуется набором его свойств (атрибутов) и текущими значениями каждого из этих свойств.

Состояние объекта — результат его поведения, т. е. выполнения в определенной последовательности характерных для него действий.

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

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

Тип является конкретным представлением некоторой концепции, а новые типы создаются для воплощения концепций, которые не выражаются непосредственно (или адекватно) встроенными типами.

Что может размещаться внутри объявления класса

 

В C++ управление доступом и видимостью реализовано достаточно гибко. Члены класса могут быть объявлены:

открытыми для всех внешних объектов (public),

полностью закрытыми для доступа извне (private) и

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

Кроме того, в C++ существует понятие дружественных классов и функций (friend). Дружественным функциям и классам могут быть доступны и закрытые данные.

Основные цели разграничения доступа к членам класса:

− обеспечение связывания функций-членов класса с переменными-членами класса таким образом, чтобы только эти функции непосредственно зависели от представления класса и имели непосредственный доступ к объектам класса;

− обеспечение инкапсуляции, т. е. отделения внешнего интерфейса класса от его реализации.

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

К членам класса, объявленным со спецификатором public (к открытым членам класса), разрешен доступ не только функциям-членам класса, но и обращение из-за пределов объявления класса. Поэтому такие члены класса образуют открытый интерфейс класса.

Многие ОО-языки (в т.ч. и С++) поддерживают еще один вид доступа — защищенный (protected), позволяющий определить члены класса, к которым возможен доступ из производных классов. При этом защищенные члены класса закрыты для всех объектов.

 

Абстрагирование отвечает за внешнее поведение объекта ("интерфейс") — так ведут себя все объекты данного класса. Абстрагирование направлено на наблюдаемое поведение объекта, а не на его внутреннюю реализацию.

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

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

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

 

 

Конструкторы и деструкторы класса. Виды конструкторов класса: конструктор по умолчанию, копирующий конструктор, конструкторы преобразования типа, прочие конструкторы. Правила вызова конструкторов различных видов. Вызов деструктора.

 

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

Так же как и любые другие функции языка C++, конструктор можно перегружать. Поэтому класс может иметь несколько конструкторов с различными списками параметров. Это позволяет иметь несколько вариантов инициализации объекта.

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

По определению, конструктор, имеющий один аргумент, задает неявное преобразование типа, т. е. определяет правило преобразования типа аргумента конструктора в тип объекта. Если неявное преобразование типа, задаваемое конструктором, нежелательно, то его можно запретить, объявив соответствующий конструктор со спецификатором explicit.

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

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

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

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

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

 

6. Перегрузка операций для классов. Назначение и способы перегрузки. Принципы и правила перегрузки операций. Пример перегрузки операции «=». Рекомендации по перегрузке операций; правильные форматы перегруженных операций.

«Поведение» объектов новых (пользовательских) типов данных должно быть «ожидаемым», похожим на поведение объектов встроенных типов. Например, если для объекта имеет смысл операция «сложить», то для выполнения такой операции должен использоваться привычный знак «+». Эту ситуацию можно охарактеризовать как совместимость с соглашениями для встроенных типов.

Перегружать можно большинство операций C++, включая унарные операции, операции new, delete, (), [], ->, ->*, а также операцию "запятая". Нельзя перегружать следующие операции:

− операцию выбора члена класса или элемента структуры (точка);

− условную (тернарную) операцию;

− операцию sizeof;

− операцию разрешения области видимости (двойное двоеточие).

Хотя операции при перегрузке могут приобретать новый смысл, их приоритет и порядок выполнения не зависят от типов операндов и регулируются правилами языка.

Рекомендации по перегрузке операций классов

Операция Рекомендуемая форма
Все унарные операции Функция-член класса
= () [ ] -> ->* Обязательно функция-член класса
+= -= /= *= ^= &= |= %= >>= <<= Функция-член класса
Остальные бинарные операции Внешняя функция

 

Правильный формат: C& operator=(const C&)

 

 

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

Существует четыре базовых вида отношений между объектно-ориентированными абстракциями:

− отношение обобщения (generalization) описывает отношение между общей сущностью и ее конкретным воплощением (например, один класс является специализацией другого класса)

− отношение ассоциации (association) описывает структурное отношение, показывающее, что объекты одного типа некоторым образом связаны с объектами другого типа (например, находятся в отношении типа "часть/целое")

− отношение зависимости (dependency) описывает отношение использования, при котором изменение в спецификации одного класса может повлиять на класс, его использующий (например, объекты некоторого класса передаются в качестве аргументов функциям-членам другого класса)

− отношение реализации (realization) описывает семантическое отношение, при котором класс гарантирует выполнение контракта, определяемого некоторым интерфейсом. Обычно определяется применительно к интерфейсам и классам, которые реализуют (implement) интерфейсы

Наследование – одна из основных и самая распространенная форма отношения обобщения. Наследование представляет отношение «общее/частное» («родитель/потомок» или «is a – один из, является»).

Наследование – это такое отношение между классами, при котором один класс (производный) повторяет («заимствует») структуру и поведение другого класса (базового).
При наследовании базовый класс реализует наиболее общую модель сущности, а производный класс уточняет и развивает определение базового класса.

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

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

Агрегация (aggregation) – специальная форма ассоциации, которая служит для представления отношения типа "часть-целое" между агрегатом (целое) и его составной частью. Графически отношение агрегации изображается сплошной линией, оканчивающейся не закрашенным внутри ромбом. Ромб указывает на класс-контейнер (агрегат).

Композиция (composition) – разновидность отношения агрегации, при которой составные части не могут выступать в отрыве от целого, т.е. с уничтожением целого уничтожаются и все его составные части. Целое является «владельцем» своих частей, которые ему полностью подконтрольны: агрегат создает части и он же их уничтожает.

Отношение зависимости – это такое отношение между классами, когда изменение в спецификации или реализации одного класса влияет на спецификацию или реализацию другого класса.

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

 

Отношение между классами типа «наследование». Отличия наследования от агрегации. Иерархия наследования. Синтаксис наследования. Открытое и закрытое наследование. Назначение «защищенных» (protected) членов базового класса. Виртуальные функции и их назначение. Полиморфизм. Виртуальные деструкторы и правила их использования. Чисто виртуальные функции и абстрактные классы. Наследование интерфейса и наследование реализации.

Наследование – это такое отношение между классами, при котором один класс повторяет («заимствует») структуру и поведение другого класса (одиночное наследование) или других классов (множественное наследование).

Класс, структура и поведение которого наследуются, называется базовым классом (суперклассом, родительским классом), а класс, «заимствующий» структуру и поведение базового класса – производным классом (подклассом, потомком, дочерним классом).

Подкласс может расширять, изменять или ограничивать структуру и поведение своего суперкласса.

Некоторые функции-члены базового класса не наследуются автоматически производным классом:

− конструкторы;

− деструктор;

− перегруженная операция присваивания (=).

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

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

Чем ниже класс в иерархии, тем более специализированным он является.

 

Синтаксис и виды одиночного наследования:

открытое (class D: public B { });

закрытое (class D: private B { } или class D: B { });

защищенное (class D: protected B { });

Если цепочка наследования описана следующим образом:

class B {…};

class D: public B {…};

то тем самым компилятору C++ сообщается, что каждый объект типа D является также объектом типа В, но не наоборот. При этом В представляет собой более общую концепцию, чем D, a D - более конкретную концепцию, чем В. Везде, где может быть использован объект В, можно использовать также объект D, потому что D является объектом типа В. С другой стороны, если нужен объект типа D, то объект В не подойдет, поскольку каждый D «является разновидностью» В, но не наоборот.

Другими словами: любая функция, которая принимает аргумент типа B (или указатель на B, или ссылку на B), примет объект типа D (или указатель на D, или ссылку на D). Такова интерпретация открытого наследования.

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

Варианты наследования функций-членов базового класса:

Невиртуальные функции: наследование интерфейса и реализации функции без возможности переопределения реализации в производном классе.

Виртуальные функции: наследование интерфейса и реализации функции «по умолчанию» с возможностью переопределения этой реализации (создания новой версии) в производном классе.

Чистые виртуальные функции: наследование только интерфейса функции; реализация функции «по умолчанию» отсутствует и должна быть выполнена в производном классе.

Закрытое наследование не реализует отношение «является» и позволяет скрыть интерфейс базового класса (или часть интерфейса); объекты производного класса не приводятся автоматически к объектам базового класса.

При закрытом наследовании наследуется только реализация, без интерфейса; это - отношение «реализовано посредством». Закрытое наследование похоже на агрегацию.

 

Позднее связывание и виртуальные функции.

Связывание – это сопоставление вызова функции с ее телом (реализацией). Существует два вида связывания:

− раннее – выполняется компилятором и компоновщиком до запуска программы;

− позднее (динамическое) – производится во время выполнения программы в зависимости от фактического типа объекта.

В C++ механизм позднего связывания работает только для виртуальных функций и только при использовании для вызова функции указателей на объекты базового класса, содержащего виртуальные функции (т.е. для полиморфного вызова).

Если функция объявляется виртуальной (virtual) в базовом классе, то она становится виртуальной во всех производных от него классах.

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

Механизм вызова виртуальных функций

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

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

 

Чисто виртуальные функции - это функции, в объявлении которых присутствует инициализатор 0. Класс, содержащий хотя бы одну такую функцию, называется абстрактным. Невозможно создать объект абстрактного класса.

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

Чисто виртуальные функции позволяют сформировать «костяк» иерархии, т.е. необходимый минимальный (базовый) интерфейс, определяющий общие черты всех производных классов. Часто базовые классы состоят только из чисто виртуальных функций.

Деструктор класса следует объявлять виртуальным тогда и только тогда, когда этот класс содержит хотя бы одну виртуальную функцию.

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

 

9. Концепция параметризуемых типов (шаблонов) в языке С++. Шаблоны классов. Различия между шаблонами и классами. Синтаксис описания шаблона. Создание объекта шаблонного класса (инстанцирование шаблона). Шаблоны функций. Связь между шаблонами функций и перегрузкой.

Механизм шаблонов функций и классов С++ основывается на концепции параметризуемых типов, которая возникла в середине 70-х гг. XX в. и впервые воплотилась в качестве конкретного механизма общецелевого ЯП в виде родовых пакетов и подпрограмм в языке Ада.

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

Для получения из образца конкретной структуры (типа) или конкретной функции, используется специальный языковой механизм –настройка (instantiation – инстанцирование). При настройке задается имя образца (шаблона) и фактические параметры, необходимые для настройки: конкретные типы и константы.

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

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

Внешние свойства шаблона – те же самые, что и соответствующие свойства классов:

− для шаблона класса можно задавать базовые классы (как шаблоны, так и обычные классы);

− шаблоны, так же, как и классы, могут быть вложенными или объявляться в пространствах имен;

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

Единственное отличие – все эти семантические отношения для шаблона являются потенциальными; они актуализуются только для конкретных настроек этого шаблона. Возникающий же при настройке класс полностью идентичен по своим свойствам обычным нешаблонным классам и повторяет схему семантических отношений, заданную для его шаблона-прототипа.

 

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

Синтаксис определения внешней функции-шаблона подобен синтаксису функций-членов шаблонных классов.

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

 

Понятие исключения (особой ситуации). Механизм обработки исключений. Синтаксические конструкции языка для обработки исключений. Различение особых ситуаций. Имена особых ситуаций. Группирование исключений. Повторная генерация исключений; перехват всех исключений.

Исключительными являются ситуации, которые не должны возникать во время обычной, «штатной» работы программы, но иногда проявляются («аномальные» ситуации).

До появления средств работы с исключительными ситуациями их обработка выполнялась с использованием стандартных конструкций языка, как правило, инструкций выбора if или switch и «кодов завершения», возвращаемых функциями и анализируемых вызывающими программами. Анализ и обработка исключений были «растворены» в тексте программы.

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

Исключительные ситуации C++ позволяют изменить последовательность передачи управления, когда во время выполнения программы возникает некоторое событие, например ошибка (файл не найден, неверный индекс и т. п.).

Механизм исключительных ситуаций C++ позволяет передать обработку исключительных случаев в другие части исходной программы и упростить основную обработку. За счет этого программа становится удобочитаемой.

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

Исключительные ситуации могут быть сгенерированы явно в программе инструкцией throw или неявно, операционной системой, как результат недопустимой или неверной операции. Когда C++ генерирует исключительную ситуацию, может быть создан экземпляр системного класса Exception или объект любого другого типа (встроенного, определенного программистом, производного от Exception, или независимого от него).

Исключительные ситуации отслеживаются инструкциями catch, и управление передается блоку catch, отследившему исключение (обработчику исключения), который исправляет ошибки. Точка передачи управления после обработки ошибки зависит от структуры программы. Обычно «самопроизвольный возврат» к месту возникновения исключительной ситуации не происходит. Если же такой возврат (т.е. продолжение обработки) желателен, структура программы должна быть организована специальным образом.

С обработкой исключительных ситуаций связаны три понятия:

1) генерация (throwing) исключительной ситуации, означающая прерывание потока управления и включение механизма обработки исключительных ситуаций;

2) отслеживание (catching) исключительной ситуации обработчиками исключительных ситуаций – блоками кода, «настроенными» на «перехват» определенных исключительных ситуаций;

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

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

Состояния исключений могут быть в определенном смысле «подобными» друг другу. Это же можно отнести и к данным, которые передаются обработчикам. Поэтому классы исключительных ситуаций часто включают в иерархии наследования.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-07 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: