Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лаб_Гриф.doc
Скачиваний:
7
Добавлен:
14.11.2019
Размер:
2.81 Mб
Скачать

"Друзі" класів (friend)

Якщо в оголошенні чи визначенні функції в межах класу Х використовується специфікатор friend, то така функція стає "другом" класу Х.

"Друг" F класу X - це функція, що не є функцією-елементом Х, але має право доступу до елементів Х, включаючи розділи private і protected. В усіх інших відносинах F( ) - це звичайна з погляду області дії, оголошення і визначення функція.

Оскільки функція F( ) не є елементом Х, вона не лежить в області дії Х і тому після оголошення об’єктів Х хobj, *xptr; не може викликатися операціями вибору xobj . F( ) і xptr -> F( ) (xobj - це об'єкт класу Х, а xptr - це покажчик на клас Х).

Дружня функція, визначена в межах класу (inline), підкоряється тим же правилам будування, що і функції-елементи класу. На дружні функції не діють специфікатори доступу.

Таблиця 22.1 – Приклади оголошення та визначення функцій

Оголошення класу

Визначення для функцій

class X {

int i; // private

friend void ffunc(X*, int);

// ffunc( ) не є private,

// хоча вона й оголошена

// в розділі private

public:

void memf(int);

};

Void ffunc(X *xptr, int a)

{ xptr -> i = a; } // Доступ до

// private int i відкритий

void X::memf(int a) { i = a; }

// У функцію-член не потрібно

// передавати покажчик чи поси-

// лання на клас, тому що доступ

// до неї здійснюється через об'єкт

// класу і операцією вибору ( . )

Відзначимо розходження у викликах функцій

X xobj; // Оголошення об'єкта xobj класу Х

ffunc(&xobj, 6); // Виклик без імені об'єкта як звичайна функція

xobj . memf(6); // Виклик функції-члена з ім'ям об'єкта класу

Можна зробити усі функції класу Y дружніми для класу Х в одному оголошенні. Для цього один клас оголошується дружнім другому:

сlass Y; //Неповне оголошення

class X {

friend Y; // Клас Y є дружнім

// для класу Х і має доступ

// до його елементів

int i;

void memX(Y &);

};

сlass Y {

friend void X::memX(Y&); //Дружня

int a; //для Y функція-член класу Х

public:

void memY1(X &); //Дружні для Х

void memY2(X *); //функції класу Y

...

};

Функції memY1( ) і memY1( ), оголошені в Y, є дружніми для Х, хоча вони і не мають специфікаторів friend. Вони мають доступ до приватних елементів Х (private), так же, як i memХ( ). Крім того, окремі функції-члени класу Х ( memХ( ) ) також можуть бути дружніми для класу Y.

"Дружність" класів не транзитивна: якщо X є дружнім для Y, а Y - дружній для Z, то це не означає, що X - дружній Z. Однак, "дружність" успадковується.