Перейти к основному содержимому

Экзамен

Билет

Основные вопросы

Билет состоит из двух вопросов, которые рассматриваются в рамках лекционных занятий модулей 1 и 2.

Задача

Задача на программирование по теме пройденного курса. Решение данной задачи необходимо представить на листе бумаги. Данная задача предназначена для определения уровня понимания объектно-ориентированного программирования на C++.

Дополнительные вопросы

Иллюстрирующие примеры

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

Цель примеров: проиллюстрировать механизмы и концепции, которые рассматриваются при ответе на вопрос билета, с помощью языка С++.

Примеры при необходимости можно записать на экзаменационном листе при подготовке ответа на вопрос. Также пример может быть запрошен в качестве дополнительного вопроса экзаменатором.

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

В основе оценки примера в приоритете учитывается ход рассуждения экзаменуемого.

Вопросы

  1. Что представляет собой процесс компиляции программ на C++? Какие роли у препроцессора, компилятора и компоновщика в подготовке исполняемого файла? Как директивы и макросы препроцессора участвуют в подготовке исполняемого файла? Как реализовать условную компиляцию? Что делает препроцессор с заголовочными файлами C++?
  2. Какие различия существуют между процедурной и объектно-ориентированной декомпозициями в разработке программного обеспечения? Как сцепление (cohesion) и связанность (coupling) влияют на декомпозицию программных систем? Как объектно-ориентированная декомпозиция позволяет бороться со сложностью процессов проектирования и сопровождения программных систем?
  3. Какие определения термина "парадигма" можно дать с точки зрения программирования? Какие классификации парадигм рассматривают в программировании? Какое влияние оказывает парадигма на язык программирования и на процессы проектирования и программирования? В чем различия между императивной и декларативной парадигмой? Как выполняются императивные и декларативные программы?
  4. Какие критерии качества декомпозиции программного проекта можно выделить? К чему необходимо стремиться при разработке программного обеспечения с точки зрения критериев качества? Как достижение или игнорирование того или иного критерия качества влияет на программный код? Какие существуют причины, блокирующие удовлетворение того или иного критерия качества? Почему с помощью процедурной декомпозиции сложно достичь того или иного критерия качества?
  5. Чем отличается объектно-ориентированное проектирование от объектно-ориентированного программирования? Какие существуют классификации принципов объектно-ориентированного программирования? Как абстрагирование, инкапсуляция, модульность и иерархия влияют на объектно-ориентированное программирование? Как инкапсуляция и иерархия влияет на описание объектов?
  6. Какие различия существуют между классом и прототипом в рамках объектно-ориентированного подхода (ООП)? Чем является объект ООП по отношению к классу и прототипу? Как связаны между собой абстрагирование объектно-ориентированной модели и классы? Что представляет собой тип в С++? Какие виды типов существуют в C++? Как связаны между собой переменная C++ и объект ООП?
  7. Как скалярные и составные типы представлены в языке C++? Что из себя представляют структуры и объедения в языке C++ и как их различают? Как связаны объекты ООП с составными типами? Как связаны между собой переменная C++ и объект ООП? Какая разница между объявлением и определением класса? Какие общепринятые практики существуют для описания объявления и определения класса на языке C++?
  8. Как инкапсуляция объектно-ориентированного подхода (ООП) реализуется на языке C++? Как абстрагирование ООП связано с инкапсуляцией? Что такое интерфейс с точки зрения ООП и как он связан с инкапсуляцией? Какие причины могут быть для использования инкапсуляции при разработке программ? Имеются ли общепринятые практики в языке C++ для преодоления ограничений, которые накладываются инкапсуляцией? Если такие практики существуют, то какие цели они преследуют?
  9. Что представляет собой экземпляр класса? Какие способы существуют для создания экземпляра класса с точки зрения организации памяти? Какие преимущества и недостатки существуют у того или иного способа создания экземпляра класса? Что такое специальные члены класса и как они связаны с жизненным циклом экземпляра класса? В чем разница между присваиванием и инициализацией? Как можно инициализировать переменные? Что такое списки инициализации?
  10. Что представляет собой конструктор в языке C++? Какие конструкторы бывают в С++? Продемонстрируйте разницу между конструкторами с помощью синтаксиса C++. Какие проблемы существуют с неявным преобразованием типов в С++ и для чего используется ключевое слово explicit? Что такое конструкторы преобразования и функции преобразования? Продемонстрируйте разницу между конструкторами преобразования и функциями преобразования с помощью синтаксиса C++. Для чего нужен деструктор в C++?
  11. Что представляет собой перегрузка операторов (operator overloading) и чем она отличается от перегрузки функций (function overloading) с точки зрения языка C++? Какие способы существуют для осуществления перегрузок операторов? Приведите примеры операторов, которые: можно перегрузить, можно перегрузить несколькими способами, можно перегрузить только одним способом и нельзя перегрузить ни одним из способов. Продемонстрируйте пример перегрузки бинарной операции несколькими способами с помощью синтаксиса C++.
  12. Для каких целей используют перегрузку операторов (operator overloading) в языке C++? Какие формы использования перегруженных операторов существуют? Оказывает ли влияние инкапсуляция на перегрузку операторов? Если да, то можно ли избежать это влияние? Что осуществляет перегрузка оператора присваивания? Какие общепринятые практики существуют при реализации перегрузки оператора присваивания и почему этим практикам важно следовать? Какая связь имеется между потоками ввода-вывода и перегрузками операторов?
  13. Какие формы операторов выделения и освобождения памяти в языке C++ существуют? Зачем нужна перегрузка данных операторов? Каким правилам необходимо следовать при перегрузке данных операторов? Как работают перегрузки выделения и освобождения памяти в той или иной форме? Какие особенности работы оператора освобождения памяти необходимо учитывать при реализации перегрузки?
  14. В чем различия между отношениями ассоциация, композиция и агрегация классов с точки зрения объектно-ориентированного подхода (ООП)? Продемонстрируйте разницу между ними с помощью синтаксиса C++. Что представляет собой наследование с точки зрения ООП? Связано ли наследование с ассоциацией, композицией или агрегацией? Как при наследовании регулируется доступ элементов производного класса (ПК) к элементам базового класса (БК)? Что нельзя наследовать ПК из БК? Какие особенности работы конструкторов и деструкторов БК и ПК необходимо учитывать при наследовании?
  15. В чем различия между статическим (ранним) связыванием и динамическим (поздним) связыванием? В каком виде связывания используются виртуальные функции? Какие ограничения существуют при определении виртуальных функций и какие ошибки можно допустить при их определении? Позволяет ли язык C++ избежать данные ошибки? Опишите общий принцип выполнения виртуальных функций. Для чего используют ключевое слово final в C++?
  16. Зачем нужны абстрактные классы в языке C++? Как виртуальные функции связаны с абстрактными классами? Какие ограничения по использованию существуют у абстрактных классов в сравнении с обычными классами? Что подразумевается под интерфейсом в языке C++? Что такое виртуальный деструктор и в каких случаях его необходимо использовать? С помощью синтаксиса C++ продемонстрируйте проблему, которую решает виртуальный деструктор. Существует ли виртуальный конструктор в C++? Если да, то проиллюстрируйте его, используя синтаксис C++.
  17. Какое влияние оказывают на процесс разработки следующие принципы: KISS, DRY, YAGNI, BDUF, APO и бритва Оккама? Что представляет собой шаблон функций в языке C++? Каким принципам разработки следует шаблон функций? С помощью синтаксиса C++ продемонстрируйте использование шаблонов функций и последствия игнорирования их с точки зрения принципов разработки. Как компилятор обрабатывает шаблонные функции? В чем разница между шаблоном функции и шаблонной функцией?
  18. Зачем в языке C++ существует специализация шаблона? С помощью синтаксиса C++ продемонстрируйте специализацию шаблона функции и класса. В чем разница между полной специализацией и частичной специализацией шаблона? Какие общепринятые практики существуют для описания объявления и определения шаблона на C++? Какие типовые ошибки можно выделить при описании шаблона на C++? Что представляют собой параметры шаблонов классов? Какие типы параметров шаблона существуют? Как на языке C++ сочетать наследование и шаблон класса?
  19. Что представляет собой полиморфизм с точки зрения объектно-ориентированного подхода (ООП)? Как полиморфизм связан с перегрузкой, шаблоном класса и наследованием? С помощью синтаксиса C++ продемонстрируйте данные связи. Имеется ли связь между статическим (ранним) связыванием и полиморфизмом? А между динамическим (поздним) связыванием и полиморфизмом? Как абстрактный класс связан с полиморфизмом? Какие особенности существуют при использовании абстрактного класса и группирующих сущностей в рамках полиморфизма?
  20. Как множественное наследование реализуется с помощью языка C++? Какие особенности существуют в работе специальных членов классов при множественном наследовании? Какую проблему решает виртуальный базовый класс при множественном наследовании? С помощью синтаксиса C++ продемонстрируйте эту проблему и её решение. Какие механизмы существуют для разрешения неоднозначности имен при множественном наследовании? Что подразумевается под доминирующим именем в C++ и когда оно используется?
  21. Что представляет собой механизм исключений в программах на языке C++? Продемонстрируйте данный механизм с помощью синтаксиса C++. Какие способы обработки ошибок существуют, которые не используют механизм исключений? С помощью синтаксиса C++ продемонстрируйте данные способы. Как выглядят исключения стандартной библиотеки C++? Какие общепринятые правила существуют для обработки ошибок в специальных членах класса?
  22. Как в языке C++ обрабатываются исключения? Что такое свёртка стека? С помощью синтаксиса C++ продемонстрируйте свёртку стека и механизм исключения. Какие проблемы могут возникнуть при свёртке стека из-за исключения в конструкторе? Продемонстрируйте данную проблему с помощью синтаксиса C++. Что подразумевают под гарантиями безопасности исключений и какие они бывают? Для чего используют ключевое слово noexcept в C++?
  23. Как принципы единственной ответственности, открытости-закрытости и подстановки Барбары Лисков помогают получить хороший объектно-ориентированный дизайн? Проиллюстрируйте каждый принцип с помощью синтаксиса языка C++. Что влечёт нарушение того или иного принципа?
  24. Как принципы разделения интерфейса, инверсии зависимостей и Деметера помогают получить хороший объектно-ориентированный дизайн? Проиллюстрируйте каждый принцип с помощью синтаксиса языка C++. Что влечёт нарушение того или иного принципа?
  25. Что представляют собой паттерны и антипаттерны проектирования? В каких уровнях программного проекта можно столкнуться с антипаттернами? Как могут выглядеть антипаттерны разработки и какие причины могут быть для их возникновения? Что можно достичь при использовании паттернов проектирования? Какая связь между архитектурой приложения и паттернами проектирования существуют? Какие виды классических паттернов объектно-ориентированного проектирования существуют и какие задачи они решают?
  26. Что понимают под пирамидой тестирования при разработке программного обеспечения? Как каждый уровень пирамиды влияет на программный продукт? Как инкапсуляция, наследование и полиморфизм влияют на тестирование? Что требуется учитывать при тестировании объектно-ориентированных программ? Какие варианты существуют для тестирования инкапсуляции, наследования и полиморфизма? Как тестируют "белый" и "чёрный" ящик?

Рекомендации по подготовке к ответу на вопросы билета

  1. Не рекомендуется:
    1. Тратить время на переписывание вопросов билета в экзаменационный лист. Достаточно в экзаменационном листе указать номер билета и номер вопроса, к которому дается ответ.
    2. Детально расписывать ответ на билет. Если в вопросе просят продемонстрировать иллюстрирующий пример, использующий синтаксис языка C++, то его обязательно необходимо отобразить в экзаменационном листе. Задача по программированию решается на листе. Остальные записи в экзаменационном листе могут быть тезисными. В экзаменационном листе можно показать то, что нельзя описать с помощью устной речи.
  2. Рекомендуется:
    1. Решать задачу в несколько подходов: в начале и в конце подготовки к ответу на билет перед экзаменатором. Так вы сможете в процессе подготовки к ответу на остальные вопросы билета подумать о решении задачи.