Funkcja zaprzyjaźniona to funkcja, która nie musi być metodą danej klasy, ale otrzymuje specjalne uprawnienia dostępu do jej składników prywatnych (private) i chronionych (protected). W C++ deklaruje się ją wewnątrz klasy za pomocą słowa kluczowego friend.
Najważniejsza cecha: funkcja zaprzyjaźniona może odczytywać i modyfikować prywatne pola klasy, z którą została zaprzyjaźniona.
Przykład
#include <iostream>
class Konto {
private:
double saldo;
public:
Konto(double s) : saldo(s) {}
friend void pokazSaldo(Konto k);
};
void pokazSaldo(Konto k) {
std::cout << k.saldo;
}
W przykładzie pole saldo jest prywatne, więc zwykła funkcja zewnętrzna nie miałaby do niego dostępu. Ponieważ pokazSaldo została zadeklarowana jako friend, może użyć k.saldo.
Cechy funkcji zaprzyjaźnionej
- jest deklarowana w klasie z użyciem
friend, - ma dostęp do pól i metod
privateorazprotected, - zwykle nie jest metodą tej klasy,
- nie posiada wskaźnika
this, - powinna być używana ostrożnie, bo osłabia hermetyzację.
Czego nie należy mylić?
Funkcja zaprzyjaźniona nie jest konstruktorem. Konstruktor uruchamia się automatycznie podczas tworzenia obiektu. Funkcja zaprzyjaźniona uruchamia się tylko wtedy, gdy zostanie jawnie wywołana w kodzie.
Nie służy też do dziedziczenia wielokrotnego ani nie oznacza automatycznie funkcji statycznej.