
- •Ооп Экзамен 2020
- •4. Низкоуровневый
- •2. Какие отличия между указателем и ссылкой?
- •3. Что такое rvlaue и lvalue переменные?
- •4. Что такое rvalue и lvalue ссылки?
- •5. Как связаны lvalue и rvalue ссылки и переменные?
- •6. Что такое ооп?
- •15. Что такое указатель на функцию и как он может быть использован?
- •22. Что такое выравнивание памяти в структурах и классах?
- •23. Что такое инвариант класса?
- •24. В чем отличие функций от методов?
- •37. В каких случаях используется перегрузка конструкторов?
- •38. Какую цель может преследовать создание приватного конструктора?
- •45. Каково время жизни объекта?
- •46. Зачем нужен виртуальный деструктор?
- •48. В чем различие delete и delete[]?
- •49. Что подразумевается под идиомой raii?
- •50. Перечислите основные подходы к обработке ошибок.
- •51. Для чего предназначен механизм обработки исключительных ситуаций?
- •52. Что такое исключение?
- •54. Как происходит возбуждение исключения?
- •55. Кто отвечает за обработку возникших исключительных ситуаций?
- •56. Какие 3 уровня гарантии в механизме исключений?
- •Строгая гарантия “если при выполнении операции возникает исключение, то это не должно оказать какого-либо влияния на состояние приложения ”.
- •57. Что такое раскрутка стека?
- •66. Время жизни агрегируемого объекта меньше времени жизни агрегата?
- •67. Какие классы называются дружественными, для каких целей используется это
- •75. Как осуществить вызов базовой реализации функции при её переопределении в
- •76. Как связаны виртуальные функции и полиморфизм?
- •77. Что такое переопределение функций?
- •78. Работает ли переопределение для приватных функций?
- •79. Что такое таблица виртуальных функций?
- •80. Как себя ведут виртуальные функции в конструкторе и деструкторе?
- •81. В каких случаях допустимо приведение указателей/ссылок на дочерний класс к
- •82. Что такое чистая виртуальная функция?
- •83. Какой класс называется абстрактным?
- •85. Что такое перегрузка функций?
- •86. Как ведет себя перегрузка при наследовании?
- •87. Опишите процесс выбора функции среди перегруженных.
- •88. Чем отличаются механизмы раннего и позднего связывания?
- •89. Что такое множественное наследование?
- •95. Что такое динамическое приведение типов?
- •Динамическое приведение указателя
- •96. Что такое константное приведение типов? const_cast — константное приведение типов данных
- •98. Что такое умные указатели?
- •116. Какие особенности использования dynamic_cast, его отличия от static_cast?
- •117. Что такое шаблоны классов?
- •118. Что такое шаблоны функций?
- •119. Как осуществляется вывод аргументов шаблона?
- •120. Что может быть параметром шаблона?
- •121. Что такое специализация шаблонов?
- •122. Что такое нешаблонная база?
- •123. Что такое странно рекурсивный шаблон?
- •124. Какая разница между typedef и using?
- •125. Что такое ключевое слово decltype?
- •126. Что такое принципы solid?
- •127. Что такое принцип единственной ответственности?
- •128. Что такое принцип открытости/закрытости?
- •129. Что такое принцип подстановки Барбары Лисков?
- •130. Что такое принцип разделения интерфейса?
- •131. Что такое принцип инверсии зависимостей?
- •133. Что такое шаблон проектирования?
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, которая содержит поля, позволяющие
получить информацию о типе.