- •Тема 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.
4. Роль типа исключения в его обработке. Охранный блок, блок перехвата. Использование механизма обработки исключений. Примеры использования.
см. вопр. 3
В данном примере необходимо выделить три ключевых элемента. Во-
первых, вызов функции div() заключен внутрь блока, который начинается с
ключевого слова try. Этот блок указывает, что внутри него могут
происходить исключительные ситуации. По этой причине код, заключенный
внутри блока try, иногда называют охранным.
Далее за блоком try следует блок catch, называемый обычно
обработчиком исключительной ситуации. Если возникает исключительная
ситуация, выполнение программы переходит к этому catch-блоку. Хотя в
этом примере имеется один единственный обработчик, их в программах
может быть множество, и они способны обрабатывать множество различных
типов исключительных ситуаций.
Еще одним элементом процесса обработки исключительных ситуаций
является оператор throw (в данном случае он находится внутри функции
div()). Оператор throw сигнализирует об исключительном событии и
генерирует объект исключительной ситуации, который перехватывается
обработчиком catch. Этот процесс называется вызовом исключительной
ситуации. В рассматриваемом примере исключительная ситуация имеет
форму обычного целого числа, однако программы могут генерировать
практически любой тип исключительной ситуации.
Если в инструкции if(divisor==0) throw 1 значение 1 заменить на 1., то
при выполнении будет выдана ошибка об отсутствии соответствующего
обработчика catch (так как генерируется исключительная ситуация типа
double).
Когда тип исключения в блоке catch совпадает с типом
сгенерированного исключения, выполняется связанный с ним блок
catch. По завершении выполнения кода обработчика управление
переходит к оператору, следующему непосредственно после него.
Существует также абсолютный обработчик, который совместим с
любым типом исключительной ситуации. Для написания такого
обработчика надо вместо аргументов написать многоточие (эллипсис).
catch (...) {блок обработки исключения}
Использование абсолютного обработчика исключительных ситуаций
рассмотрим на примере программы, в которой происходит генерация
исключительной ситуации типа char*, но обработчик такого типа
отсутствует. В этом случае управление передается абсолютному
обработчику.
5. Использование объектов классов в качестве исключений. Одинаковые свойства и различия операторов throw и return. Примеры использования.
Выполнение оператора throw похоже на return, так как он завершает выполнение функции, однако вместо возврата управления вызывающей программе throw заставляет программу выполняться по текущей цепочке вызовов до тех пор, пока не будет найден соответствующего типа блок catch.
Иногда возникает положение, при котором необходимо обработать
исключительную ситуацию сначала на более низком уровне
вложенности блока try, а затем передать ее на более высокий уровень для
продолжения обработки. Для того чтобы сделать это, нужно
использовать throw без аргументов.
#include<iostream>
using namespace std;
void calculate(int i) {
try { if (i) throw "Error"; }
catch (const char* s) {
cout << s << "- выполняется первый обработчик" << endl;
throw;
}
}
int main() {
try { calculate(1); }
catch (const char* s) {
cout << s << "- выполняется второй обработчик"<< endl;
}
}
Исключительная ситуация может быть обработана обработчиком,
типом которого базовым для данного типа исключительной ситуации. Это
значит, что если, например, класс В – производный от класса А, то
обработчик типа класса А может обрабатывать исключительную ситуацию
класса В.
Рассмотрим особенности выбора соответствующего обработчика на
следующем примере. Пусть имеется класс С, являющийся производным от
классов А и В; показано, какими обработчиками может быть перехвачена
исключительная ситуация типа С и типа указателя на С.
#include<iostream>
using namespace std;
class A {};
class B {};
class C : public A, public B {};
void calculate(int i) {
if (i) throw C(); // тип объект класса С
else throw new C; // тип указатель класса С
}
int main() {
int i;
while (true) {
try {
cin >> i;
calculate(i);
}
catch (A) {
cout << "Обработчик типа \"объект класс A\"" << endl; }
catch (B&) {
cout << "Обработчик типа \"ссылка класс B\"" << endl; }
catch (C) {
cout << "Обработчик типа \"объект класс C\"" << endl; }
catch (C*) {
cout <<"Обработчик типа \"указатель класса C\""<< endl;}
catch (A*) {
cout <<"Обработчик типа \"указатель класса A\""<< endl;}
catch (void*) {
cout<< "Обработчик типа \"void*\""<<endl;}
}
}
В данном примере исключительная ситуация класса С может быть
направлена любому из обработчиков A, B& или C, поэтому выбирается
обработчик, стоящий первым в списке. Аналогично для исключительной
ситуации, имеющей тип указателя на объект класса С, выбирается первый
подходящий обработчик A* или C*. Эта ситуация также может быть
обработана так же обработчиками void*. Так как к типу void* может быть
приведен любой указатель, то обработчик этого типа будет перехватывать
любые исключительные ситуации типа указателя.
6. Спецификации исключений в С++11 (throw, noexcept). Примеры использования.
Спецификации исключений были добавлены в С++98, но в С++11 они объявлены устаревшими. Это значит, что спецификация исключений включена в стандарт, однако может быть изъята в будущем, поэтому в новом коде ее использовать не стоит.
Часть throw() со списком типов исключений или без него является спецификацией исключений. Она должна присутствовать как в прототипе, так и в определении функции.
Одна из основных причин появления спецификации исключений – необходимость уведомления о том, что может понадобиться блок try. Другая причина – разрешение компилятору на добавление кода, который во время выполнения будет проверять, нарушена ли спецификация исключений.
В С++11разрешена специальная спецификация, которая представлена ключевым словом noexcept. Она указывает, что функция не генерирует исключений. Знание о том, что функция не создает исключений, помогает компилятору оптимизировать код.
double div(double divisible, double divisor) throw();
double div(double divisible, double divisor) throw(){
if (divisor == 0) throw 1;
return divisible / divisor;
}
// или
double div(double divisible, double divisor) throw(invalid_argument);
double div(double divisible, double divisor) throw(invalid_argument){
if (divisor == 0) throw invalid_argument(“Division by zero”);
return divisible / divisor;
}
// throw (int, string)
void printData() noexcept;