Дружественная функция – это функция, которая, не являясь компонентом класса, имеет доступ к его защищенным и собственным компонентам. Такая функция должна быть описана в теле класса со спецификатором friend.
Пример
class myclass
{
int x,y;
friend void set(myclass*,int,int);
public:
myclass(int x1,int y1){x = x1; y = y1;}
int sum(void){return (x+y);}
};
void set(myclass *p,int x1,int y1){p–>x = x1; p–>y = y1;}
void main(void)
{
myclass A(5,6);
myclass B(7,8);
cout<<A.sum();
cout<<B.sum();
set(&A,9,10);
set(&B,11,12);
cout<<A.sum();
cout<<B.sum();
}
Функция set описана в классе myclass как дружественная и определена как обычная глобальная функция (вне класса, без указания его имени, без операции :: и без спецификатора friend).
Дружественная функция при вызове не получает указатель this. Объекты класса должны передаваться дружественной функции только через параметр.
Итак, дружественная функция:
* не может быть компонентной функцией того класса, по отношению к которому определяется как дружественная;
* может быть глобальной функцией;
* может быть компонентной функцией другого ранее определенного класса.
Например,
class CLASS1
{. . .
int f(. . .);
. . .
};
class CLASS2
{. . .
friend int CLASS1 : : f(. . .);
. . .
};
// В этом примере класс CLASS1 с помощью своей компонентной функции f( )
// получает доступ к компонентам класса CLASS2.
* может быть дружественной по отношению к нескольким классам;
Например,
// предварительное не полное определение класса
class CL2;
class CL1
{friend void f(CL1,CL2);
. . .
};
class CL2
{friend void f(CL1,CL2);
. . .
};
// В этом примере функция f имеет доступ к компонентам классов CL1 и CL2.