{
return a.data+b.data;
}
///////////
int main()
{clrscr();
alpha aa;
beta bb;
cout<<frifunc(aa,bb)<<endl;
bioskey(0);
return 0;
}
Програма 13.8
В цій програмі ми бачимо два класи – alpha і beta. Конструктори цих класів задають їх єдині елементи даних у вигляді фіксованих значень 3 і 5. Нам необхідно, щоб функція frifunc() мала доступ до тих та інших прихованих даних, тому ми робимо її дружньою функцією. З цією метою всередині кожного класу використане ключове слово friend.
friend int frifunc(alpha,beta);
Це оголошення може бути розміщене де завгодно всередині класу. Немає жодної різниці, запишемо ми його в public- чи private-секцію.
Об’єкт кожного класу передається як параметр функції frifunc(), і функція має доступ до прихованих даних обох класів через ці аргументи. Функція додає значення даних і повертає їх суму.
Нагадаємо, що до класу не можна звертатися до того, як він оголошений в програмі. Оголошення функції frifunc() в класі alpha посилається на клас beta, а, отже, beta повинен бути оголошений до alpha. Звідси означення
class beta;
на початку програми.
Треба відмітити, що ідея дружніх функцій дещо сумнівна. Під час розробки С++ на цю тему велися суперечки і приводилися аргументи проти включення в мову такої можливості. З одного боку, дружні функції підвищують гнучкість мови, з іншого - вони не відповідають принципу обмеження доступу до даних, згідно з яким тільки функції-члени можуть мати доступ до прихованих даних класу.
Наскільки серйозно суперечить єдності концепції використання дружніх функцій? Дружня функція оголошується такою в тому класі, до даних якого вона пізніше й матиме доступ. Таким чином, програміст, що не має доступу до вихідного коду класу, не може зробити функцію дружньою. В цьому сенсі цілісність даних зберігається. Але все одно такі функції можуть призвести до «spaghetti code» (код з надто великою кількістю передач управління), коли численні дружні функції фактично стирають границі між класами. З цієї причини дружні функції повинні бути принаймні розкидані по програмі і зустрічатися як можна рідше.