Дружественные функции похожи, но более безопасны, чем дружественные классы. Объявление функции дружественной классу дает ей доступ к закрытым и защищенным членам класса.
// Программа 2 Пример объявления дружественной функции
#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"; }
};
void main()
{
One c1;
Two c2;
Show(c1,c2);
}
void Show(One& c1, Two& c2)
{
cout << c1.s1 << c2.s2 << endl;
}
Неполное объявление класса Two позволяет в классе One ссылаться на класс Two.
Дружественные функции могут быть членами класса. Обычно в классе объявляется дружественной функция-член другого класса. Она имеет доступ к закрытым и защищенным членам класса, в котором она объявлена дружественной.
// Программа 3
#include <iostream.h>
class One;
class Two {
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 "; }
};
void main()
{
One c1;
Two c2;
c2.Show(c1);
}
void Two::Show(One& c1)
{
cout << c1.s1 << s2 << endl;
}
Порядок объявления классов изменился, так как класс в котором содержиться прототип функции должен быть объявлен раньше, чем класс, в котором функция объявлена дружествен-ной.