Применяются для доступа к скрытым полям класса и представляют собой альтернативу метода, т.к. метод как правило используется для реализации свойств объекта. Дружественные функции используются, когда оформляется действие, не представляющее собой свойство класса, но входящее в интерфейс класса и нуждающееся в доступе к его скрытым полям.
Свойства дружественных функций:

Пример 1
class monstr;  /* предварительное объявление класса */

class hero
{
public:
void kill(monstr &);
};

class monstr
{
friend int steal_ammo(monstr &);
friend void hero::kill(monstr &);
/* класс hero должен быть определен ранее */
};

int steal_ammo(monstr &M)
{
return --M.ammo;
}

void hero::kill(monstr&M)
{
M.health = 0;
M.ammo = 0;
}

Использование дружественных функций по возможности нужно избегать, так как они нарушают принцип инкапсуляции.