# Контрольные вопросы к лабораторным работам ## 1-3, Конструкторы и операторы класса ### Создание объектов 1. Как отличается инициализация объектов пользовательского типа от объектов встроенных типов а языке С++? 2. В чем разница между объектами l-value и r-value ссылочных типов, а также константными ссылками? 3. В чем принципиальная разница между копированием и перемещением? В каких случаях вызывается конструктор перемещения? 4. Что такое конструктор? С какой целью их объявляют в классе? 5. Какие 3 конструктора являются особенными и генерируются компилятором во всех классах по-умолчанию? 6. Как конструкторы используются в программе? 7. Что такое деструктор? С какой целью его объявляют в классе? 8. Как деструктор используется в программе? 9. В чем особенность определения функции swap для пользовательского класса? 10. В чем особенность сравнения двух объектов заданного типа? Какие данные типа сравниваются, а какие игнорируются? Почему? ### Перегрузка операторов 11. В чем заключается суть перегрузки функций или методов? 12. Почему перегрузку иногда называют "мнимым" полиморфизмом? 13. С какой целью перегружают операторы для своего класса? 14. Какие 2 оператора являются особенными и генерируются компилятором во всех классах по-умолчанию? 15. В чем принципиальная разница между конструктором копирования и оператором копирования? 16. Как работают операторы сравнения (например, == и <)? 17. Как перегрузка функций связана с полиморфизмом? 18. Почему некоторые бинарные операторы нужно объявлять как "дружественные"? 19. Почему операторы ввода (<<) и вывода (>>) не могут быть членами класса? 20. Почему полезно определять две версии оператора доступа ([])? ## 4-6, Обобщенное программирование 21. В чем суть обобщенных функций? Как это влияет на написание алгоритмов? ### Шаблоны 22. С какой целью определяют шаблонные параметры для функции? 23. Как ключевое слово auto работает в комбинации с шаблонами? 24. Какие требования накладываются на тип аргумента(ов) при вызове шаблонной функции в зависимости от тела функции? 25. С какой целью определяют шаблонные параметры для класса? ### Наследование 26. Как работает наследование в С++? Как оно влияет на размер объекта производного класса относительно родительского класса? 27. Для чего используется метка protected в определении класса? 28. Как наследование связано с идеей над-типов и под-типов? 29. В чем принципиальная разница между наследованием и явной композицией/агрегацией объектов? 30. Какие проблемы существуют при использовании множественного наследования? ### Динамический полиморфизм 31. С какой целью определяют базовые абстрактные классы? 32. Что нужно сделать, чтобы класс стал абстрактным? 33. Что позволяется и что не позволяется делать с абстрактными классами? 34. Зачем нужны виртуальные методы? 35. Почему необходимо переопределять (override) методы из абстрактного класса? 36. В чем особенность функций, которые используют параметр абстрактного типа? 37. Какие сложности могут возникнуть при переопределении методов из абстрактного класса? ## Вопросы "на засыпку" 38. Какая разница между динамическим и статическим полиморфизмом? 39. В чем отличие шаблонных классов от абстрактных классов для объявления интерфейсов? В чем сходство? 40. С какой целью определяют итераторы для класса? 41. Какие операции должен поддерживать итератор такого вида? 42. Как итераторы позволяют использовать стандартные функции из библиотеки алгоритмов? 43. С какой целью определяют методы begin и end для своего класса? ### Исключения 44. Какие ситуации, возникающие в программах, считаются исключительными и требуют для своей обработки использование исключений? 45. Чем механизм обработки исключений отличается от использования (assert) в аналогичных ситуациях? 46. Что происходит с объектами, объявленными в блоке try в момент возникновения исключительной ситуации (throw)? 47. Что нужно иметь ввиду при определении блока catch (например, в зависимости от видов объектов, объявленных в блоке try)? 48. В каком порядке активируются блоки catch, когда несколько таких блоков ассоциируется с одним блоком try? 49. Что нужно обязательно определять для пользовательских исключений, чтобы их можно было обрабатывать с помощью стандартного класса std::exception? ### Обработка ошибок 50. Какие способы обработки ошибок помимо исключений принято использовать в аналогичных ситуациях? 51. Что такое "неопределенное поведение" (UB)? Чем оно может быть опасно? ### Контракты 52. Как ограничения на типах (type traits) позволяют избегать неопределенного поведения? 53. Как используются шаблоны для создания именованных ограничений (concepts)? 54. Как можно явно обозначить контракт, используя эти возможности языка С++? 55. В чем отличие именованных ограничений от абстрактных классов для объявления интерфейсов? В чем сходство?