
- •Перечень контрольных вопросов по дисциплине «Системное программирование»
- •Понятие системного программного продукта.
- •Стадии разработки программного обеспечения.
- •Технология инкрементального программирования.
- •Понятие объекта: состояние, поведение, методы. Понятие класса и идентичность объектов.
- •Принципы объектной модели
- •Проблема создания и уничтожения объектов
- •Понятие ссылки. Операции над ссылками и способы применения ссылок.
- •Статические и постоянные члены класса. Встраиваемые методы.
- •Дружественные функции.
- •Иерархические отношения между классами: композиция.
- •Иерархические отношения между классами: наследование.
- •Виртуальные методы и позднее связывание.
- •Понятие абстрактного класса.
- •Использование потокового ввода-вывода.
- •Порождаемые функции в обобщённом программировании.
- •Порождаемые классы в обобщённом программировании.
- •Использование основных контейнеров стандартной библиотеки.
- •Классы функциональных объектов: создание и применение.
- •Использование алгоритмов стандартной библиотеки операционной системы, ее назначение и функции.
- •Операционная система, ее назначение и функции
- •Утилиты операционной системы gnu/Linux
- •Понятие файла. Виртуальная файловая система gnu/Linux
- •Разграничение доступа к файлам. Доступ к устройствам
- •Организация взаимодействия пользователя с системой
- •Организация ввода-вывода системного уровня
- •Концепция процесса. Состояние процесса и диаграмма смены состояний процесса
- •Операции над процессами. Разграничение доступа процессов к ресурсам системы.
- •Планирование процессов. Политики планирования
- •Сигналы и их использование для управления процессами
- •Понятие потока выполнения. Сравнительный анализ потоков и процессов.
- •Асинхронные параллельные потоки. Проблематика разработки многопоточных приложений.
- •Задача «разделение доступа к ресурсу». Способы ее решения.
- •Задача «синхронизация по готовности данных». Способы ее решения.
- •Системные средства синхронизации потоков.
- •1.Решение задачи «разделение доступа к ресурсу».
- •2.Способы обеспечения атомарности операций
- •3.Обеспечение взаимоисключения потоков через мьютексы.
- •4.Решение задачи «синхронизация по готовности данных»
- •Мониторы Хоара. Пример проектирования монитора «склад» для задачи «производитель-потребитель».
- •Проектирование и модели многопоточных приложений.
- •Иерархия памяти. Виртуальная память: концепция и инструменты.
- •Взаимодействие процессов: проблематика и средства.
- •Модули ядра Linux.
Дружественные функции.
Данную операцию можно рассматривать не как запрос объекту, а как действие над ним. В этом случае правильный подход – реализация в виде функции, а не метода класса. Проблема: инкапсуляция и необходимость доступа к закрытым членам. Решение – определение дружественной функции. Объявление дружественной функции в определении класса: friend тип имя(параметры);
Дружественная функция является частью интерфейса класса. Поэтому она не нарушает инкапсуляции. Расширенные права ей делегирует класс, а не его пользователи. Дружественными могут быть целые классы или отдельные методы классов.
Понятие полиморфизма в программировании. Виды полиморфизма в языке С++
Полиморфизм. Одно и тоже имя можно использовать для обозначения
нескольких действий, решающих подобные, но не одинаковые задачи или одну задачу разными способами.
Основной принцип: один интерфейс, множество методов. Выбор конкретного действия выполняется автоматически одним из двух способов:
– на этапе компиляции (статический полиморфизм)
Вызываться будет та функция, у которой число и типы формальных параметров соответствуют числу и типам фактических параметров, указанных при её вызове. Тип возвращаемого значения не влияет на определение вида вызываемой функции.
– на этапе выполнения программы (динамический полиморфизм).
Проявления полиморфизма в C++: перегрузка функций и методов, перегрузка операторов, виртуальные методы, шаблоны.
Иерархические отношения между классами: композиция.
class Composite {
public:
Composite(списокПараметров);
~Composite();
//...
private:
Class_1 b1;
Class_2 b2;
//...
Class_k bk;
};
Composite::Composite(списокПараметров)
: b1(список1), b2(список2), ... bk(списокk) {}
Иерархические отношения между классами: наследование.
//определение производного класса
class имяПроизводного : доступ имяБазового {
//объявление новых методов и переменных состояния
};
//определение конструктора
имяПроизводного::имяПроизводного(параметры)
: имяБазового(параметрыБазового)
{
//тело конструктора
}
Виртуальные методы и позднее связывание.
Раннее связывание – определение адреса вызываемой функции во время компиляции программы.
Позднее связывание – определение адреса вызываемой функции во время выполнения программы.
Сам процесс связывания заключается в замене виртуальных функций на адреса памяти.
При позднем связывании адрес функции определяется по типу объекта,
для которого осуществляется вызов через указатель.
Позднее связывание применяется для виртуальных (полиморфных) методов.
Синтаксис объявления метода виртуальным: virtual объявлениеМетода;
class Ancestor
{
public:
virtual void function1 () { cout << "Ancestor::function1()" << endl; }
void function2 () { cout << "Ancestor::function2()" << endl; }
};
Метод должен быть объявлен виртуальным, только если производные классы реализуют действие базового класса по своему. Позднее связывание позволяет корректно выполнять действия с объектами, тип которых неизвестен на этапе компиляции программы.
Виртуальным деструктор следует объявлять в тех случаях, когда есть виртуальные методы или от класса могут порождаться новые классы, объекты которых будут уничтожаться через указатель на базовый.
void destroy (Viewer *viewer)
{
//подготовительные действия
//...
delete viewer;
return;
}