- •Тема 1: Динамическая память и интеллектуальные указатели
- •1. Особенности использования динамической памяти (распределяемая память, heap, freestore), стека. Примеры использования.
- •2. Особенности выделения и освобождения памяти для автоматических глобальных и локальных объектов, статических глобальных и локальных объектов. Примеры использования.
- •3. Операторы new и delete при работе с динамической памятью. Свойства указателей, передаваемых оператору delete. Примеры использования.
- •4. Утечка памяти (memory leak). Потерянный указатель (dangling pointer, wild pointer). Примеры использования.
- •5. Проблемы, связанных с использованием операторов new и delete при управлении динамической памятью. Примеры использования.
- •6. Динамически создаваемые объекты (dynamically allocated objects). Интеллектуальные указатели (smart pointers): преимущества, недостатки, особенности использования, различия. Примеры использования.
- •8. Класс интеллектуального указателя shared_ptr. Методы класса указателя shared_ptr. Особенности и примеры использования.
- •9. Копирование и присваивание указателей shared_ptr. Примеры использования.
- •10. Создание и использование объектов интеллектуальных указателей. Примеры.
- •11. Функция make_shared(). Использование функции make_shared() для создания и инициализации объектов интеллектуальных указателей. Примеры использования.
- •12. Счетчик ссылок (reference count), счетчик слабых ссылок (weak count), функция-удалитель (deleter), выделитель памяти (allocator). Примеры использования.
- •13. Использование ключевого слова auto. Примеры использования.
- •14. Классы, ресурсы которых имеют динамическую продолжительность существования. Случаи их использования. Совместное использование данных двумя объектами. Примеры использования.
- •15. Использование оператора new для динамического резервирования памяти и инициализации объектов. Примеры использования.
- •17. Особенности создание пользовательского класса умного указателя (smart pointer). Перечень необходимых условий для реализации пользовательского класса умного указателя. Пример использования.
- •18. Особенности копирования, присваивания и удаления объектов при создании пользовательского класса умного указателя (smart pointer). Пример использования.
- •19. Размещающий оператор new (placement new). Передача ему объекта nothrow. Пример использования.
- •20. Особенности исчерпания памяти. Исключения, возникающие при исчерпании памяти. Пример использования.
- •21. Время жизни динамически создаваемых объектов. Примеры использования.
- •22. Присваивание указателю значения nullptr. Примеры использования.
- •23. Использование указателя shared_ptr совместно с оператором new. Примеры использования.
- •24. Особенности совместного использования обычных указателей и интеллектуальных. Примеры использования.
- •30. Передача в функцию и возврат из функции указателя типа unique_ptr. Примеры использования.
- •31. Использование класса auto_ptr. Особенности и пример использования.
- •32. Передача функции удаления указателю unique_ptr. Примеры использования.
- •33. Класс интеллектуального указателя weak_ptr. Методы класса указателя weak_ptr. Особенности и пример использования.
- •34. Динамические массивы. Особенности работы с динамическими массивами. Особенности резервирования памяти для массивов. Динамическое резервирование пустого массива. Примеры использования
- •35. Оператор new и динамические массивы. Класс bad_array_new_length. Примеры использования.
- •36. Инициализация массива динамически созданных объектов встроенных и пользовательских типов. Примеры использования.
- •37. Особенности освобождение памяти, выделенной для динамических массивов. Примеры использования.
- •38. Взаимодействие интеллектуальных указателей (класс unique_ptr) и динамических массивов. Примеры использования.
- •39. Класс Allocator и специальные алгоритмы. Примеры использования.
- •40. Алгоритмы копирования и заполнения неинициализированной памяти. Примеры использования
- •1. Особенности обработки исключительных ситуаций с использованием функции abort() и exit(). Преимущества и недостатки. Примеры использования.
- •2. Особенности обработки исключительных ситуаций с помощью возврата кода ошибки. Преимущества и недостатки. Примеры использования.
- •4. Роль типа исключения в его обработке. Охранный блок, блок перехвата. Использование механизма обработки исключений. Примеры использования.
- •5. Использование объектов классов в качестве исключений. Одинаковые свойства и различия операторов throw и return. Примеры использования.
- •7. Алгоритм раскручивания стека. Раскручивание стека при нормальном и аварийном завершении программы. Пример использования.
- •8. Понятие абсолютного обработчика, его синтаксис, особенности использования. Пример использования.
- •9. Класс exception. Методы класса exception. Использование наследования класса exception. Пример использования.
- •11. Исключение bad_alloc и операция new. Примеры использования. Использование нулевого указателя и операции new. Примеры использования.
- •12. Использование исключений вместе с классами и наследованием. Особенности использования вложенных классов.
- •13. Потеря исключений. Неперехваченное исключение. Использование функций terminate() и set_terminate().
- •14. Непредвиденное исключение. Использование функций unexpected() и set_unexpected(). Исключение типа std::bad_exception.
- •15. Предостережения относительно использования исключений. Использование и управление исключениями в современных языках программирования.
- •4. Изменение основания системы счисления, используемого для отображения данных. Набор констант типа fmtflags (константы форматирования), решаемые ими задачи.
- •7. Istream как псевдоним шаблона класса basic_istream. Взаимосвязь основных классов ввода/вывода. Ввод данных с помощью объекта cin
- •Istream и ostream как специализации для специализаций char. Wistream и wostream как специализации для типа wchar_t.
- •10. Класс basic_iostream. Iostream как псевдоним шаблона класса basic_iostream. Взаимосвязь основных классов ввода/вывода
- •12. Объекты wcout, wcin, wclog, wcerr, cout, cin, clog, cerr. Особенности их создания и использования.
- •14. Заголовочный файл iomanip. Функции setprecision(), setfill(), setw(). Использование манипуляторов из файла iomanip.
- •Тема 4: Файловый ввод-вывод
- •Понятие файла. Бинарные и текстовые файлы. Преимущества, недостатки, особенности использования.
- •Аргументы командной строки (argc, argv). Обработка данных командной строки. Примеры их использования.
- •Проверка состояния файлового потока. Метод is_open(). Особенности открытия нескольких файлов. Пример их использования.
- •Константы типа seekdir: ios_base::beg, ios_base::cur, ios_base::end. Примеры их использования.
- •Особенности работы с временными файлами. Функция tmpnam_s(). Пример её использования.
- •Класс string. Внутреннее форматирование с использованием классов ostringstream, istringstream. Примеры их использования.
- •Тема 5: Стандартная библиотека шаблонов stl.
- •1. Базовые принципы библиотеки шаблонов stl. Использование библиотеки stl. Заголовочные файлы complex, random.
- •4. Иерархия и концепция итераторов. Необходимость использования каждого типа итераторов. Указатель как итератор. Применение алгоритмов stl к контейнерам, не относящимся к библиотеке stl.
- •5. Входные, выходные, однонаправленные, двунаправленные итераторы, итераторы произвольного доступа: понятие, требования, особенности использования, направленность.
- •6. Шаблонный класс vector, deque, stack. Особенности, методы, принципы работы, возможности
- •7. Шаблонный класс array, valarray. Особенности, методы, принципы работы, возможности
- •8. Шаблонный класс list, forward_list. Особенности, методы, принципы работы, возможности
- •9. Шаблонный класс queue, priority_queue. Особенности, методы, принципы работы, возможности
- •10. Шаблонные классы set и multiset. Особенности, методы, принципы работы, возможности
- •11. Шаблонные классы map и multimap. Особенности, методы, принципы работы, возможности
- •12. Понятие функциональных объектов (функторов). Концепции функторов: генератор, унарная функция, бинарная функция, предикат, бинарный предикат. Предопределенные функторы
- •14. Группы алгоритмов. Алгоритмы «по месту», копирующие алгоритмы. Сравнение функций stl и методов контейнеров stl
- •15. Математические операции и их эквиваленты-функторы. Понятие полного упорядочения и квазиупорядочения
- •17. Понятие обобщенного программирования. Связь обобщенного программирования и библиотеки stl.
- •18. Использование алгоритма copy(), классов ostream_iterator и istream_iterator в качестве моделей входных и входных итераторов
- •19. Итераторы специального назначения: reverse_iterator, back_insert_iterator, front_insert_iterator, insert_iterator
- •Тема 6: Обзор Java. Введение в ооп в Java.
- •2. Обзор и отличительные особенности языка Java. Программная платформа и виртуальная машина Java. Особенности разработки и исполнения объектно-ориентированных приложений на Java.
- •3. Сборка мусора в Java. Пакет jdk: особенности, содержимое, необходимость использования, версии. Ide для работы на Java.
- •4. Особенности настройки работы платформы Java и запуск приложения на языке Java без ide.
- •5. Особенности лексики Java: литералы, идентификаторы, разделители, комментарии, ключевые слова.
- •6. Примитивные типы данных Java. Типизация. Целые числа (byte, short, int, long), числа с плавающей точкой (float, double), символы.
- •7. Переменные. Объявление переменной. Преобразование и приведение типов. Автоматическое приведение и продвижение типов в выражениях. Логические выражения. Область и срок действия переменной.
- •8. Операции (арифметические, поразрядные, отношения, логические (укороченные, обычные)). Операция присваивания. Предшествование операций.
- •9. Управляющие операторы (выбора, цикла, перехода). Разновидность цикла for в стиле for each. Комментарии в Java. Оператор instanceof.
- •Принципы объектно-ориентированного программирования в Java.
1. Особенности обработки исключительных ситуаций с использованием функции abort() и exit(). Преимущества и недостатки. Примеры использования.
Когда приложение открывает недоступный файл, получает значение, которое недоступно, запрашивает больше памяти, чем доступно в данный момент, возникает исключительная ситуация.
Один из способов выхода из исключительной ситуации – вызов функции abort(). В основной реализации функции abort() в стандартный поток ошибок (cerr) отправляется сообщение “ abnormal program termination”. Кроме того в ОС или родительскому процессу возвращается значение, обозначающее аварийной завершение. Функция abort() может выводить содержимое файловых буферов (области памяти, использующейся для хранения данных при работе с файлами).
Функция abort() вызывает немедленное прекращение программы. Очистка буферов файлов не производится.
double div(double divisible, double divisor) {
if (divisor == 0) abort();
return divisible / divisor;
}
Для аварийного завершения можно использовать функцию exit(), которая выводит содержимое файловых буферов.
Функция exit() вызывает немедленное нормальное завершение программы. Значение параметра status задается вызывающим процессом. По соглашению, если значением параметра status является 0, то предполагается нормальное завершение программы. Ненулевое значение используется для указания ошибки, зависящей от реализации. Также можно использовать макросы EXIT_SUCCESS И EXIT_FAILURE в качестве значения параметра status. Они указывают на нормальное и ненормальное завершение программы соответственно. Вызов функции exit() осуществляет очистку буферов файлов, закрывает все открытые файлы и затем вызывает зарегистрированные с помощью функции atexit() терминальные функции.
double div(double divisible, double divisor) {
if (divisor == 0) exit(-1);
return divisible / divisor;
}
Огромный очевидный минус – прекращают программу. Гораздо лучше как-то обработать ошибку, чем просто прекратить оборвать выполнение программы.
2. Особенности обработки исключительных ситуаций с помощью возврата кода ошибки. Преимущества и недостатки. Примеры использования.
Возврат функцией кода ошибки является самым обычным и широко
применяемым методом. Однако этот метод имеет существенные недостатки.
Во-первых, нужно помнить численные значения кодов ошибок. Эту
проблему можно обойти, используя перечисляемые типы. Но в некоторых
случаях функция может возвращать широкий диапазон допустимых
(неошибочных) значений, и тогда сложно найти диапазон для возвращаемых
кодов ошибки. Это и является вторым недостатком. И, в-третьих, при
использовании такого механизма сигнализации об ошибках вся
ответственность по их обработке ложится на программиста и могут
возникнуть ситуации, когда серьезные ошибки могут остаться без внимания.
3. Особенности использования механизма исключений языка С++. Преимущества и недостатки. Понятие исключения, его создания, принципы обработки, свойства. Примеры использования.
Исключения (exception) – это возникновение непредвиденных условий,
аномалии времени выполнения, например, деление на ноль, невозможность
выделения памяти при создании нового объекта, потеря подключения к базе
данных или ввод непредвиденных данных (типов данных), которые
нарушают нормальное функционирование программы. Обычно эти условия
завершают выполнение программы с системной ошибкой. Язык С++
позволяет восстанавливать программу из этих условий и продолжать ее
выполнение. В то же время исключение – это более общее, чем ошибка,
понятие и может возникать и тогда, когда в программе нет ошибок.
Исключение с точки зрения разработки программного обеспечения –
это объект системного или пользовательского класса, создаваемого
операционной системой или кодом программы в ответ на обстоятельства,
либо не допускающие дальнейшего нормального выполнения программы,
либо определенные пользователем. Обработка исключений в приложении
позволяет корректно выйти из затруднительной ситуации.
Обработка исключений обычно используется в случае, когда какая-то
часть программы обнаруживает проблему, с которой она не может
справиться, причем проблема такова, что обнаружившая ее часть программы
не может продолжить выполнение. В таких случаях обнаруживший проблему
участок программы нуждается в способе сообщить о случившемся и о том,
что он неспособен продолжить выполнение. Способ сообщения о проблеме
не подразумевает знания о том, какая именно часть программы будет
справляться с создавшейся ситуацией. Сообщив о случившемся,
обнаружившая проблему часть кода прекращает работу.
Каждой части программы, способной передать исключение,
соответствует другая часть, код которой способен обработать исключение,
независимо от того, что произошло. Например, если проблема в
недопустимом вводе, то часть кода обработки могла бы попросить
пользователя ввести правильные данные. Если потеряна связь с базой
данных, то часть кода обработки могла бы предупредить об этом
пользователя. Исключения обеспечивают взаимодействие частей программы,
обнаруживающих проблему и решающих ее.
Обработка исключительных ситуаций лишена недостатков
вышеназванных методов реагирования на ошибки. Этот механизм
позволяет использовать для представления информации об ошибке
объект любого типа. Поэтому можно, например, создать иерархию классов,
которая будет предназначена для обработки различных типов аварийных
событий. Это упростит, структурирует и сделает программу более понятной.
Обработка исключений в языке C++ подразумевает следующее.
Оператор throw используется частью кода, обнаружившего проблему, с
которой он не может справиться. Об операторе throw говорят, что он
передает, генерирует (raise) исключение. Блок try начинается с ключевого
слова try и завершается одной или несколькими директивами catch (catch
clause). Исключения, переданные из кода, расположенного в блоке try, как
правило, обрабатываются в одном из блоков catch. Поскольку разделы catch
обрабатывают исключение, их называют также обработчиками исключений
(exception handler). Набор определенных в библиотеке классов исключений
(exception class) используется для передачи информации о произошедшем
событии между операторами throw и соответствующими разделами catch.
#include<iostream>
using namespace std;
double div(double divisible, double divisor) {
if (divisor == 0) throw 1;
return divisible / divisor;
}
int main() {
double quotient;
try {
quotient = div(77., 0.);
cout << "Quotient is " << quotient << endl;
}
catch (int) { cout << "Division by zero" << endl; }
return 0;
}