Функции членов классов и классы как дружественные элементы
Функции-члены класса могут быть объявлены в других классах как дружественные. Рассмотрим следующий пример:
// 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
В предыдущем примере дружественный доступ к классу B предоставляется только функции A::Func1( B& ). Поэтому доступ к закрытому члену _b допускается только в функции Func1 класса A , но не в функции Func2.
Класс friend — это класс, все функций-члены которого являются дружественными функциями класса, то есть функции-члены которого имеют доступ к закрытым и защищенным членам другого класса. Предположим, что в классе B было следующее объявление friend:
friend class A;
В этом случае все функции-члены из класса A имели бы дружественный доступ к классу B. В следующем коде приведен пример дружественного класса.
// 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();
}
Дружественные отношения не являются взаимными, если это не указано явным образом. В предыдущем примере функции-члены класса YourClass не имеют доступа к закрытым членам класса YourOtherClass.
Управляемый тип не может иметь дружественные функции, классы и интерфейсы.
Дружественные отношения не наследуются; это означает, что классы, производные от YourOtherClass, не могут обращаться к закрытым членам класса YourClass. Дружественные отношения не являются переходящими, поэтому классы, дружественные классу YourOtherClass, не могут обращаться к закрытым членам класса YourClass.
На следующем рисунке показаны объявления 4 классов: Base, Derived, aFriend и anotherFriend. Только класс aFriend имеет прямой доступ к закрытым членам класса Base (и к любым возможным унаследованным членам класса Base).
Следствия дружественных отношений