Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.08 Mб
Скачать
  1. Поняття про функції-"друзі" класу

Технологія об'єкгно-орієнтованого програмування дає змогу організувати до­ступ до закритих членів класу функціями, які не є його членами. Для цього дос­татньо оголосити ці функції дружніми до цього класу. Щоб зробити функцію "другом" класу, потрібно помістити її прототип в риЬІіс-розділ оголошення класу і попередити його ключовим словом friend. Наприклад, наведений нижче фрагмент коду функції Fun() оголошується "другом" класу myClass: class myClass { // Оголошення класового типу

  1. . public:

friend void Fun(myClass obj); // "Дружня" функція класу

  1. .

};

Як бачимо, ключове слово friend передує решті частини прототипу функції FunO, надає їй як не члену класу доступ до його закритих членів. Одна і та ж фун­кція може бути "другом" декількох класів. Розглянемо приклад, у якому "дружня" функція використовується для доступу до закритих членів класу myClass.

Код програми 3.1. Демонстрація механізму використання "дружньої" функції для доступу до закритих членів класу

#include <vcl>

#include <iostream> // Для потокового введення-виведення #include <conio> // Для консольного режиму роботи using namespace std; // Використання стандартного простору імен

class myClass { // Оголошення класового типу

int а, Ь; public:

// Оголошення параметризованого конструктора

myClass(int _а, int _b) {а = _а; b = _Ь;}

friend int Sum(myClass obj); // Функція SumO - "друг" класу myClass.

};

// Функція SumO не є членом ні одного класу.

int Sum(myClass obj)

{

І* Оскільки функція SumO - "друг" класу myClass, то вона має право на прямий доступ до його членів-даних а і b */ return obj.а + obj.b;

}

int mainO

{

myClass Obj(3,4); // Створення об'єкта класу cout«"Sum=" « Sum(Obj) « endl; getchO; return 0;

}

У наведеному вище прикладі функція Sum() не є членом класу myClass. Проте вона має повний доступ до private-членів класу myClass. Зокрема, вона може безпо­середньо використовувати значення obj.а і obj.b. Зверніть також увагу на те, що фу­нкція SumO викликається звичайним способом, тобто без прив'язування до імені об'єкта (і без використання оператора "крапка"). Оскільки вона не є функцією- членом класу, то під час виклику її не потрібно кваліфікувати з вказанням імені об'єкта1. Зазвичай "дружній" функції як параметр передається один або декілька об'єктів класу, для яких вона є "другом". Робиться це так само як і у випадку пере­дачі параметра функції SumO-

Незважаючи на те, що у наведеному вище прикладі не отримуємо ніякої ко­ристі з оголошення "другом" функції SumO, а не членом класу myClass, існують пе­вні обставини, при яких статус "дружньої" функції класу має велике значення. По- перше, функції-"друзі" є корисними для перевизначення операторів певних типів. По-друге, функції-"друзі" спрощують створення деяких функцій введення-виве- дення. Усі ці питання розглядатимемо згодом у цьому навчальному посібнику.

Третя причина частого використання функцій-"друзів" полягає у тому, що в деяких випадках два (або більше) класи можуть містити члени, які перебувають у взаємному зв'язку з іншими частинами програми. Наприклад, у нас є два різні кла­си, які під час виникнення певних подій відображають на екрані "спливаючі" пові­домлення. Інші частини програми, які призначені для виведення даних на екран, повинні знати, чи є "спливаюче" повідомлення активним, щоб випадково не пере- записати його. Для уникнення цього у кожному класі можна створити функцію- члена, що повертає значення, за якою робляться висновки про те, є повідомлення активним чи ні. Однак перевірка цієї умови вимагатиме додаткових витрат (тобто двох викликів функцій замість одного). Якщо статус "спливаючого" повідомлення необхідно перевіряти часто, то ці додаткові витрати можуть виявитися відчутни­ми. Проте за допомогою функції, "дружньої" для обох класів, можна безпосе­редньо перевіряти статус кожного об'єкта, викликаючи для цього тільки одну і ту

саму функцію, яка матиме доступ до обох класів. У таких ситуаціях "дружня" фу­нкція класу дає змогу написати більш ефективний програмний код. Реалізацію за­значеної ідеї продемонструємо на прикладі такої програми.