
- •«Объектно-ориентированный анализ и проектирование»
- •1. Принципы ооп. Классы.
- •Описание классов.
- •Объекты класса.
- •Конструкторы
- •Конструктор копирования
- •Статические элементы класса
- •Дружественные функции и классы
- •Деструкторы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Рекомендации по составу классов
- •2. Наследование
- •Ключи доступа
- •Простое наследование
- •Пример замещения функций (практикум)
- •Виртуальные методы
- •Множественное наследование
- •3. Отношения между классами. Диаграммы класссов на языке uml.
- •4. Шаблоны классов.
- •4.1. Определения шаблонов классов Queue и QueueItem
- •4.2. Конкретизация шаблона класса
- •4.3. Аргументы шаблона для параметров-констант
- •4.4. Функции-члены шаблонов классов
- •5. Обработка исключительных ситуаций
- •5.1. Общий механизм обработки исключений.
- •5.2 . Синтаксис исключений
- •5.3. Перехват исключений
- •5.4. Исключения в конструкторах и деструкторах
- •Vector(int n) // Конструктор
- •5.5. Список исключений функции.
- •6. Строки
- •Преобразование строк
- •7. Контейнерные классы
- •7.1. Векторы.
- •7.2. Двухсторонние очереди (deque).
- •7.3. Списки (List).
- •7.4. Стеки
- •7.5. Очереди (queue)
- •7.6. Очередь с приоритетами(priority_queue)
- •8. Ассоциативные контейнеры
- •8.1. Словари (map)
- •8.2. Словари с дубликатами (multimap)
- •8.3. Множества (set)
- •8.4. Множества с дубликатами (multiset)
- •8.5. Битовые множества (bitset)
Перегрузка операции присваивания
Присваивание по умолчанию осуществляется как поэлементное копирование. Перегруженная операция возвращает ссылку на объект, для которого вызывается, и имеет. единственный параметр – ссылку на присваиваемый объект.
Если требуется конструктор копирования, то должна быть перегружена операция присваивания.
Может быть определена только в форме метода класса.
Не наследуется.
const monstr& operator=(const monstr &M)
{
if (&M == this) return *this;
if (name) delete [] name;
if (M.name)
{
name = new char [strlenM.name) + 1];
strcpy(name, M.name);}
else name =0;
health = M.health;
ammo = M.ammo;
skin = M.skin;
return *this;
}
…
void main()
{
monstr A(10), B, C;
C = B = A;
…
}
Для перегрузки операции присваивания необходимо
убедиться, что нет присваивания вида x = x;
удалить предыдущее значение в динамически выделенной памяти;
выделить память под новые значения полей;
скопировать все значения полей;
возвратить значение объекта, на которое указывает this.
Рекомендации по составу классов
конструкторы, определяющие как инициализировать объекты;
набор методов, реализующих свойства класса (const указывает, что поля класса не должны меняться);
набор операций (копирование, присваивание, сравнение, …);
класс исключений (сообщения об ошибке)
Если есть функции, работающие с несколькими классами без доступа к скрытым полям, можно описать их вне классов. Для логической связи функции можно поместить в общее пространство имен:
namespace Nashi{
class monstr{…};
class hero{…};
void change(hero, monstr);
…
}
Самостоятельная работа: разобрать задание из практикума «Реализация класса треугольников»:
Библиотеки
cstring – работа со строками в С;
iomanip – манипуляторы, то есть функции, которые можно помещать в цепочку помещения и извлечения для форматирования данных (dec, oct, hex, endl, setprecision, setw).
sprintf – вывод в строку (stdio).
Этап 1. Создание многомодульного проекта. Раздел main.cpp. Меню, заглушки. Тестирование, отладка первой версии.
Этап 2. Перемещение точки (перегрузка +), треугольника.
Этап 3. Поиск максимального по площади треугольника: перегрузка >, «не совсем правильная» функция FindMax. Отладка (сбой): конструктор внутри функции, модификация объекта, копирование по умолчанию. Напоминание о работе конструктора и деструктора. Перегрузка операции присваивания, конструктор копирования.
Этап 4. Отношение включения. Алгоритм положения точки относительно вектора (5 вариантов) (самостоятельное изучение).
2. Наследование
Иерархия классов: производные классы получают элементы родительских, или базовых, классов и могут дополнять или изменять их свойства. В начале иерархии – наиболее общие черты для нижележащих классов. Класс может наследовать свойства 2-х и более классов.
Ключи доступа
class имя :[private | protected | public] базовый_класс [[,базовый_класс]]
{тело класса}
class A {…};
class B {…};
class C {…};
class D: A, protected B, public C {…};
По умолчанию для классов ключ доступа private, для структур – public.
Обозначим
public - 1
protected - 2
private – 3
Доступ в произ. кл. |
Ключ доступа (Y) |
1 |
2 |
3 |
Базовый класс (X) |
max{X,Y} |
|
|
|
1 |
|
1 |
2 |
3 |
2 |
|
2 |
2 |
3 |
3 |
|
- |
- |
- |
Если ключ доступа private можно сделать поля базового класса доступными через доступ к области видимости.
class Base {
…
public : void f();
…
};
class D: private Base {
…
public : Base::void f();
…
};