
- •«Объектно-ориентированный анализ и проектирование»
- •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)
Статические элементы класса
Статические поля – хранят данные общие для всех объектов класса. Они существуют для всех объектов класса в одном экземпляре (не дублируются).
Память пот статическое поле выделяется один раз при его инициализации с помощью операции доступа к области действия.
class A{
public:
static int count;
…
};
…
int A::count; // инициализируется нулем
// int A::count = 10; // инициализируется другим образом
Статические поля доступны как через поля класса, так и через имя объекта:
A *a, b;
…
cout<< A::count << a->count << b.count;
Статические поля, описанные как private, можно изменить лишь с помощью статических методов.
Память, занимая статическим полем, не учитывается при определении размера объекта с помощью sizeof .
Статические методы – обрабатывают статические поля класса. Они обращаются непосредственно к статическим полям и вызывают только статические методы класса, им не передается указатель this. Обращение к статическим методам осуществляется так же, и к статическим полям
class A{
static int count;
public:
static void inc_count() {count++;}
…
};
…
int A::count; // инициализируется нулем
void f()
{
A a;
// a.count ++ - нельзя, поле скрытое
a.inc_count(); //или A::inc_count();
}
Статические методы не могут быть константными и виртуальными.
Дружественные функции и классы
служат для непосредственного доступа извне к скрытым полям класса (расширяют интерфейс класса).
Дружественные функции оформляют действия, не представляющие свойств класса, нуждающиеся в доступе к его скрытым полям.
Дружественная функция
объявляется внутри класса, к элементам которого нужен доступ, с ключевым словом friend. Параметром передается объект или ссылка на объект;
может быть обычной функцией или методом другого ранее определенного класса; на нее не распространяется действие спецификаторов доступа место размещения в классе безразлично;
может быть дружественной нескольким классам.
class monstr; //Предварительное объявление класса
class hero{
public:
void kill( monstr &);
…
};
class monstr{
…
friend int steal_ammo(monstr &);
friend void hero::kill(monstr &);
};
int steal_ammo(monstr &M)
{return –M.ammo; }
void hero::kill(monstr &M)
{M.health = 0; M.ammo = 0;}
!!!Дружественные функции нарушают принцип инкапсуляции!!!
Если все методы класса должны иметь доступ к скрытым полям другого, весь класс объявляется дружественным:
class hero{
…
friend class mis;
};
class mis{
…
void f1();
void f2();
};
Функции f1 и f2 дружественные по отношению к hero имеют доступ ко всем его полям.
Деструкторы
- особый вид метода для освобождения памяти, занимаемой объектом. Вызывается автоматически при выходе объекта из области видимости:
для локальных – при выходе из блока;
для глобальных – при выходе из main;
для заданных через указатели при использовании delete.
Деструктор начинается с тильды, за которой следует имя класса:
не имеет аргументов и возвращаемого значения;
не может быть const / static;
не наследуется;
может быть виртуальным;
если не описан, создается автоматически как пустой.
Нужно создавать, если у объекта есть указатели на память, выделяемую динамически. Может вызываться явным образом при указании полностью уточненного имени (для объектов созданных с помощью перегруженной операции new).
…
monstr::~monstr()
{delete[] name;
}
…
void main()
{
…
monstr *m;
m -> ~monstr();
}