Share via


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

Implicaciones de relaciones de confianza

Vea también

Referencia

friend (C++)