Funkce člena třídy a třídy jako Friends
Členské funkce třídy mohou být v jiných třídách deklarovány jako přátelské funkce.Příklad:
// classes_as_friends1.cpp
// compile with: /c
class B;
class A {
public:
int Func1( B& b );
private:
int Func2( B& b );
};
class B {
private:
int _b;
// A::Func1 is a friend function to class B
// so A::Func1 has access to all members of B
friend int A::Func1( B& );
};
int A::Func1( B& b ) { return b._b; } // OK
int A::Func2( B& b ) { return b._b; } // C2248
V předchozím příkladu, je do třídy B udělen přátelský přístup pouze funkci A::Func1( B& ).Proto je přístup k soukromému členu _b správný u Func1 třídy A , ale ne u Func2.
Třída friend je třída, jejíž členské funkce jsou přátelské funkce třídy, jejichž členské funkce mají přístup k soukromým a chráněným členům jiné třídy.Předpokládejme, že by deklarace friend v třídě B byla:
friend class A;
V takovém případě by všem členským funkcím třídy A byl udělen přátelský přístup k třídě B.Následující kód je příkladem přátelské třídy:
// classes_as_friends2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class YourClass {
friend class YourOtherClass; // Declare a friend class
public:
YourClass() : topSecret(0){}
void printMember() { cout << topSecret << endl; }
private:
int topSecret;
};
class YourOtherClass {
public:
void change( YourClass& yc, int x ){yc.topSecret = x;}
};
int main() {
YourClass yc1;
YourOtherClass yoc1;
yc1.printMember();
yoc1.change( yc1, 5 );
yc1.printMember();
}
Přátelství není vzájemné, pokud není výslovně uvedeno.V předchozím příkladu nemohou členské funkce YourClass získat přístup k soukromým členům YourOtherClass.
Spravovaný typ nemůže mít jakékoli přátelské funkce, přátelské třídy nebo přátelská rozhraní.
Přátelství není zděděno, což znamená, že třídy odvozené z YourOtherClass nemohou získat přístup k soukromým členům YourClass.Přátelství není přenosné, takže třídy, které jsou přátelé YourOtherClass nemohou získat přístup k soukromým členům YourClass.
Následující obrázek znázorňuje čtyři deklarace třídy: Base, Derived, aFriend a anotherFriend.Pouze třída aFriend má přímý přístup k soukromým členům Base (a ke všem členům, které byly zděděny Base).
Důsledky přátelské relace