Funciones miembro de clase y clases como elementos friend
Las funciones miembro de clase se pueden declarar como de confianza en otras clases. Considere el ejemplo siguiente:
// 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
En el ejemplo anterior, solo se concede a la función A::Func1( B& ) acceso de confianza a la clase B. Por consiguiente, el acceso al miembro privado _b es correcto en Func1 de la clase A pero no en Func2.
Una clase friend es una clase todas cuyas funciones miembro con funciones de confianza de una clase, es decir, cuyas funciones miembro tienen acceso a los miembros privados y protegidos de la otra clase. Suponga que la declaración friend de la clase B hubiera sido:
friend class A;
En ese caso, a todas las funciones miembro de la clase A se les habría concedido acceso de confianza a la clase B. El código siguiente es un ejemplo de una clase de confianza:
// 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();
}
La confianza no es mutua a menos que se especifique explícitamente como tal. En el ejemplo anterior, las funciones miembro de YourClass no pueden tener acceso a los miembros privados de YourOtherClass.
Un tipo administrado no puede tener funciones, clases o interfaces de confianza.
La confianza no se hereda, lo que significa que las clases derivadas de YourOtherClass no pueden tener acceso a los miembros privados de YourClass. La confianza no es transitiva, por lo que las clases de confianza de YourOtherClass no pueden tener acceso a los miembros privados de YourClass.
La ilustración siguiente muestra cuatro declaraciones de clase: Base, Derived, aFriend y anotherFriend. Solo la clase aFriend tiene acceso directo a los miembros privados de Base (y a cualquier miembro Base que pueda haber heredado).
Implicaciones de relaciones de amistad