Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Funciones Amigas.137145524 PDF
Funciones Amigas.137145524 PDF
Amigas en C++
Dr. Oldemar Rodríguez Rojas
Escuela de Informática
Universidad de Nacional
INTRODUCCIÓN A LAS
FUNCIONES AMIGAS
Habrá momentos en los que se quiera que una
función tenga acceso a los miembros privados
de una clase sin que esa función sea realmente
un miembro de esa clase.
De cara a esto, C++ soporta las funciones
amigas. Una función 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
creación de ciertos tipos de funciones de E/S.
Una tercera razón para las funciones amigas es que
habrá momentos en los que una función tenga acceso a
los miembros privados de dos o más clases diferentes.
Este uso es el que se examina aquí. Una función amiga
se define como una función no miembro normal. Sin
embargo, dentro de la declaración de clase para la que
será una función amiga, está también incluido su
prototipo, precedido por la palabra clave friend.
Para entender cómo 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 función 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 función constructora y
la función amiga isfactor() dentro de su declaración de
clase. Debido a que isfactor() es una función 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>