
- •«Объектно-ориентированный анализ и проектирование»
- •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, virtual, static.
Конструкторы глобальных объектов вызываются до вызова main. Локальные объекты создаются, когда становится активной область их действия.
Конструктор вызывается, если в программе встретилась какая-либо из конструкций:
Описание объектов:
имя_класса имя_объекта [(список параметров)] // список параметров не должен быть пустым
имя_класса (список параметров) // список параметров может быть пустым, создается объект без имени
имя_класса имя_объекта = выражение // создается объект без имени и копируется
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
enum color{red, green, blue};
class monstr{
int health,ammo;
color skin;
char *name;
public:
monstr(int he=100, int am=10);
monstr(color sk);
monstr(char *nm);
void draw( int x, int y, int scale, int position);
int get_health()
{return health;}
int get_ammo()
{return ammo;}
};
monstr::monstr(int he, int am) /* конструктор по умолчанию, т.к. его можно вызывать бех параметров */
{health = he;
ammo = am;
skin = red;
name = 0;
}
monstr::monstr(color sk)
{switch (sk)
{ case red: ammo = 10; skin = red; break;
case green: ammo = 20; skin = green; break;
case blue: ammo = 40; skin = blue;
}
health = 100; name = 0;
}
monstr::monstr(char *nm)
{health = 100;
ammo = 10;
skin= red;
name = new char [strlen(nm)+1];
strcpy (name , nm);
}
...
void monstr::draw(int x, int y, int scale, int position)
{ cout <<x<< y<< scale<< position;}
void main()
{
monstr Vasia, Super(200,300), stado[100];
cout << '\n'<< Best.get_health();
monstr Green(green);
monstr *m = new monstr("Ork");
}
Можно инициализировать поля в конструкторе с помощью списка инициализаторов, расположенных через запятую между заголовком и телом конструктора:
monstr::monstr(int he, int am): health (he),
ammo(am), skin (red), name (0){}
Это единственно возможный способ для инициализации полей-констант, полей-ссылок, полей-объектов.
Конструктор копирования
- это специальный вид конструктора, получающий в качестве параметра указатель на объект этого же класса:
<имя класса>::<имя класса>(const &<имя класса>) {/* тело конструктора*/}
Конструктор вызывается, когда объект копируется копированием существующего:
при описании нового объекта с инициализацией другим объектом;
при передаче объекта в функцию по значению;
при возврате объекта из функции.
Если не указано конструктора копирования, он создается автоматически. При этом осуществляется копирование полей, и если класс содержит указатели или ссылки, копирование будет «неправильным» (одна область памяти).
…
monstr::monstr(const monstr &M)
{health = M.health;
ammo = M.ammo;
skin= M.skin;
if (M.name)
{ name = new char [strlen(M.name)+1];
strcpy (name , M.name);
}
else name = 0;
…
void main(
{…
monstr Vasia(blue);
monstr Super = Vasia; //конструктор копирования
monstr *m = new monstr("Ork");
monstr Green = *m; //конструктор копирования
}