
- •1. Понятие класса. Методы класса. Управление доступом к компонентам.
- •2. Объявление и определение класса. Внешнее определение функций.
- •3. Создание, копирование и удаление объекта.
- •4. Статические компоненты класса. Инициализация статических компонентов класса.
- •5. Наследование. Типы наследования. Виртуальное наследование.
- •6. Виртуальные функции
- •7. Абстрактные классы и чистые виртуальные функции. Интерфейс
- •8. Дружественность. Дружественные классы и функции.
- •9. Вложенные классы. Внутреннее и внешнее определение.
- •10. Шаблоны классов
- •11.Создание экземпляров шаблона. Инстанцирование.
- •12.Шаблоны и наследование.
- •13.Терминология шаблонов.
- •14. Параметры и аргументы шаблона.
- •15. Шаблоны компонентных функций
- •16. Полная специализация шаблонов.
- •17. Частичная специализация шаблонов.
- •18. Перегрузка операций. Основные понятия.
- •19. Перегрузка унарных операций.
- •20. Перегрузка бинарных операций.
- •Int test() {
- •Int test() {
- •Int test() {
- •// Делаем что-то
- •Вопрос 23
- •24. Группировка и композиция исключений. Повторная генерация. Перехват всех исключений.
- •25. Автоматическое управление ресурсами. Методика raii.
- •Void f() { FileOpen("myfile.Txt", "rt"); //здесь выполняем нужную работу с файлом //... }
- •Void f (int a) throw (x2, x3)
- •27. Стандартная библиотека. Организация стандартной библиотеки
- •28. Тип вектора. Вложенные типы. Итераторы. Доступ к элементам
- •29.Тип Вектора. Конструкторы. Операции со стеком. Списочные операции. Размеры и емкость.
- •30. Стандартные контейнеры. Вопросы производительности операций.
- •31. Процесс разработки по. Цели и этапы проектирования.
- •32. Процесс разработки по. Выявление классов. Определение операций.
- •33. Процесс разработки по. Определение взаимосвязей. Определение интерфейсов.
- •Этап 3: выявление зависимостей
- •Этап 4: определение интерфейсов
- •34. Паттерны проектирования. Основные паттерны.
- •35. Тестирование по. Методы тестирования.
1. Понятие класса. Методы класса. Управление доступом к компонентам.
! Класс — этот тип, определяемый пользователем. Альтернативные варианты: класс - это совокупность объектов, обладающих схожими свойствами и поведением, класс – это абстрактный тип данных, включающий множество компонент, среди которых имеется хотя бы одна функция.
! Функции, определённые внутри класса, называются методами этого класса.
Рассмотрим пример: допустим мы хотим научить нашего солдата ходить. Вот как это будет выглядеть при использовании структур:
struct soldier
{
int x, y;
};
soldier a = {0,0};
a.x += 1; // боец переместился вправо
Конечно же лучше для передвижения написать функцию:
void move (int x, int y) {}
А как должно выглядеть тело функции? Мы можем просто записать:
a.x += x;
a.y += y;
Но тогда, если у нас будет несколько переменных типа soldier, мы не сможем применить функцию move к ним. Поэтому нам необходимо передавать ещё один аргумент - структурную переменную чьи поля будут изменены. Итак:
soldier move (soldier a, int x, int y)
{
a.x += x;
a.y += y;
return a;
}
Теперь посмотрим, как рабоать с этой функцией:
soldier b = {0, 0};
soldier c = {1, 1};
b = move(b, 0, 1); // двигаем b вверх
c = move(c, 0, -1); // двигаем c вниз
В функцию передаётся переменная soldier, но её нужно и вернуть из функции. В функцию дополнительно передаётся 8 байт (поля x,y переменной soldier) и из функции возвращается восемь байт. Лучше конечно передавать soldier по ссылке.
Смотрите сколько сложностей! С классами всё намного проще:
class soldier
{
public:
int x,y;
void move (int dx, int dy)
{
x += dx;
y += dy;
}
};
Внутри функции мы определили функцию move. Заметьте, в неё не нужно передавать объекты класса - метод сам знает, какой объект его вызвал. dx и dy - значения на которые изменятся поля класса.
Как всё это работает:
soldier a = {0,0};
soldier b = {5,6};
a.move(1,1);
b.move(-2,3);
Методы класса вызываются почти также как и обычные функции. При этом, метод знает, какой объект его вызвал и меняться будут поля нужного объекта.
Управление доступом к компонентам.
Ключ public разрешает использовать элементы класса любыми функциями программы.
Ключ private допускает использование элементов данных только функциями-членами (методами) класса.
Ключ protected используется только в иерархии классов, позволяет использовать элементы данных класса функциями-членами производных классов.
В Class по умолчанию стоит private и он может быть опущен, а в struct – public.
Плюсы использоваия - любое усовершенствование внутренней структуры данных класса требует лишь изменения функций-членов с тем, чтобы воспользоваться новыми возможностями и состоит в том, что потенциальному пользователю класса для начала работы с новым типом данных нужно изучить лишь работу с открытым классовым интерфейсом.
Защита закрытых данных класса опирается на защиту имен членов класса. Такую защиту можно обойти с помощью манипуляции адресами и явного преобразования типов (то есть обманным путем). Защита C++ есть защита от непреднамеренных ошибок, а не от умышленного нарушения правил.