Escolar Documentos
Profissional Documentos
Cultura Documentos
Amigas en C++
Dr. Oldemar Rodrguez Rojas
Escuela de Informtica
Universidad de Nacional
INTRODUCCIN A LAS
FUNCIONES AMIGAS
Habr momentos en los que se quiera que una
funcin tenga acceso a los miembros privados
de una clase sin que esa funcin sea realmente
un miembro de esa clase.
De cara a esto, C++ soporta las funciones
amigas. Una funcin amiga no es un miembro
de una clase, pero tiene acceso a sus
elementos privados.
Para qu sirven las funciones amigas?
Dos motivos por los que las funciones amigas son tiles
tienen que ver con la sobrecarga de operadores y la
creacin de ciertos tipos de funciones de E/S.
Una tercera razn para las funciones amigas es que
habr momentos en los que una funcin tenga acceso a
los miembros privados de dos o ms clases diferentes.
Este uso es el que se examina aqu. Una funcin amiga
se define como una funcin no miembro normal. Sin
embargo, dentro de la declaracin de clase para la que
ser una funcin amiga, est tambin incluido su
prototipo, precedido por la palabra clave friend.
Para entender cmo funciona, examine este breve
programa:
#include <iostream.h> int main() {
#include <conio.h> myclass ob1(10,2),ob2(13,3);
if(isfactor(ob1))
cout << "2 es un factor de 10\n";
class myclass {
else
int n, d;
cout << "2 no es un factor de
public: 10\n";
myclass(int i,int j) {n=i;d=j;} if(isfactor(ob2))
// declara una funcin amiga de cout << "3 es un factor de 13\n";
myclass else
friend int isfactor(myclass ob); cout << "3 no es un factor de
13\n";
};
char ch=getch();
return 0;
int isfactor(myclass ob) { }
if(!(ob.n % ob.d))
return 1;
else
return 0;
}
En este ejemplo, myclass declara su funcin constructora y
la funcin amiga isfactor() dentro de su declaracin de
clase. Debido a que isfactor() es una funcin amiga de
myclass, isfactor() tiene acceso a sus reas privadas. Esto
es por lo que dentro de isfactor(), es posible referirse
directamente a ob.n y ob.d.
class car {
int passengers;
int speed;
public:
car(int p,int s) {passengers=p;speed=s;}
friend int sp_greater(car c, truck t);
};
class truck {
int weight;
int speed;
public:
truck(int w,int s) {weight=w;speed=s;}
friend int sp_greater(car c, truck t);
};
class car {
int passengers;
int speed;
public:
car(int p,int s) {passengers=p;speed=s;}
int sp_greater(truck t);
};
class truck {
int weight;
int speed;
public:
truck(int w,int s) {weight=w;speed=s;}
friend int car::sp_greater(truck t);
};
int car::sp_greater(truck t) {
return speed - t.speed;
}
int main() {
int t;
car c1(6,55),c2(2,130);
truck t1(10000,55), t2(20000,72);
class Amigable {
private:
int secreto;
friend void FuncionAmiga(Amigable& o);
friend class Amiga;
};
class Amiga {
public:
void mirar(Amigable& o) {
o.secreto = 120;
cout << o.secreto << endl;
}
};
void FuncionAmiga(Amigable& o) {
o.secreto = 121;
cout << o.secreto << endl;
}
// Programa principal
int main() {
Amiga amiga;
Amigable amigable;
amiga.mirar(amigable);
FuncionAmiga(amigable);
system("pause");
system("cls");
return 0;
}
<Ver Ej1.CPP>