Приятелски функции и приятелски класове

Приятелските функции на един клас се дефинират извън областта на действие на този клас, но имат право на достъп до закритите елементи (private) и защитените елементи (protected) на дадения клас. Функция или цял клас могат да бъдат обявени като приятели на друг клас. Приятелските функции се използват за повишаване на производителността, например при предефиниране на операции или при създаване на класове итератори.

Обектите от класа на итератора се използват за да избират последователно елементи или да изпълняват операции над елементите на обект от класа контейнер. Типични операции върху елементи на обект от клас контейнер са вмъкване, изключване, търсене, сортиране, проверка за наличие на елемент и др.. Примери за класове контейнери са масиви, стекове, опашки, свързани списъци.

За да се обяви, че функция е приятел на клас преди прототипа на функцията в описанието на класа се записва ключовата дума friend.

За да се обяви например, че ClassTwo е приятел на ClassOne, трябва в описанието на ClassOne да се запише:

  1. friend ClassTwo;
В този случай всички функции елементи на ClassTwo стават приятелски функции за ClassOne. Обикновено класът на итераторите се обявява като приятелски на класа на контейнерите. Обявяване на приятелство може да стане на произволно място в описанието на класа. Препоръчва се, обаче, това да става в началото, преди спецификаторите за достъп до елемент.

Някои програмисти смятат, че приятелството вреди на скриването на информация и отслабва обектно-ориентирания подход.

Примерна програма:
  1. #include <iostream.h>
  2. class Count
  3. {
  4. friend void setx( Count &, int);
  5. public:
  6.     Count()
  7.     {
  8.         x = 0;
  9.     }
  10.  
  11.     void print()const
  12.     {
  13.         cout << x << endl;
  14.     }
  15. private:
  16.     int x;
  17. };
  18.  
  19. void setx( Count &c, int value)
  20. {
  21.     c.x = value;
  22. }
  23.  
  24. void main ()
  25. {
  26.     Count object;
  27.     object.print();
  28.     setx (object, 8);
  29.     object.print();
  30. }
Ако функцията не беше обявена за приятел на класа Count, този начин на използване на данната елемент ще доведе до съобщение за грешка.