- •Міністерство освіти і науки україни
- •Розділ 1. Інкапсуляція та приховування інформації
- •1.1 Визначення та використання класів
- •1.2. Поля і методи класів
- •1.2.1 Поля і методи класів
- •1.2.2 Опис об’єктів
- •1.2.3 Вказівка this
- •Void cure(int health, int ammo)
- •1.3 Інкапсуляція та приховування інформації
- •1.3.1. Приховані дані
- •1.3.2. Загальнодоступні і приватні члени класу
- •1.3.3. Захищені члени класу
- •Void b::fb()
- •Void c::fc()
- •Void c::fc(a&a)
- •Void main()
- •1.3.4. Організація загального інтерфейсу
- •Void main()
- •1.4 Конструктори і деструктори
- •Void main()
- •Завдання
- •Розділ 2. Класи і підкласи
- •2.1. Конструктор копіювання
- •2.2 Вкладені класи
- •Void External::Inner::MethodInner(const External &t)
- •2.3 Статичні елементи класу
- •2.3.1 Статичні поля
- •2.3.2 Статичні методи
- •Void f()
- •2.4 Дружні функції і класи
- •2.4.1 Дружня функція
- •Void Spouse(Person &p)
- •Void main()
- •2.4.2 Дружній клас
- •Завдання
- •Розділ 3. Спадкування класів
- •3.1 Спадкування класів
- •Void b::bb(int u)
- •Void main()
- •Приклад.
- •Void main()
- •Void main()
- •Void main()
- •3.2 Множинне спадкування
- •Void main()
- •Void main()
- •3.3. Типовий приклад спадкування
- •Void DatabaseObject::Display ( )
- •Завдання
- •Розділ 4. Поліморфізм
- •4.1. Віртуальні функції
- •Void main()
- •Void main()
- •4.2 Абстрактні класи
- •Void show(a* a)
- •Void main()
- •4.3. Приклади поліморфізму
- •Virtual double f1()
- •Void main()
- •4.4. Внутрішнє представлення об’єктів і таблиця методів
- •Void do_(a& a)
- •Void main()
- •Void show(a* a)
- •Void main()
- •Завдання
- •Розділ 5. Перевантаження операторів
- •5.1 Загальні відомості
- •5.2 Перевантаження унарних операторів
- •Int geth()
- •Void set_h (int h)
- •5.3 Перевантаження бінарних операторів та операторів присвоювання
- •Void main()
- •5.4 Перевантаження операторів new і delete
- •Void * pObj::operator new(size_t size)
- •Void pObj::operator delete(void* ObjToDie, size_t size)
- •5.5 Перевантаження оператору приведення типу
- •Operator ім’я нового типу ();
- •5.6 Перевантаження оператору виклику функції
- •5.7 Перевантаження оператору індексування
- •Vect::Vect (int n): size(n)
- •Завдання
- •Розділ 6. Обробка виключних ситуацій
- •6.1 Загальні відомості про виключні ситуації
- •6.2 Синтаксис виключень
- •6.3 Перехоплення виключень
- •Void f1()
- •Void f2()
- •Void main()
- •Void GotoXy(int X, int y)
- •Void kontr (char* str) throw (const char*)
- •Void main()
- •Void MyFunc()
- •Void main()
- •6.4 Список виключень функції
- •6.5 Виключення в конструкторах та деструкторах
- •6.6 Ієрархії виключень
- •Завдання
- •Розділ 7. Рядки
- •Void main ()
- •7.1.1 Конструктори і операції привласнення
- •7.1.2 Операції
- •7.2. Функції класу string
- •7.2.1 Привласнення і додавання частин рядків
- •7.2.2 Перетворення рядків
- •Void main ()
- •7.2.3 Пошук підрядків
- •Void main()
- •7.2.3 Порівняння частин рядків
- •Void main ()
- •7.2.4 Отримання характеристик рядків
- •Завдання
- •Розділ 8. Шаблони класів
- •8.1. Загальна характеристика динамічних структур даних
- •8.2. Стек
- •Void main()
- •Void push(Node **top, int d)
- •Int pop (Node **top)
- •8.3. Черга
- •Void main()
- •Void add(Node **pend, int d)
- •Int del(Node **pbeg)
- •8.4. Лінійний список
- •Void main()
- •Void add(Node **pend, int d)
- •8.5. Шаблони функцій
- •Void main()
- •Void myfunc(type1 X, type2 y)
- •Void main()
- •8.6 Загальні відомості шаблонів класів
- •Void List ::print()
- •Void List::print_back()
- •Void main()
- •8.7 Створення шаблонів-класів
- •Void main()
- •8.8 Спеціалізація шаблонів класів
- •8.9 Переваги та недоліки шаблонів
- •Завдання
- •Розділ 9. Модульні програми (проектування об’єктно-орієнтованого програмування)
- •9.1 Короткі відомості
- •9.2 Збірка вихідних текстів
- •Void main()
- •9.3 Відділення інтерфейсу від реалізації
- •9.4 Шаблони та модульність. Простір імен
- •9.5 Фізичне розділення простору імен
- •9.6 Міжмодульні змінні та функції
- •9.7 Ініціалізація глобальних об'єктів
- •Завдання
- •Розділ 10. Контейнерні класи
- •10.1 Загальні відомості
- •10.2 Послідовні контейнери
- •Void main()
- •10.2.1 Вектори (vector)
- •Void main()
- •Void main()
- •10.2.2. Двосторонні черги (deque)
- •10.2.3 Списки (list)
- •Void main()
- •Void main()
- •10.2.4 Стеки (stack)
- •Void main()
- •10.2.5 Черги (queue)
- •Void main()
- •Void main()
- •10.2.6 Черги з пріоритетами (priority_queue)
- •Void main()
- •Void main()
- •10.3 Асоціативні контейнери
- •10.3.1 Загальні відомості про асоціативні контейнери
- •Void main()
- •10.3.2 Словники (map)
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •10.3.3 Множини (set)
- •Void main()
- •Void main()
- •Завдання
- •Розділ 11. Алгоритми
- •11.1 Ітератори
- •11.2 Функціональні об'єкти
- •Void main()
- •Void main()
- •11.3 Алгоритми
- •11.3.1 Немодифікуючі операції з послідовностями
- •Void main ()
- •Void main()
- •Void main()
- •11.3.2 Модифікуючі операції з послідовностями
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •11.3.3 Алгоритми, пов'язані з сортуванням
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •11.3.4 Узагальнені чисельні алгоритми
- •Void main()
- •Void main()
- •Завдання
- •Список літератури
1.2. Поля і методи класів
1.2.1 Поля і методи класів
Поля класу:
можуть мати будь-який тип, окрім типу цього ж класу (але можуть бути вказівками або посиланнями на цей клас);
можуть бути описані з модифікатором const, при цьому вони ініціалізуються тільки один раз (за допомогою конструктора) і не можуть змінюватися;
можуть бути описані з модифікатором static (пояснення приводиться нижче).
Як приклад створимо клас, моделюючий персонаж комп'ютерної гри. Для цього потрібно задати його властивості (наприклад, кількість щупалець, силу або наявність гранатомета) і поведінку.
class monstr
{
int health, ammo;
public:
monstr(int he = 100, int am = 10)
{health = he; ammo = am;}
void draw (int x, int y, int scale, int position);
int get_health(){return health;}
int get_ammo(){return ammo;}
};
У цьому класі два приховані поля – health та ammo, набути значень яких ззовні можна за допомогою методів get_health() і get_ammo(). Всі методи класу мають безпосередній доступ до його прихованих полів. У приведеному класі міститься три визначення методів і одне оголошення (метод draw). Якщо тіло методу визначене усередині класу, він є вбудованим (inline). Як правило, вбудованими роблять короткі методи. Вбудовуємі функції можуть збільшити швидкість виконання програми, але непродумане їх використання може призвести до збільшення модуля до гігантських розмірів.
Якщо усередині класу записано тільки оголошення (заголовок) методу, сам метод має бути визначений у іншому місці програми за допомогою операції доступу до зони видимості (::):
void monstr::draw(int х,int у,int scale,int position)
{
/* тіло методу */
}
Метод можна визначити як вбудований і поза класом за допомогою директиви inline. У кожному класі є хоч би один метод, ім'я якого збігається з ім'ям класу. Він називається конструктором і викликається автоматично при створенні об'єкту класу. Конструктор призначений для ініціалізації об'єкту. Автоматичний виклик конструктора дозволяє уникнути помилок, зв'язаних з використанням неініціалізованих змінних.
1.2.2 Опис об’єктів
Конкретні змінні типу «клас» називаються екземплярами класу, або об'єктами. Час життя і видимість об'єктів залежить від виду і місця їх опису та підкоряється загальним правилам С++:
monstr Vasia; // Об'єкт класу monstr з параметрами за умовчанням
monstr Super(200, 300); // Об'єкт з явною ініціалізацією
monstr stado[100]; // Масив об'єктів з параметрами за умовчанням
monstr* beavis = new monstr (10); // Динамічний об'єкт
//(другий параметр задається за умовчанням)
monstr &butthead = Vasia; // Посилання на об'єкт
При створенні кожного об'єкту виділяється пам'ять, достатня для зберігання всіх його полів, і автоматично викликається конструктор, що виконує їх ініціалізацію. При виході об'єкту з області дії він знищується, при цьому автоматично викликається деструктор (деструктори описані далі).
Доступ до елементів об'єкту аналогічний доступу до полів структури. Для цього використовуються операція "." (крапка) при зверненні до елементу через ім'я об'єкту або операція "->" при зверненні через вказівку, наприклад:
int n = Vasia.get_ammo();
stado[5].draw(1,2,3,4);
cout << beavis->get_health();
Звернутися таким чином можна тільки до елементів із специфікатором рublic. Отримати або змінити значення елементів із специфікатором private можна тільки через звернення до відповідних методів. У нашому прикладі метод get_health(), що має специфікатор public, повертає значення поля health в секції private.
Можна створити константний об'єкт, значення полів якого змінювати забороняється. До нього повинні застосовуватися тільки константні методи:
class monstr
{
...
int get_health() const {return health;}
};
const monstr A(0,0); // Константний об'єкт
cout << A.get_health();
Константний метод:
оголошується з ключовим словом const після списку параметрів;
не може змінювати значення полів класу;
може викликати тільки константні методи;
може викликатися для будь-яких (не тільки константних) об'єктів.
Рекомендується описувати як константні ті методи, які призначені для набуття значень полів.