- •Федеральное агентство связи
- •«Московский технический университет связи и информатики»
- •Программирование в системах информационной безопасности
- •Перегрузка функций
- •Аргументы функции по умолчанию
- •Определение классов: данные-члены, функции-члены, уровень доступа к членам
- •Статические члены класса
- •Конструкторы
- •Деструктор
- •Порядок вызова конструкторов и деструкторов
- •Передача объектов в функции
- •Дружественные функции и классы
- •Перегрузка операций
- •Функции преобразования
- •Автоматически генерируемые функции-члены
- •Задание
- •Индивидуальные варианты заданий
- •Конструктор копирования и операция присваивания
- •Конструктор перемещения и операция присваивания с перемещением
- •Задание
- •Индивидуальное задание
- •Задание
- •Контрольные вопросы
- •Практикум №11 Шаблонные функции и классы Цель практикума
- •Краткие теоретические сведения
- •Виртуальные функции
- •Чисто виртуальные функции и абстрактные классы
- •Задание
- •Индивидуальное задание
- •Контрольные вопросы
Задание
Преобразовать разработанный в практикуме №9 класс.
Разработать классы исключениий OverflowException и NoElementsException.
Функции Push, PushFront и PushBack не должны возвращать никакого значения и должны выбрасывать исключение OverflowException в случае нехватки места.
Функции Pop, PopBack, PopFront, Peek, PeekBack, PeekFront, должны возвращать копию элемента и выбрасывать исключение NoElementsException в случае если в контейнере нет элементов
Контрольные вопросы
Что представляет собой исключение в С++?
На какие части исключения позволяют разделить вычислительный процесс?
Какой оператор используется для генерации исключительной ситуации?
Что представляет собой контролируемый блок? Для чего он нужен?
Что представляет собой секция-ловушка? Для чего она нужна?
Какие формы может иметь спецификация исключения в секции ловушке? В каких ситуациях используются эти формы?
Какой стандартный класс можно использовать для создания собственной иерархии исключений?
Каким образом можно создать собственную иерархию исключений?
Если спецификация исключений имеет вид: void f1() throw(int, double); то какие исключения может прождать функция f1()?
Если спецификация исключений имеет вид: void f1() throw(); то какие исключения может прождать функция f1()?
В какой части программы может генерироваться исключение?
Практикум №11 Шаблонные функции и классы Цель практикума
Изучить механизм шаблонов в языке C++.
Краткие теоретические сведения
Язык C++ поддерживает обобщённое программирование с помощью механизма шаблонов. Шаблонами могут быть функции и классы. В шаблонную функцию или класс вводится один или несколько параметров, которые разрешаются во время компиляции. Такими параметрами могут быть как целые числа, так и имена типов. Создание класса или функции из шаблона называется инстанцированием шаблона. Компилятор генерирует определение функции или класса, подставляя все необходимые параметры. Если такое определение ошибочно, компилятор выдаст ошибку. Применительно к контейнерам, параметром шаблона является тип данных элемента.
#pragma once
template<typename T>
class Stack
{
public:
Stack(int count);
Stack(const Stack &other);
Stack(Stack &&other);
Stack &operator=(const Stack &other);
Stack &operator=(Stack &&other);
~Stack();
int GetSize() const;
void Push(const T &element);
T Pop();
private:
T *arr;
int count;
};
template<typename T>
Stack<T>::Stack(int count)
: count(count)
{
arr = new T[count];
}
Задание
Преобразовать разработанный в практикуме №9 класс в шаблонный класс. Параметром шаблона является тип элементов в динамической структуре данных.
Контрольные вопросы
Что такое шаблонные методы и классы?
Что такое инстанцирование шаблона?
Практикум №12 Одиночное и множественное наследование. Виртуальные и чисто виртуальные функции. Абстрактные и конкретные классы
Цель практикума
Овладеть навыками создания базовых классов с виртуальными и чисто виртуальными функциями, а также производных классов с переопределением указанных функций
Краткие теоретические сведения
Наследование
Язык C++ поддерживает несколько механизмов повторного использования кода. Одним из таких механизмов является наследование. В C++ поддерживается как одиночное наследование (от одного класса), так и множественное наследование (от двух и более классов). Класс, от которого наследуют, называется базовым или родительским классом. Класс, которые наследует, называется дочерним или производным классом. Производный класс получает все члены, определённые в базовом классе, может обращаться ко всем членам, кроме приватных. Производный класс может добавлять свои члены (данные и функции).
C++ определяет три вида наследования: публичное, защищённое, приватное. При публичном наследовании уровень доступа к членам базового класса не изменяется. При защищённом наследовании публичные члены базового класса становятся защищёнными, остальные остаются без изменений. При приватном наследовании все члены базового класса становятся приватными.
Определение базового класса |
Определения производных классов |
class BaseClass { public: void f() {} protected: void g() {} private: void h() {} }; |
class DerrivedA : public BaseClass { };
class DerrivedB : protected BaseClass { };
class DerrivedC : private BaseClass { }; |
Классы DerrivedA, DerrivedB и DerrivedC являются производными классами. Ключевое слово private в определении класса DerrivedC является опциональным.
Ссылка либо указатель на базовый класс может хранить адрес объекта производного класса. Эта возможность доступна всегда при использовании публичного наследования и ограниченно при использовании защищённого наследования.