Ако си запознат с private то следното e всичко, което може да се каже за friend:
Private методи и членове могат да се ползват само от класа в който са декларирани от методите на този клас и... от класове и/или методи, които са декларирани като friend в този клас. Пример:
Код:
int CanAccessFriend();
class SomeClass
{
private:
int private_member;
friend int CanAccessFriend();
friend class OtherClass;
public:
...
};
class OtherClass
{
int SomeFunc()
{
SomeClass sc;
return sc.private_member; //тук може, защото OtherClass е "приятел" на SomeClass
}
};
class AnotherClass
{
int Func()
{
SomeClass sc;
return sc.private_member; //тук не може
}
};
int CanAccessFriend()
{
SomeClass sc;
return sc.private_member; //тук може, защото CanAccessFriend е "приятел" на SomeClass
};
int CanNotAccessFriend()
{
SomeClass sc;
return sc.private_member; // тук не може
};
Тази конструкция се налага да се използва, когато искаш да си сигурен, че определени методи и членове на един клас не трябва да се ползват от никой друг освен този клас, но се налага да се ползват от точно определени други класове и/или методи за които ти предварително знаеш, че знаят какво правят (бърникайки в "частна" собственост). Пример за подобно поведение е например контейнер и неговото съдържание - контейнера е дефиниран в един клас, а съдържащите се в него елементи - в друг (обикновено родител на действителни такива) и е нормално контейнера да знае много добре какво прави с елементите си... както и елементите какво правят с контейнера си (тогава и двата класа взаимно се декларират като "приятелски").