
- •1. Абстракция и декомпозиция. Основные виды декомпозиции программ.
- •Модульная декомпозиция
- •В заголовочный файл не следует помещать элементы реализации модуля, в том числе и внутренние функции, которые необходимы для реализации, однако не существенны для клиентского когда модуля.
- •Объектная декомпозиция
- •2. Понятие класса и объекта. Переменные-члены и функции-члены. Обращение к членам класса через объект. Указатель this. Константные функции-члены.
- •3. Спецификаторы доступа. Понятие инкапсуляции. Отличие конструкций class и struct. Методы доступа.
- •4. Конструкторы классов, синтаксис, разновидности, моменты вызова конструкторов. Роль конструкторов в соблюдении инвариантов классов.
- •5. Конструкторы по умолчанию (default constructors). Тривиальные и нетривиальные сгенерированные конструкторы классов. Конструирование массивов объектов.
- •6. Списки инициализации. Синтаксис, отличие от присвоений в теле конструктора, необходимость в существовании.
- •7. Деструкторы классов, синтаксис, цель, моменты вызова деструкторов.
- •8. Моменты копирования объектов. Поведение по умолчанию. Конструктор копий и оператор копирующего присвоения.
- •9. Временные объекты. Явные и неявные конструкторы. Оптимизации rvo/nrvo. Временные объекты
- •Неявные и явные конструкторы
- •Запрещение копирования
- •Оптимизация копирования
- •10. Основные отличия между классами-значениями и классами-сущностями. Запрещение копирования объектов. Основные отличия между классами-значениями и классами-сущностями.
- •11. Перемещение объектов. Конструктор перемещения и оператор перемещающего присвоения. Понятие rvalue-ссылки. Функция std::move.
- •12. Перегрузка операторов. Оправданное и неоправданное использование. Пример перегрузки простейшего оператора. Операторы, которые нельзя перегружать.
- •13. Внутриклассовые и глобальные перегруженные операторы. Перегрузка операторов сдвига. Применение перегрузки сдвига для взаимодействия с потоками ввода/вывода.
- •14. Перегрузка операторов сравнения и арифметических операторов. Основные правила реализации и применения.
- •15. Перегрузка операторов индексной выборки, префиксного и постфиксного инкремента/декремента. Перегрузка операторов преобразования типа.
- •16. Статические переменные-члены. Цель применения. Синтаксис. Особенности компоновки.
- •17. Статические функции-члены. Синтаксис, особенности применения. Фабричный метод. Статические функции-члены
- •Фабричный метод
- •19. Физическое и логическое постоянство объектов. Модификатор mutable.
- •20. Класс std::string из стандартной библиотеки. Основная функциональность, способы применения. Особенности внутренней структуры.
- •21. Композиция объектов. Иерархии целое-часть. Структура простейшей композиции по значению в памяти. Ответственность за уничтожение объектов при композиции.
- •22. Ссылочная композиция. Разрываемая композиция. Кратность композиции. Одиночная, множественная и недетерминированная кратность.
- •23. Применение контейнера std::vector для композиции с недетерминированной кратностью. Композиция объектов-значений и объектов-сущностей.
- •24. Композиция объектов с кратностью многие-ко-многим. Основные особенности объектных отношений, способы реализации.
- •25. Наследование классов. Необходимость в отношении наследования. Структура наследования в памяти. Повышающее преобразование типа.
- •26. Критерии оценки корректности применения наследования. Примеры корректного и некорректного применения наследования.
- •27. Конструкторы и деструкторы при наследовании. Моменты и порядок вызовов конструкторов. Передача аргументов конструкторам базового класса.
- •28. Спецификатор доступа protected. Защищенные конструкторы и методы.
- •29. Понижающее преобразование типа (downcast). Опасности. Поля идентификации типов.
- •30. Виртуальные функции. Полиморфизм. Цель. Синтаксис, примеры использования.
- •31. Реализация виртуальных функций. Указатель vptr и таблица vtable. Вызов виртуальной функции. Инициализация служебных данных для работы виртуальных функций в конструкторах.
- •32. Контроль переопределения виртуальных функций. Требования к сигнатурам. Ключевые слова override и final. Ковариантность возвращаемых типов.
- •33. Чисто виртуальные функции и абстрактные классы. Вызов чисто виртуальной функции в конструкторе до завершения инициализации объекта.
- •34. Понятие интерфейса. Применение интерфейсов.
- •35. Множественное наследование конкретных классов. Синтаксис, структура в памяти, особенности применения и реализации.
- •36. Преобразование типов при множественном наследовании в верхнем и нижнем направлениях. Коррекция указателя this.
- •37. Множественное наследование классов с повторяющимся базовым. Синтаксис, структура в памяти, особенности применения и реализации.
- •38. Виртуальные базовые классы. Синтаксис, структура в памяти, особенности применения и реализации. Понятие “самого производного” класса и его роль в организации работы виртуальных базовых классов.
- •39. Механизм rtti - назначение, особенности применения. Структура std::type_info, оператор typeid для выражений и типов.
- •40. Применение оператора dynamic_cast для указателей и ссылок. Основные цели использования. Отличия от операторов static_cast, reinterpret_cast и const_cast.
- •41. Альтернативные решения, заменяющие dynamic_cast. Виртуальные функции для понижающего преобразования. Типовое решение Visitor.
- •42. Обработка исключений. Цели, синтаксис выброса и обработчиков. Выбор обработчика по типу. Передача данных исключения по значению, указателю и ссылке. Исключения языка и стандартной библиотеки.
- •44. Шаблоны функций и классов. Синтаксис определения шаблонов. Инстанцирование шаблонов. Модель включения и явное инстанцирование.
- •Шаблоны классов
- •45. Аргументы шаблонов - типы, константы, шаблонные аргументы шаблонов. Дедукция фактических аргументов шаблонов.
- •46. Понятие обобщенной концепции. Статический полиморфизм по сравнению с динамическим полиморфизмом.
- •Статический полиморфизм
- •47. Итераторы stl - основные разновидности, итераторы контейнеров, итераторы, не связанные с контейнерами.
- •48. Классификация алгоритмов стандартной библиотеки. Примеры применения наиболее часто используемых алгоритмов.
- •49. Функциональные объекты stl. Простые функциональные объекты. Стандартные функциональные объекты. Связыватели std::bind.
- •50. Понятие лямбда-выражения. Синтаксис, особенности использования. Реализация лямбда-выражений компилятором. Список захвата лямбда-выражения.
- •51. Специализация шаблонов. Полная и частичная специализация. Статический выбор вариантов на основе специализации шаблонов.
- •52. Необычный рекуррентный шаблон. Структура, варианты применения.
3. Спецификаторы доступа. Понятие инкапсуляции. Отличие конструкций class и struct. Методы доступа.
Сокрытие деталей реализации абстракции от клиентского кода, отделение интерфейса от реализации называется ИНКАПСУЛЯЦИЕЙ.
В С++ инкапсуляция деталей реализации осуществляется при помощи СПЕЦИФИКАТОРОВ ДОСТУПА public и private. Спецификаторы разделяют описание абстракции на доступные и закрытые части соответственно. Доступная публичная часть (public) разрешает обращение к переменным-членам и функциям-членам для любой части программы. Закрытая частная часть (private) может быть задействована только функциями-членами, входящими в состав структуры. Помимо защиты абстракции от разрушения, эффект от инкапсуляции состоит в четком разделении обязанностей между частями кода.
Отличие класса от структуры с функциями-членами состоит лишь в единственном пункте - спецификаторе доступа по умолчанию, т.е. уровне доступа, который получит переменная или функция-член, если никакого спецификатора доступа не указано.
Методы предоставляют интерфейс, при помощи которого осуществляется доступ к данным объекта некоторого класса, тем самым, обеспечивая инкапсуляцию данных.
есть 2 типа - простые методы и статические методы
простые методы имеют доступ к данным объекта (конкретного экземпляра данного класса),
статические методы не имеют доступа к данным объекта и для их использования не нужно создавать экземпляры (данного класса).
4. Конструкторы классов, синтаксис, разновидности, моменты вызова конструкторов. Роль конструкторов в соблюдении инвариантов классов.
С целью обеспечения гарантированного и безошибочного достижения корректного начального внутреннего состояния объектов, в классах определяют КОНСТРУКТОРЫ (constructors).
Конструктор представляет собой особую разновидность функции-члена, называемую идентично имени родительского класса и не имеющую никакого возвращаемого типа.Цель конструктора - инициализация содержимого объекта, обеспечение корректного начального состояния. При этом, средой выполнения гарантируется:
Автоматический вызов конструктора при создании объекта до его первого использования.
Однократность вызова конструктора на протяжении жизни объекта.
синтаксис: class Point
{
public:
// Объявление конструктора
Point ();
double GetX () const;
double GetY () const;
private:
double m_x, m_y;
};
// Определение конструктора
Point::Point ()
{
m_x = m_y = 0.0; }
момент вызова: Вызывать конструктор в явном виде не нужно. Компилятор разместит вызов конструктора объекта автоматически сразу после выделения памяти для хранения объекта. Точный момент вызова конструктора зависит от целевого сегмента памяти. Возможны такие сценарии:
1. Глобальный объект (выделяется в сегменте данных):
Stack g_Stack( 10 ); // Вызов констуктора произойдет до начала функции main()
// Stack::Stack( & g_Stack, 10 );
int main ()
{
// ...
}
2. Локальный автоматический объект (выделяется на стеке):
int main ()
{
Stack s( 10 ); // Компилятор вызовет конструктор в этой точке:
// Stack::Stack( & s, 10 );
// ...
}
3. Локальный статический объект (выделяется в сегменте данных):
void f ()
{
static Stack s( 10 ); // Компилятор вызовет конструктор в этой точке:
// Stack::Stack( & s, 10 );
// но лишь при первом вызове функции f()!
// ...
}
int main ()
{
f();
f(); }
4. Объект в динамической памяти:
int main ()
{
Stack * pStack = new Stack( 10 ); // Компилятор вызовет конструктор сразу после выделения памяти:
// Stack * pStack = ( Stack * ) ::operator new( sizeof( Stack) )
// Stack::Stack( pStack, 10 );
// ...
delete pStack; // Не забываем освободить блоки, выделенные в динамической памяти
}
виды конструкторов: -Конструктор с аргументами;
-Конструктор без аргументов:
Конструктор, не принимающий ни одного явного аргумента, называется КОНСТРУКТОРОМ ПО УМОЛЧАНИЮ
Если класс не содержит ни одного определенного пользователем конструктора, компилятор, в случае необходимости, сгенерирует конструктор по умолчанию автоматически. Следует различать случай ТРИВИАЛЬНОГО(конструктор не предполагает выполнения каких-либо инициализирующих действий вообще.) и НЕТРИВИАЛЬНОГО(Смысл НЕТРИВИАЛЬНЫХ сгенерированных автоматически конструкторов состоит в обеспечении правил языка для случаев, когда в конструкторе должны неявно происходить дополнительные действия.) автоматически сгенерированного конструктора по умолчанию.
Роль:
Неявные условия, которые всегда должны соблюдаться для полей класса, чтобы объект можно было считать корректным с точки зрения природы описываемого понятия, называются ИНВАРИАНТАМИ класса. Одной из важнейших обязанностей конструктора является обеспечение соблюдения инвариантов после инициализации объекта. Если в момент инициализации объекта конструктор убедится, что инвариантные условия в только что созданном объекте соблюдаются, в дальнейшем другие методы могут не беспокоиться о их соблюдении. Проверенный в конструкторе инвариант будет выполняться всегда, если никакой из методов не будет оставлять объект в несогласованном состоянии по своему завершению. Таким образом, проверив инвариантные условия при создании объекта и обеспечив их сохранность при любой модификации состояния объекта через его методы, можно получить стабильную абстракцию, всегда готовую корректно выполнять свои обязанности.