Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

9.2 Дружні функції.

Крім дружніх класів в С++ допускаються і дружні функції. Синтаксично для оголошення дружньої до класу функції необхідно в протоколі класу помістити оголошення виду:

friend <тип результату><ім’я функції>(сигнатура);

Як правило, таке оголошення розміщують зразу після відкриваючої фігурної дужки в протоколі класу. Оголошення функції другом класу відкриває їй доступ до закритих та захищених даних екземпляра класу. Дружні функції можуть бути як звичайними функціями С++ так і членами класу. Як привило, дружня функція оголошується з параметрами-класами, з якими вона “дружить”. Розглянемо приклад:

# include<iostream.h>

class Two;

class One{

friend void Show(One &c1,Two &c2);

private:

char *s1;

public:

One()[s1=“testing”;

};

class Two{

friend void Show (One &c1,Two &c2);

private:

char *s2;

public:

Two(){s2=“one, two,three”;

};

main()

{ One c1;

Two c2;

Show(c1,c2);

return 0;

}

void Show(One &c1,Two &c2)

{

cout<<c1.s1<<c2.s2<<“\n”;

}

В цьому прикладі оголошується дружня функція до класів One та Two. Це дає їй можливість мати доступ до закритих полів s1та s2. Відмітимо, що з очевидних міркувань тут необхідним є неповне оголошення класу Two.

Як вже відмічалось вище, дружня функція також може бути членом класу.

Синтаксично оголошення її реалізується з використанням операції розширення області видимості:

friend <тип результату>< ім’я класу>::<ім’я функції-члена>(сигнатура);

Розглянемо приклад:

# include<iostream.h>

class One;

class Two{

friend void Show (One &c1,Two &c2);

private:

char *s2;

public:

Two(){s2=“one, two,three”;

void Show(One &c1);

};

class One {

friend void Two::Show(One &c1);

private:

char *s1;

public:

One(){s1=“testing”;}

};

main()

{ One c1;

Two c2;

c2.Show(c1);

return 0;

}

void Two::Show(One &c1)

{

cout<<c1.s1<<“\n”;

}

Бачимо, що порядок оголошень класів змінився (порівняно з попереднім

прикладом), оскільки клас, в якому міститься прототип функції-члена, повинен оголошуватись до класу, який визначає функцію-член дружньою.

Контрольні запитання

1. Які властивості мають дружні класи ?

2. Де може міститись оголошення дружнього класу ?

3. Чи є дружніми похідні від дружніх класів ?

4. Як синтаксично оголошуються дружні функції ?

5. В чому полягає специфіка дружніх функцій ?

Завдання 9:

1. Протестувати приклад з класом Pal. Розглянути випадок взаємно-дружніх класів.

2. Описати клас , дружній до класу Літак, який може змінювати значення окремих полів даних цього класу.(Наприклад, збільшувати кількість палива та боєприпасів). Очевидно, що такий клас може служити моделлю заправки.

3. Вважаючи, що заправка може відбуватись в повітрі, визначити клас Літак_Заправник , похідний від класу Літак.