- •2.1 Елементи концепції ооп .. 20
- •1.1 Коментарі.
- •1.2 Прототипи функцій.
- •1.3 Операція розширення області видимості.
- •1.4 Оголошення в операторах.
- •1.5 Перегрузка функцій.
- •1.6 Значення формальних параметрів по замовчуванню.
- •1.7 Посилання та вказівники.
- •1.8 Специфікатор inline
- •1.9 Операції new та delete .
- •1.10 Вказівник на void.
- •1.11 Зв’язування із збереженням типів
- •1.12 Про структури та об’єднання.
- •2.1 Елементи концепції ооп.
- •2.3 Опис протоколу класу.
- •2.4 Передача повідомлень об’єктам.
- •3 Функції-члени.
- •3.1 Функції-члени в межах та за межами формального опису класу.
- •3.2 Про вказівник this.
- •3.3 Перевантаження функцій-членів. Параметри по замовчуванню.
- •4. Конструктори та деструктори.
- •4.1 Поняття про конструктори.
- •4.2 Деструктори.
- •4.3 Досягнення високої ефективності. Конструктор копіювання.
- •5 Глобальні та локальні об’єкти.
- •6 Статична пам’ять та класи.
- •7. Наслідування
- •7.1 Синтаксична реалізація наслідування
- •7.2 Правила доступу до полів даних
- •7.3 Конструктори та деструктори в похідних класах
- •7.4 Використання заміщуючих функцій-членів.
- •7.5 Похідні класи та вказівники.
- •7.6 Ієрархія типів
- •7.7 Множинне наслідування
- •8 Вiртуальнi функцiї та класи
- •8.1 Віртуальні функції.
- •8.2 Чисті віртуальні функції. Абстрактні класи.
- •8.3 Віртуальні деструктори.
- •8.4 Посилання як засіб для реалізації поліморфізму
- •8.5 Технічна реалізація механізму віртуальних функцій.
- •8.6 Віртуальні базові класи
- •8.6.1 Ієрархії класів та наслідування
- •8.6.2 Віртуальні базові класи
- •8.6.3 Виклик конструкторів та віртуальні базові класи.
- •9 Друзі
- •9.1 Дружні класи.
- •9.2 Дружні функції.
- •10 Перевантаження операторiв.
- •10.1 Перевантаження операторів. Загальний підхід.
- •10.2 Перетворення типів.
- •10.3 Перевантаження деяких операторів.
- •10.3.1 Оператор індексування масиву.
- •10.3.2 Перевантаження оператора виклику функції.
- •10.3.3 Оператор доступу до члена класу.
- •10.3.4 Перевантаження операторів інкремента та декремента.
- •10.3.5 Перевантаження операторів управління пам’яттю (new,delete).
- •10.3.6 Перевантаження оператора присвоювання.
- •11.1 Функціональні шаблони
- •11.1.1 Визначення та використання шаблонів функцiй.
- •11.1.2 Перевантаження шаблонiв функцiї.
- •11.1.3 Cпецiалiзованi функцiї шаблона.
- •11.2 Шаблони класів.
- •11.2.1 Визначення шаблонів класу
- •11.2.2 Константи та типи як параметри шаблону
- •11.2.3 Використання шаблонних класів
- •11.2.4 Спецiалiзацiя шаблонiв класу.
- •11.3 Шаблони та конфiгурацiя компiлятора.
- •11.3.1 Шаблони Smart.
- •11.3.2 Шаблони Global I External.
- •12.2 Переадресація вводу-виводу
- •12.3 Розширення потоків для типів кориcтувача
- •12.4 Операції роботи з потоком як дружні
- •12.5 Форматований ввід-вивід
- •12.5.1 Ширина поля
- •12.5.2 Заповнюючий символ
- •12.5.3 Число цифр дійсних чисел
- •12.5.4 Прапорці форматування
- •12.5.5 Маніпулятори
- •12.6 Стан потоку
- •12.7 Файловий ввід-вивід
- •12.7.1 Конструктори файлових потокiв
- •12.7.2 Вiдкриття файлу
- •12.8 Неформатований ввід-вивід
- •12.9 Деякі функції вводу-виводу
- •12.10 Форматування в пам’яті
- •13 Управління виключеннями
- •13.1 Виключення та стек
- •13.2.1 Синтаксис основних конструкцій
- •13.2.1.1 Використання try та сatch
- •13.2.1.2 Використання throw
- •13.2.2 Тип виключення та конструктор копії
- •13.2.3 Пошук відповідного типу виключення
- •13.2.4 Використання terminate() та некеровані виключення
- •13.2.5 Робота з специфікаціями виключень
- •13.2.6 Робота з непередбаченими виключеннями
- •13.2.7 Робота з конструкторами та виключеннями
- •13.2.8 Динамічні об’єкти
- •13.2.9 Передача значень з конструктора та деструктора
- •13.2.10 Робота з ієрархіями виключень
- •13.2.11 Робота з специфічними класами виключень
- •13.3 Структурне управління виключеннями
- •13.3.1 Використання кадрованого управління виключеннями
- •13.3.1.1 Синтаксис
- •13.3.1.2 Про функцію RaiseException()
- •13.3.1.3 Фільтруючий вираз
- •13.3.1.4 Перехоплення виключення процесора
- •13.3.2 Використання завершуючих обробників виключень
9 Друзі
Інкапсуляція даних - одна з основних переваг ООП. Проте в С++ існує можливість обійти правила інкапсуляції, тобто доступу до різних частин опису класу.
9.1 Дружні класи.
В класі можна оголосити інший клас як дружній. Один клас (в якому оголошується друг) дає можливість іншому класу(другу) мати доступ до всіх закритих та захищених членів першого класу. Як відомо, відкриті члени завжди доступні. Тому немає необхідності оголошувати один клас другом іншого, щоб дати йому доступ до відкритих членів останнього. Механізм дружніх класів використовується у випадках, коли для двох класів, не пов’язаних “родинним” відношенням, необхідний доступ до закритих та захищених секцій класів. Нехай оголошений такий клас:
class Aclass{
private:
double v;
public:
Aclass() {v=3.14159;}
};
Нехай оголошено ще один клас:
class Bclass{
private:
Aclass anobject;
public:
void ShowValue(void)
{cout <<anobject.value;}
};
Член anobject типу Aclass є закритим в класі Bclass. Тому в наведеному вище прикладі буде видане повідомлення про помилку. Вийти з цієї ситуації можна, якщо оголосити клас Bclass другом класу Aclass. Для цього використовується ключове слово friend:
class Aclass{
friend class Bclass;
private:
double v;
public:
Aclass() {v=3.14159;}
};
Оголошення дружнього класу може міститись будь-де в протоколі опису класу (не обов’язково на початку формального опису після “}”). При оголошенні дружніх класів потрібно дотримуватись деяких правил:
1. В класі повинні бути перераховані всі його друзі.
2. Клас , в якому є закриті та захищені члени і в якому оголошений інший клас другом, надає можливість “другу” мати доступ до закритої частини класу (в розумінні протоколу). Клас не може оголосити сам себе другом іншого класу.
3. Порядок оголошення класів та дружніх до них не грає ролі. Проте, як правило, дружні класи оголошуються після базових щоб функції дружніх класів, що вбудовуються, могли звертатись до закритих та захищених частин вихідного класу.
4. Похідні від дружніх класів не є дружніми.
5.Синтаксично похідний клас може бути другом іншого класу. Результат -аналогічний.
Розглянемо приклад:
class Pal{
friend class Buddy;
private:
int x;
protected:
void doublex(void) {x*=x;}
public:
pal(){x=100;}
pal(int n){x=n;}
};
class Buddy{
private:
Pal palobject;
public:
void ShowValues(void);
};
main()
{Buddy aBuddy;
aBuddy.ShowValues();
return 0;
}
void Buddy:: ShowValues(void)
{Pal aPal(1234);
cout<<“\n before palobject.x=“<< palobject.x;
palobject.doublex();
cout<<“\n after palobject.x=“<< palobject.x;
cout<<“\n apal.x=“<<aPal.x<<“\n”;
}
Допускаються взаємно-дружні класи. При цьому необхідне додаткове неповне оголошення класу:
class Bclass;
class Aclass{
friend class Bclass;
//. . .
};
class Bclass{
friend class Aclass;}
В цьому прикладі неповне оголошеня класу class Bclass; перед визначенням класу Aclass необхідне, якщо в класі Aclass є посилання по імені на другий клас, наприклад в параметрі функції-члена.