4.4. Spřátelené funkce

Časová náročnost
Časová náročnost: 6 minut

Někdy můžeme chtít, aby měla funkce přístup k privátním členům třídy bez toho, aby byla členem třídy. Proto C++ definuje spřátelené funkce. Spřátelená funkce není členem třídy, ale má přístup k jejím privátním prvkům.

Spřátelená funkce je definována jako řádná funkce bez členů. Uvnitř deklarace třídy, jejímž bude přítelem, je zahrnut také její prototyp s klíčovým slovem friend.

V následujícím příkladu deklarujeme myclass() uvnitř její konstruktor a jejího přítele. Protože jde o přítele má přístup k jejím privátním členům.

src/4_6.cpp
Příklad 4.6.
#include <iostream.h>

class myclass {
  int n, d;
public:
  myclass(int i, int j) { n = i; d = j; }
  friend int isfactor(myclass ob); //spratelena funkce
};

int isfactor(myclass ob)
{
  if(!(ob.n % ob.d)) return 1;
  else return 0;
}

int main()
{
  myclass ob1(10, 2), ob2(13, 3);

  if(isfactor(ob1)) cout << "10 je delitelne 2\n";
  else cout << "10 neni delitelne 2\n";

  if(isfactor(ob2)) cout << "13 je delitelne 3\n";
  else cout << "13 neni delitelne 3\n";

  return 0;
}

upozornění Musíme si uvědomit, že spřátelená funkce není členem třídy jejímž je přítelem. Není tedy možné volat spřátelenou funkci s využitím jména objektu a tečkového či šipkového operátoru. Přestože tedy spřátelená funkce zná privátní prvky třídy, s níž je spřátelená, může k nim přistupovat pouze přes objekty třídy.

Spřátelená funkce není dědičná. Proto, když základní třída obsahuje spřátelenou funkci, pak tato třída není spřátelena s odvozenou funkcí. Dále platí že spřátelená funkce může být spřátelena s více třídami.
flash\friend.swf
Flashová animace
Kliknutím na ikonu spustíte animaci.