
- •Тема 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.
Аргументы командной строки (argc, argv). Обработка данных командной строки. Примеры их использования.
Аргумент argc (argument count) представляет количество
аргументов в командной строке. Счетчик включает имя самой
запускаемой команды. Переменная argv (argument values) — это
указатель на указатель на char. Параметр argv можно трактовать как
массив указателей на аргументы командной строки, причем argv[0]
указывает на первый символ первой строки, содержащей имя самой
команды, argv [1] — указатель на первый символ второй строки,
содержащей первый аргумент командной строки, и т.д. То есть argv [0] — первая строка команды и т.д.
Например, предположим, что имеется следующая командная строка:
wc report1 report2 report3
В этом случае argc будет равно 4, argv[0] — wc, argv[l] — report1 и т.д.
Следующий цикл будет выводить каждый аргумент командной строки в
отдельной строке экрана:
//Пример №. Вывод на экран аргументов командной строки
#include <iostream>
using namespace std;
int main(int argc, char* argv[]){
for (int i = 0; i < argc; i++)
cout << argv[i] << endl;
return 0;
}
Класс basic_fstream, basic_ofstream, basic_ifstream. Псевдонимы ifstream, ofstream, fstream. Конструкторы классов basic_fstream, basic_ofstream, basic_ifstream (аргументы и значения по умолчанию). Метод clear(), особенность и необходимость его использования. Методы write() и read(). Примеры их использования.
ПРОСТОЙ ФАЙЛОВЫЙ ВВОД-ВЫВОД
Для выполнения файлового вывода необходимо выполнить следующие действия:
создать объект ofstream для управления выходным потоком.
ассоциировать этот объект с конкретным файлом.
использовать объект для вывода данных в файл (так же, как нужно было бы использовать объект cout).
Чтобы реализовать файловый вывод необходимо начать с подключения заголовочного файла fstream.
#include <fstream>
Его подключение в большинстве, хотя и не во всех реализациях, автоматически подключает файл iostream, поэтому явное подключение iostream не обязательно. Затем нужно объявить объект типа ofstream:
ofstream fout; //создание объекта fout типа ofstream
Именем объекта может быть любое допустимое в C++ имя, такое как fout, outFile. Затем этот объект нужно ассоциировать с конкретным файлом. Это можно сделать с помощью метода open(). Предположим, например, что требуется открыть файл jar.txt для вывода данных. Это можно было бы сделать следующим образом:
fout.open("jar.txt"); //связывание fout с файлом jar.txt
Эти два шага (создание объекта и ассоциирование файла с ним) можно совместить в одном операторе, используя другой конструктор класса ofstream:
ofstream fout("jar.txt");//создание объекта fout и его ассоциирование с файлом jar.txt
После того, как все это сделано, объект fout (или любое другое выбранное имя) можно будет использовать таким же образом, как и объект cout.
Например, если требуется поместить слова «Данные для записи» в этот файл, то это можно сделать следующим образом:
fout<<"Данные для записи";
Действительно, поскольку ostream — это базовый класс для ofstream, то можно применять все методы ostream, включая разнообразные операции вставки, а также методы форматирования и манипуляторы. Класс ofstream использует буферизованный вывод, поэтому при создании объекта типа ofstream программа выделяет пространство для выходного буфера.
Для выполнения ввода из файла необходимо выполнить следующие действия:
создать объект ifstream для управления входным потоком.
ассоциировать этот объект с конкретным файлом.
использовать объект для ввода данных из файла (так же, как нужно было бы использовать объект cin).
Шаги для чтения из файла похожи на те, которые нужно выполнить для записи в файл. Для начала нужно подключить заголовочный файл fstream. Затем необходимо объявить объект ifstream и ассоциировать его с именем файла. Для этого можно использовать два оператора или же один:
//Два оператора
ifstream fin; //создать объекта fin типа ifstream
fin.open("flair.txt");//открытие файла flair.txt для чтения
//Один оператор
ifstream fis("flair.dat");//создание объекта fis и его ассоциирование с файлом flair.txt
В классе fstream режим по умолчанию указан как ios_base::out|ios_base::trunc (открыть для чтения и усечь файл), поэтому при создании объектов данного класса режим открытия также можно не указывать явно. Битовая операция "ИЛИ" (|), служит для объединения двух битовых значений в одно, которое может быть использовано для одновременной установки обоих битов.
Обратите внимание, что флаг ios_base::trunc означает, что для приема вывода из программы существующий файл усекается, т.е. его предыдущее содержимое отбрасывается. Хотя такое поведение снижает риск переполнения дискового пространства, легко представить себе ситуации, в которых стирание содержимого файла при его открытии нежелательно. Конечно же, в C++ предусмотрены и другие варианты. Если, например, требуется сохранить содержимое файла и добавить новую информацию в его конец, то можно воспользоваться режимом ios_base::app:
ofstream fout("data", ios_base::out | ios_base::app);
Этот код использует операцию | для объединения режимов. Поэтому ios_base::out | ios_base::арр означает, что нужно включить и режим out, и режим арр.
Некоторые реализации C++ требуют вызова fin.clear() в конце программы, а другие — нет. Это зависит от того, сбрасывается ли состояние потока автоматически при ассоциировании нового файла с объектом типа ifstream. Использование fin.clear() не повредит, даже если в этом нет необходимости.
Чтобы сохранить данные в бинарной форме вместо текстовой, можно воспользоваться методом write(). Этот метод копирует указанное количество байт из памяти в файл. Он будет побайтно копировать данные любого типа без каких-либо преобразований. Например, если передать ему адрес переменной типа long и указать, что необходимо скопировать 4 байта, он буквально скопирует в файл 4 байта, составляющие значение типа long, не преобразуя его в текст. Единственной особенностью использования метода write() является то, что необходимо использовать приведение адреса к типу указателя на значение типа char. Тот же подход можно использовать для копирования всей структуры Planet.
Чтобы получить количество байт, которые должны быть записаны, следует применить операцию sizeof:
fout.write((char*)& planet, sizeof planet);
Этот оператор вынуждает программу обратиться к адресу структуры planet и скопировать 40 байт (значение выражения sizeof planet), начиная с указанного адреса, в файл, подключенный к fout.
Чтобы восстановить информацию из файла, нужно использовать соответствующий метод read() с объектом ifstream:
ifstream fin("planets.dat", ios_base::in | ios_base::binary);
fin.read((char*)& planet, sizeof planet);
Этот код копирует sizeof planet байт из файла в структуру planet. Такой же подход можно использовать с классами, у которых нет виртуальных функций. В этом случае будут сохранены только данные-элементы, но не элементы-методы. Если же класс имеет виртуальные методы, то скрытый указатель на таблицу указателей виртуальных функций также будет скопирован. Поскольку при следующем запуске программы таблица виртуальных функций может быть размещена в другом месте, то копирование старого значения указателя из файла в объекты может привести к хаосу.
Методы read() и write() дополняют друг друга. Метод read() используется для восстановления данных, которые были записаны в файл методом write().