Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭКЗ_2020_ООП.odt
Скачиваний:
23
Добавлен:
23.06.2020
Размер:
217.5 Кб
Скачать

95. Что такое динамическое приведение типов?

dynamic_cast используется для динамического приведения типов во время выполнения. В случае неправильного приведения типов для ссылок вызывается исключительная ситуация std::bad_cast, а для указателей будет возвращен 0.

------------------------------------------------------------------------------------------------------------------------

dynamic_cast — унарная операция приведения типов данных в С++

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

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

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

96. Что такое константное приведение типов? const_cast — константное приведение типов данных

Операция const_cast доступна только в C++. Константное приведение используются, чтобы  константную переменную преобразовать в неконстантную. При этом, константным становится возвращаемое значение операции const_cast, а не сама переменная.

97. Как работает преобразование в Си-стиле на языке С++?

Если происходит попытка преобразования в стиле С, то компилятор пробует определить, возможно ли произвести выбранное преобразование. Порядок проверки можно определит в виде очереди:

  • const_cast

  • static_cast

  • static_cast + const_cast

  • reinterpret_cast

  • reinterpret_cast + const_cast

98. Что такое умные указатели?

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

• Реализуют идиому RAII

• Контролируют время жизни объекта

• Реализуют тот же интерфейс, что и «сырой» указатель

• Обеспечивают безопасность исключений

------------------------------------------------------------------------------------------------------------------------

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

Используются для борьбы с утечками памяти.

99. Опишите принцип работы boost::scoped_ptr.

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

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

100. Опишите принцип работы std::auto_ptr.

Имеет оператор присваивания и конструктор копирования, но работают они по-особенному. При их использовании исходный auto_ptr обнуляется, а новый хранит указатель на объект.

101. Опишите принцип работы std::shared_ptr.

Самый популярный и широко используемый указатель.

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

102. Опишите принцип работы std::weak_ptr.

Позволяет разрушить циклическую зависимость, которая может возникнуть при использовании std::shared_ptr.

Не позволяет работать с ресурсом напрямую, но обладает методом lock(), который генерирует std::shared_ptr.

103. В чем особенности работы умных указателей с массивами?

unique_ptr поддерживает предопределенную специализацию для массивов. Для её использования необходимо указать [] возле параметра шаблона.

104. Какие группы операторов в С++ вам известны?

Бинарные операторы

Унарные операторы

105. Что такое перегрузка операторов, для чего она используется?

Перегрузка операторов позволяет определить действия, которые будет выполнять оператор. Перегрузка подразумевает создание функции, название которой содержит слово operator и символ перегружаемого оператора. Функция оператора может быть определена как член класса, либо вне класса. Перегрузить можно только те операторы, которые уже определены в C++. Создать новые операторы нельзя.

106. Для каких типов допустима перегрузка операторов?

Перегрузка обычных операторов

Перегрузка операторов преобразования типа

Перегрузка операторов размещения '''new''' и уничтожения '''delete''' объектов в памяти.

    Перегрузка литералов operator""

107. Где может быть объявлена перегрузка оператора?

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

108. Какие особенности у перегрузки операторов инкремента и декремента?

Есть две версии операторов инкремента и декремента: версия префикс (например:

++x, --y) и версия постфикс (например: x++, y--). Версию постфикса можно реализовать через версию префикса.

109. Как ведут себя операторы с особым порядком вычисления при перегрузке?

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

110. Наследует ли производный класс перегруженные операторы?

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

111. Что такое функторы?

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

112. Что такое ключевое слово using и его связь с перегрузкой методов?

• Позволяет не переопределять каждую перегруженную функцию

базового класса

• Позволяет задать использование базового конструктора в

качестве дочернего

• Позволяет изменить спецификатор доступа функций

113. Что такое ключевое слово using и его связь с модификаторами доступа?

• Позволяет не переопределять каждую перегруженную функцию

базового класса

• Позволяет задать использование базового конструктора в

качестве дочернего

• Позволяет изменить спецификатор доступа функций

114. Как защитить объект от копирования?

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

115. Для чего предназначен механизм RTTI, как его использовать?

RTTI — механизм, который позволяет определить тип данных переменной или объекта во время выполнения программы. Для динамической идентификации типов применяются операторы dynamic_cast и typeid.

Оператор dynamic_cast пытается выполнить приведение к указанному типу с проверкой. Целевой тип операции должен быть типом указателя, ссылки или void*.

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