- •Міністерство освіти і науки україни
- •Розділ 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()
- •Завдання
- •Список літератури
Void f1()
{
// Відкриваємо файл
ifstream ifs("\\INVALID\\FILE\\NAME");
if (!ifs)
{
cout << "Генеруємо виключення" << endl;
throw "Помилка при відкритті файлу";
}
}
Void f2()
{
Hello h; // Створюємо локальний об’єкт
f1(); // Викликаємо функцію, яка генерує виключення
}
Void main()
{
try
{
cout<< "Входимо в try-блок" << endl;
f2();
cout << "Виходимо з try-блока" << endl;
}
catch(int i)
{
cout<<"Викликаний обробник int, виключення – " <<i<<endl;
return;
}
catch(const char * p)
{
cout<<"Викликаний обробник const char*, виключення – "
<< p << endl;
return;
}
catch(...)
{
cout << "Викликаний обробник всіх виключень" << endl;
return;
}
}
Результати виконання програми:
Входимо в try-блок
Hello!
Генеруємо виключення
Bye!
Викликаний обробник const char*, виключення – Помилка при відкритті файлу
Зверніть увагу, що після породження виключення був викликаний деструктор локального об'єкту, хоча управління з функції f1 було передане обробникові, що знаходиться у функції main. Повідомлення "Виходимо з try-блоку" не було виведено. Таким чином, механізм виключень дозволяє коректно знищувати об'єкти при виникненні помилкових ситуацій. Тому виділення і звільнення ресурсів корисно оформляти у вигляді класів, конструктор яких виділяє ресурс, а деструктор – звільняє. Як приклад можна привести клас для роботи з файлом. Конструктор класу відкриває файл, а деструктор – закриває. В цьому випадку є гарантія, що при виникненні помилки файл буде коректно закритий, і інформація не буде загублена.
Розглянемо приклад використання виключень при контролі введення даних. Введення має бути цілим числом в діапазоні 0-20:
#include <iostream>
using namespace std;
#include <conio.h>
#include <windows.h>
Void GotoXy(int X, int y)
{
COORD coord = { Y, X };
SetConsoleCursorPosition(
GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
bool IsNumeric(char *str, bool dr )
{
int i,pos = 0;
if (!strlen(str)||str[0] == '.'|| str[0] == ',')
return false ;
for (i = 0; i < (int)strlen(str); i++ )
{
if (str[i] == ',')str[i] = '.';
if (i == 0 && (str[0] == '+' || str[0] == '-'))
continue;
if ((str[i] >= '0' && str[i] <='9') || str[i]=='.')
continue;
return false;
}
for (i = 1; i < (int)strlen(str);i++)
if (str[i]=='.')pos++;
if ( (!dr && pos) || (pos > 1)) return false ;
return true;
}
char* recode(char *txt)
{
static char buf[257];
strcpy(buf,txt);
for(unsigned int i=0;i<strlen(buf);i++)
{
if (buf[i]>='А'&&buf[i]<='п')buf[i]-=64;
if (buf[i]>='р'&&buf[i]<='я')buf[i]-=16;
}
return buf;
}
Void kontr (char* str) throw (const char*)
{
if (!IsNumeric(str, 0))throw
"Введено не ціле число\n";
int a = atoi(str);
if ( a < 0 || a > 20) throw
"Помилка – Діапазон 0 – 20\n";
}
Void main()
{
char k[100];
bool vozv;
while(1)
{
vozv = true;
GotoXY(0,0);
cout << " " ;
GotoXY(0,0);
cout << recode("Введіть значення k =");
cin >> k;
try
{
kontr(k);
}
catch (const char* d)
{
GotoXY(1,0);
cout << recode((char*)d);
vozv = false;
}
if(vozv)break;
} // while
system("cls");
getch();
}
У даному прикладі функція IsNumeric() повертає true тільки при введенні цілого числа, в противному випадку – false. У функції kontr() генеруються текстові виключення при невиконанні контролю значень, що вводяться. Слід зазначити, що використання виключень при контролі введення не є кращим варіантом. Приклад наводиться для практики використання виключень.
Розглянемо приклад обробки виключень класу:
#include <iostream>
using namespace std ;
char* recode(char *txt)
{
static char buf[257];
strcpy(buf,txt);
for(unsigned int i=0;i<strlen(buf);i++)
{
if (buf[i]>='А'&&buf[i]<='п')buf[i]-=64;
if (buf[i]>='р'&&buf[i]<='я')buf[i]-=16;
}
return buf;
}
class CTest
{
public:
CTest(){};
~CTest(){};
char *Show()
{return recode("Виключення у класі CTest class");}
};
class CDtorDemo
{
public:
CDtorDemo();
~CDtorDemo();
};
CDtorDemo::CDtorDemo()
{
cout << recode("Конструктор") << endl;
}
CDtorDemo::~CDtorDemo()
{
cout << recode("Деструктор") << endl;
}