Последовательность действий при возникновении исключитель-




Билет №4

Объектно-ориентированный язык программирования С++ унаследовал типы

данных, операции и управляющие конструкции процедурного языка С (стандарт

С90).

Кроме реализации принципов объектно-ориентированного программиро-

вания в язык С++ по сравнению с С внесены и некоторые другие изменения, ко-

торые сделали его лучше и удобнее, чем С. Рассмотрим основные их них.

В языке C++ для работы с динамической памятью введены операции new и

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

С malloc.

Операция new используется как для выделения памяти для одного объекта

(при этом возможна инициализация выделенной памяти передаваемым значени-

ем), так и для массива однородных объектов. Операция new возвращает адрес

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

Операция delete освобождает распределенную операцией new память. Ее

синтаксис:

delete указатель_на_объект;

delete [ ] указатель_на_массив_объектов;

Первая форма используется, если операцией new размещался единичный

(скалярный) объект. Векторная форма используется, если операцией new создан

массив объектов, при удалении которого для каждого из объектов необходим

вызов деструктора (деструкторы описываются далее). Такими объектами явля-

ются объекты пользовательского типа.

В функциях, написанных на языке С++, в отличие от функций

Для языка С++ создана своя стандартная библиотека, которая отличается от

стандартной библиотеки С. Изменения затронули, например, функции вво-

да-вывода, введен раздел, посвященный шаблонам (STL – стандартная библио-

тека шаблонов, описанная ниже).

Тем не менее, стандартная библиотека С целиком включена в стандартную

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

библиотеки: без.h., при этом все используемые в библиотеке имена погружены в

стандартное пространство имен std

Стандартная библиотека С++:

1) обеспечивает поддержку свойств языка, например, управление памятью

(функции, основанные на использовании операций new и delete)

2) предоставляет информацию о типах во время выполнения программы

(RTTI)

3) обеспечивает поддержку обработки исключений (стандартные исклю-

чения)

4) предоставляет информацию о зависящих от реализации аспектах языка

(например, максимальное значение float)

5) предоставляет программисту общеупотребительные математические и

некоторые другие функции (например, sqrt(), генератор случайных

чисел и т. д.)

6) предоставляет программисту некоторые нетривиальные и машин-

но-зависимые средства, что позволяет писать переносимые программы

(например, списки, функции сортировки, потоки ввода/вывода). Центральным понятием ООП является класс. Класс используется для опи-

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

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

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

операции над объектами. class Имя_класса { определение_членов_класса };

Члены класса можно разделить на информационные члены и функции-члены

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

информации, хранящейся в объекте, который создается на основе класса. Методы

класса описывают алгоритмы обработки этой информации.

Данные, хранящиеся в информационных членах, описывают состояние

объекта, созданного на основе класса. Состояние объекта изменяется на основе

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

женные в реализации методов класса, определяют поведение объекта, то есть

реагирование объекта на поступающие внешние воздействия в виде входных

данных.Класс является областью видимости описанных в нем членов класса. Иден-

тификатор члена класса локален по отношению к данному классу. Классы могут

быть вложенными. Одноименные идентификаторы членов класса закрывают

видимость соответствующих внешних идентификаторов.

Операция '::' позволяет получить доступ к одноименным объектам,

внешним по отношению к текущей области видимости, в частности, к глобальным

функциям и переменным, следующим образом:

имя_класса:: имя_члена_класса или

:: имя - для имен глобальных функций и переменных.

Билет №10

Принцип инкапсуляции обеспечивается вводом в класс областей доступа:

private (закрытый, доступный только собственным методам)

public (открытый, доступный любым функциям)

protected (защищенный, доступный только собственным методам и

методам производных классов)

Члены класса, находящиеся в закрытой области (private), недоступны для

использования со стороны внешнего кода. Напротив, члены класса, находящиеся

в открытой секции (public), доступны для использования со стороны внешнего

кода. При описании класса каждый член класса помещается в одну из перечис-

ленных выше областей доступа следующим образом:

class Имя_класса {

private:

определение_закрытых_членов_класса

public:

определение_открытых_членов_класса

protected:

определение_защищенных_членов_класса

};

Порядок следования областей доступа и их количество в классе – произ-

вольны.

Служебное слово, определяющее первую область доступа, может отсутст-

вовать. По умолчанию эта область считается private.

В закрытую (private) область обычно помещаются информационные члены, а

в открытую (public) область – методы класса, реализующие интерфейс объектов

класса с внешней средой. Если какой-либо метод имеет вспомогательное значе-

ние для других методов класса, являясь подпрограммой для них, то его также

следует поместить в закрытую область. Это обеспечивает логическую целост-

ность информации.

После описания класса его имя можно использовать для описания объектов

этого типа.

Доступ к информационным членам и методам объекта, описанным в от-

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

операции выбора члена класса ‘.’.

Если работа с объектом выполняется с помощью указателя на объект, то

доступ к соответствующим членам класса осуществляется на основе указателя

на член класса ‘->’: Объекты класса можно определять совместно с описанием класса:

class Y {…} y1, y2;

Билет №16

Кроме адресации областей памяти, содержащих информационные объекты,

указатели могут содержать адреса членов класса. 1) ключевое слово typedef вводит новое имя для типа:

typedef int (Х::* pf)(int); - pf – тип указателя на метод

класса X с одним входным параметром типа int и типом возвращаемого

значения – int.

2) pf ff; – создание объекта ff, имеющего введенный тип p f.

3) ff = &Х::f1; – указателю ff присваивается адрес одного из методов

класса. Доступ к этому методу по данному указателю через какой-либо

объект невозможен (оператор ff = &b.f1; – неверен). Дело в том, что

-указатель на член класса представляется для нестатических членов не

абсолютным, а относительным адресом, то есть смещением относительно

базового адреса класса (указатель на статический член класса представ-

ляет собой истинный адрес).

4) k =(b.* ff)(par); – разыменование указателя на нестатический

метод класса дает доступ к коду по относительному адресу, который

применяется к базовому адресу конкретного объекта (в данном случае –

объекта b).

Примечание. В случае объявления методов статическими членами

идентификатор pf необходимо объявить обычным указа-

телем на функцию:

typedef int (* pf )( int );

Разыменование объекта такого типа представляется обычным разыменованием указа-

теля на функцию:

k = (*ff)(par);

Применение техники разыменования указателя на метод класса является

проявлением динамического полиморфизма, когда исполняемый код для одного

и того же оператора (k = (b.*ff)(par)) определяется на этапе исполнения, а

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

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

Билет №22

При создании объекта его информационные члены могут быть проинициа-

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

создается как копия другого объекта.

Для такого создания объекта используется конструктор копирования.

Инициализация может быть выполнена аналогично инициализации пере-

менных встроенных типов с использованием операции присваивания совместно с

объявлением объекта

Если класс не предусматривает создания внутренних динамических струк-

тур, например, массивов, создаваемых с использованием операции new, то в

конструкторе копирования достаточно предусмотреть поверхностное копиро-

вание, то есть почленное копирование информационных членов класса.

Конструктор копирования, осуществляющий поверхностное копирование,

можно явно не описывать, он сгенерируется автоматически

Автоматически сгенерированный конструктора

копирования в данном классе не позволит корректно создавать объекты такого

типа на основе других объектов этого же типа.

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

не только копирование информационных членов объекта, но и самих динамиче-

ских структур. При этом, естественно, информационные члены-указатели в соз-

даваемом объекте должны не механически копироваться из объек-

та-инициализатора, а указывать на вновь созданные динамические структуры

нового объекта. Замечания по работе конструктора копирования:

1) Входной параметр является внешним объектом по отношению к созда-

 

ваемому объекту. Тем не менее, имеется возможность прямого обраще-

ния к закрытым членам этого внешнего объекта. Это возможно только

потому, что входной параметр имеет тип, совпадающий с типом созда-

ваемого в результате работы конструктора копирования объекта. Если

бы на вход конструктора поступал бы объект другого типа (например, в

конструкторе преобразования класса vector входным параметром был

бы объект, созданный на основе класса matrix), то для доступа к за-

крытым членам объекта-параметра необходимо было бы применять

специальные средства. Это связано с тем, что единицей защиты явля-

ется не объект, а тип, то есть методы объекта могут обращаться к за-

крытым членам не только данного объекта, но и к закрытым членам

любого объекта данного типа.

Если объект уже создан, то операция присваивания ‘=’ осуществляет не

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

данных между существующими объектами.

Пример:

box b3(4,1,1); // создание объекта b3

box b2; // создание объекта b2

b2 = b3; // операция присваивания: копирование объекта

// b3 в существующий объект b2.

В операции присваивания, так же, как и в конструкторе копирования, по

умолчанию осуществляется поверхностное копирование. Если требуется глу-

бокое копирование, то необходимо перегрузить (описать нужный алгоритм)

операцию присваивания. Перегрузка операций рассматривается в следующих

разделах.

Автоматически могут генерироваться только конструкторы умолчания,

конструкторы копирования и деструкторы.

Если в классе явно не описано ни одного конструктора, то автоматически

генерируется конструктор умолчания с пустым телом.

Если в классе явно описан хотя бы один конструктор, например, конструктор

копирования, то конструктор умолчания не будет автоматически генерироваться,

даже, если он необходим в соответствии с постановкой задачи.

В случае отсутствия в классе явно описанного конструктора копирования он

всегда генерируется автоматически и обеспечивает поверхностное копирова-

ние.

Если в классе не описан деструктор, то всегда автоматически генериру-

ется деструктор, который не производит никаких действий.

Таким образом, даже если в классе не описаны конструкторы и деструктор,

они все равно неявно присутствуют в нем.

Билет №28

 

Статический полиморфизм реализуется с помощью перегрузки функций и

операций. Под перегрузкой функций в С++ понимается описание в одной об-

ласти видимости нескольких функций с одним и тем же именем. О перегрузке

операций в С++ говорят в том случае, если в некоторой области видимости по-

является описание функции с именем operator <обозначение_операции_С++>,

задающее еще одну интерпретацию заданной операции. Полиморфизм является фундаментальным свойством системы типов. Различают[5] статическую неполиморфную типизацию (потомки Алгола и BCPL), динамическую типизацию (потомки Lisp, Smalltalk, APL) и статическую полиморфную типизацию (потомки ML). Использование ad hoc полиморфизма наиболее характерно для неполиморфной типизации. Параметрический полиморфизм и динамическая типизация намного существеннее, чем ad hoc полиморфизм, повышают коэффициент повторного использования кода, поскольку определенная единственный раз функция реализует без дублирования заданное поведение для бесконечного множества вновь определяемых типов, удовлетворяющих требуемым в функции условиям. С другой стороны, временами возникает необходимость обеспечить различное поведение функции в зависимости от типа параметра, и тогда необходимым оказывается специальный полиморфизм.

Билет №34

Наследование – отношение между классами, при котором один класс по-

вторяет структуру и поведение другого класса (одиночное наследование) или

других (множественное наследование) классов. Класс, поведение и структура которого наследуется, называется базовым

(родительским) классом, а класс, который наследует – производным классом.Наследование является одним из трех основных механизмов ООЯП. В ре-

зультате использования механизма наследования осуществляется формирование

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

методы.

Не наследуются:

􀂃 Конструкторы

􀂃 Деструктор

􀂃 Операция присваиванияКак уже было описано, единственный способ использования конструктора

базового класса – список инициализации. При создании объекта производного типа B сначала будет вызван конст-

руктор базового типа A. При этом если конструктору базового типа нужны па-

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

будет вызван конструктор производного типа B.

Деструкторы вызываются в обратном порядке. При разрушении объекта

производного типа сначала будет вызван деструктор этого типа, а затем дест-

руктор базового типа.

Допустимо присвоение объекту базового типа объекта производного типа.

При этом объекту базового типа будет присвоена та часть объекта производного

типа, которая структурно совпадает с базовым типом.

Билет №40

В C++ введено понятие виртуальных функций (методов). Механизм вир-

туальных методов заключается в том, что, результат вызова виртуального метода

с использованием указателя или ссылки зависит не от того, на основе какого типа

создан указатель, а от типа объекта, на который указывает этот указатель.

Тип данных (класс), содержащий хотя бы одну виртуальную функцию, на-

зывается полиморфным типом (классом), а объект этого типа – полиморфным

объектом.

Таким образом, при вызове виртуальной функции через указатель на поли-

морфный объект осуществляется динамический выбор тела функции в зависи-

мости от текущего тела объекта, а не от типа указателя. Тело функции в таком

случае выбирается на этапе выполнения, а не компиляции. В этом и проявляется

динамический полиморфизм.

Замечание. В языке C++ виртуальные методы классов существуют наряду с

невиртуальными методами. В некоторых объектно-ориентированных языках

программирования, например, в языке Java, все методы в иерархиях классов яв-

ляются виртуальными.

Виртуальная функция объявляется описателем virtual. Во всех клас-

сах-наследниках наследуемая виртуальная функция остается таковой (виртуаль-

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

морфными типами.

Билет №46

Стандартные исключения – типы данных (классы или структуры), описы-

вающие некоторые предопределенные исключительные ситуации, в частности,

они могут составлять иерархию типов.

Стандартные исключения могут быть включены в состав компиляторов C++

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

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

< exception>, < excpt.h> и других аналогичных, которые подключаются явно

или неявно директивой препроцессора #include.

Стандартные исключения, описанные классом или структурой, содержат

внутренние информационные члены, которые могут быть проанализированы, а

также собственные конструкторы, деструкторы и необходимые методы.

Последовательность действий при возникновении исключитель-

Ной ситуации.

1) Создание временного объекта – копии исключительной ситуации.

2) Уничтожение объектов, созданных в try -блоке, с запуском для них не-

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

(свертка стека).

3) Выход из try -блока.

4) Подбор и выполнение обработчика для данного try -блока в соответствии

с типом исключительной ситуации (статическая ловушка).

5) Если необходимый обработчик для данного try -блока не найден или в

обработчике имеется инструкция throw без параметров, сигнализи-

рующая о незавершенности обработки исключительной ситуации, то

происходит выход в объемлющий try -блок с повторением пунктов 2-4

(динамическая ловушка).

6) Если исключительная ситуация осталась необработанной после выхода

из всех объемлющих try -блоков, то вызывается функция

terminate().

Билет №52

Template

Список_параметров

шаблона

значения

Тип_возвращаемого

функции

Имя

(параметры

формальные){..};

Пример:

template < class T> T sum(T array[], int size){

T res = 0;

int i;

for (i = 0; i < size; i++)

res += array[i];

return res;

}

При обращении к функции-шаблону после имени функции в угловых скобках

указываются фактические параметры шаблона - имена реальных типов или зна-

чения объектов:

функции

Имя.

_

Список_фактич

параметров шаблона

(

фактические

параметры);

Для конкретного использования приведенного выше шаблона для массивов

целых чисел размерности 10 следует написать:

int iarray[10];

int i_sum;

//...

i_sum = sum < int > (iarray, 10);

Встретив такую конструкцию, компилятор сгенерирует конкретную реали-

зацию функции sum с учётом специфицированных параметров (такая функция

называется порожденной функцией).

Так как допускается параметризовать шаблоны не только именами типов, но

и объектами, то аргумент size можно указать в виде параметра шаблона:

template < class T, int size> T sum (T array[]) { /*... */ }

Тогда вызов sum будет выглядеть соответственно:

i_sum = sum < int, 10> (iarray);

Замечание. Следует отметить, что использование шаблонов сокращает текст

программы, ноне сокращает программный код. В программе реально будет сге-

нерировано столько порожденных функций, сколько имеется вызовов функций с

разными наборами фактических параметров шаблона.

Билет №58

Каждый контейнер обеспечивает стандартный интерфейс в виде

набора операций, так что один контейнер может использоваться вместо дру-

гого, причем это не влечет существенного изменения кода

+ Дополнительная общность использования обеспечивается через

стандартные итераторы.

+ Каждый контейнер связан с распределителем памяти (аллокатором),

который можно переопределить с тем, чтобы реализовать собственный ме-

ханизм распределения памяти.

+ Для каждого контейнера можно определить дополнительные итера-

торы и интерфейсы, что позволит оптимальным образом настроить его для

решения конкретной задачи.

+ Контейнеры по определению однородны, т.е. должны содержать

элементы одного типа, но возможно создание разнородных контейнеров как

контейнеров, содержащих указатели на общий базовый класс.

+ Алгоритмы, входящие в состав STL, предназначены для работы с

содержимым контейнеров. Все алгоритмы представляют собой шаблонные

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

тейнером.

- Контейнеры не имеют фиксированного стандартного представления.

Они не являются производными от некоторого базового класса. Это же верно

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

подразумевает никакой явной или неявной проверки типов во время выпол-

нения.

- Каждый доступ к итератору приводит к вызову виртуальной функ-

ции. Эти затраты по сравнению с вызовом обычной функции могут быть

значительными.

- Предотвращение выхода за пределы контейнера по-прежнему воз-

лагается на программиста, при этом каких-то специальных средств для такого

контроля не предлагается.



Поделиться:




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

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


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