Compartir a través de


Funciones y clases de miembro de clase como Amigos

Las funciones miembro de clase se pueden declarar como amigos 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, pero la función A::Func1( B& ) se concede acceso de confianza a la clase B.Por consiguiente, el acceso al miembro privado _b es correcto en Func1de la clase Apero no en Func2.

Una clase de friend es una clase toda cuyo de miembro las funciones son funciones de una clase, es decir, cuyas funciones friend miembro tienen acceso a los demás miembros privados y protegidos de la clase.Supongamos que había sido la declaración de friend en la clase B :

friend class A;

En ese caso, todas las funciones miembro de la clase A pudieran estar concederá 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 o no es mutua a menos que explícitamente está especificada 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 ninguna funciones friend, clases de confianza, o interfaz friend.

La o no se hereda, lo que significa que las clases derivadas de YourOtherClass no pueden tener acceso a los miembros privados de los entity_YourClass.La o no es transitiva, por lo que las clases que los amigos de YourOtherClass no pueden tener acceso a los miembros privados de los entity_YourClass.

La ilustración siguiente muestra cuatro declaraciones de clase: Base, Derived, aFriend, y anotherFriend.Sólo la clase aFriend tiene acceso directo a los miembros privados de Base (y a cualquier miembro Base haya heredado).

Implicaciones de confianza Relación

Gráfico de implicaciones de relación de confianza

Vea también

Referencia

confianza (C++)