El documento explica las funciones amigas en C++. Las funciones amigas no son miembros de una clase pero pueden acceder a sus miembros privados. Para declarar una función amiga se usa la palabra clave "friend" antes del prototipo de la función. Se proveen varios ejemplos de uso de funciones amigas para acceder a datos privados de una clase desde funciones externas.
1. UNIVERSIDAD NACIONAL DE INGENIERIA FACULTAD DE INGENIERIA MECANICA COMPUTACION II MB_544 Tema: FUNCIONES AMIGAS Ing. Daniel Osorio Maldonado
2.
3.
4. Para declarar una función amiga simplemente se antepone la palabra friend al prototipo de la función. Sintaxis: class nombre_clase { friend funcion_amiga ( ); { (sentencias ) } // Considere el siguiente ejemplo #include<iostream.h> #include<conio.h> #include<iomanip.h> #include<stdlib.h> class CLASS{ private: int a; int b; public: CLASS(int i,int j)//constructor {a=i;b=j;}
5. friend int sumaCLASS(CLASS X) //funcion Amiga {return X.a + X.b; } friend int restaCLASS(CLASS X) { return X.a - X.b; } friend int divisionCLASS(CLASS X){ if(X.b) //verifica si es cierto que ´b´no es cero return X.a % X.b; else{ cout<<"No Hay division por cero"; exit(0);} } };
6. main(){ int m,n; cout<<"Ingrese el valor de a:";cin>>m; cout<<"Ingrese el valor de b:";cin>>n; CLASS X(m,n); cout<<setw(5);//Establece un ancho de 5 int X1=sumaCLASS(X);//Legal int X2=restaCLASS(X);//Legal int X3=divisionCLASS(X);//ILegal cout<<"La suma es: "<<X1<<setw(3)<<endl <<"La resta es: "<<X2<<setw(3)<<endl <<"El resto es:"<<X3<<setw(3); // <<"EL producto es: "<<X3<<setw(3); getch(); }
7. /* El siguiente programa permitirá tener una idea concreta de la forma como se aplica una funcion amiga */ #include<iostream.h> #include<conio.h> #include<iomanip.h> #include<stdlib.h> class myclass{ private: int n,d; public: myclass(int i,int j){ n=i;d=j;} friend int isfactor(myclass ob); };
8. “ Aquí está la definición de la función amiga. Devuelve verdadero si d es un factor de n. Observe que en la definición de isfactor( ) no se utiliza la palabra clave friend” int isfactor(myclass ob){ if(!(ob.n%ob.d)) return 1; else return 0; }
9. main() { myclass ob1(10,2),ob2(13,3); if(isfactor(ob1)) cout<<"2 es un factor de 10 "; else cout<<"2 no es un factor de 10 "; if(isfactor(ob2)) cout<<"3 es un factor de 13 "; else cout<<"3 no es un factor de 13 "; getch(); }
10. #include <iostream.h> #include <conio.h> class dat{ int dato; public: friend void cargar(dat & , int x); void visualizar(); }; void dat::visualizar(){ cout<<" El Valor Visualizado es: "; cout<<dato; }
11. void cargar(dat &t, int x) // pasa un objeto de tipo dat {t.dato=x;} imain() { int w; dat t; cout<<"Ingrese el Valor del dato t= : ";cin>>w; cargar(t, w); t.visualizar(); getch(); }
12. /* Uso de la funcion amiga en una serie con factorial */ #include<iostream.h> #include<conio.h> class SFa{ private: int i,N; float S; public: SFa(int x); friend long Facto(SFa Z) {if(Z.N==1) return(1); else return(Z.N*(Facto(Z.N-1))); }
13. float Suma(int N); //void Show(int N); }; SFa::SFa(int x) {N=x;} float SFa::Suma(int N){ S=0; for(i=1;i<=N;i++) S=S+i*1.0/Facto(i); return(S); } //void SFa::Show(int N) //{cout<<S;} // Pruebe ud con show y haga las modificaciones del caso
14. main() { int M; cout<<"Ingrese el numero de términos:"; cin>>M; SFa SF(M); cout<<"La suma es "<<SF.Suma(M); getch(); }
15. // Se trata de saber cual es mas rápido o un tractor o un coche #include<iostream.h> #include<conio.h> class tractor ; class car { int possengers; int speed; public: car(int p , int s) { possengers=p; speed=s; } friend int sp_greater(car c ,tractor t); } ;
16. int sp_greater(car c , tractor t) { return (c.speed-t.speed); } main() { int t ; car c1(6,55),c2(2,120); tractor t1(10000,55),t2(20000,72); cout<<"comparando c1 y t1 :"; t=sp.greater(c1,t1); if (t<0) cout<<"el tractor es mas rapido "; else
17. if (t==0) cout<<"la velocidad del tractor y del coche son iguales" ; else cout<<"el coche es mas rapido "; cout<<"comparando c2 y t2 "; t=sp_greater(c2,t2); if(t<0) cout<<"el tractor es mas rapido "; else if(t==0) cout<<"la velocidad del coche y del tractor es la misma"; else cout<<"el coche es mas rapido "; getch(); }
18. //Una aplicación con Números complejos simple #include<iostream.h> #include<conio.h> #include<conio.h> class complejo{ float real; float imag; public: complejo(float a,float b); void show(); friend void suma(complejo x,complejo y, complejo &z); }; complejo::complejo(float a,float b) { real =a; imag=b; } void complejo::show(){ cout<<real<<" + "<<imag<<"i"; }
19. void suma(complejo x,complejo y,complejo &z) {z.real=x.real+y.real; z.imag=x.imag+y.imag; } main(){ complejo x(1.0,2.0); complejo y(2.0,1.0); complejo z(0,0); cout<<"Suma de : "; x.show(); cout<<" ="; y.show(); cout<<" ="; suma(x,y,z); z.show(); getch(); /*Realice las modificaciones para valores no constantes y para valores aleatorios*/