Sobrecarga De Operadores
Enviado por teo123 • 19 de Octubre de 2012 • 2.119 Palabras (9 Páginas) • 419 Visitas
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 están las funciones amigas. Son útiles para la sobrecarga de operadores y la creación de ciertos tipos de funciones E/S.
El prototipo de esta funciones viene precedido por la palabra clave friend, cuando se desarrolla la función no es necesario incluir friend. Una función amiga no es miembro y no se puede calificar mediante un nombre de objeto. Estas funciones no se heredan y pueden ser amigas de más de una clase.
PROTOTIPO:
friend tipo_devuelto nombre(parametros);
DESARROLLO:
tipo_devuelto nombre(parametros){
cuerpo;
}
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
class miclase{
int n,d;
public:
miclase(int i, int j)
{
n=i;d=j;
}
friend int factor(miclase ob);
};
int factor(miclase ob)
{
if (!(ob.n%ob.d))
return 1;
else
return 0;
}
void main()
{
miclase obj1(10,2), obj2(3,2);
if(factor(obj2))
cout << "es factor";
else
cout << "no es factor";
getch();
}
Sobre Carga de Operadores
En programación, un operador sobrecargado es un caso específico de polimorfismo en donde algunos o todos los operadores (como +, =, o ==) tienen diferentes implementaciones dependiendo del contexto en que se usen (o sea, depende del tipo de dato de sus argumentos).
#include<stdio.h>
#include<iostream.h>
class binario{
float x;
public:
binario(){x=0.0;}
binario(float a){x=a;}
binario operator+(binario);
void visualizar(){cout<<"la suma es: " <<x<<"\n";}
};
binario binario::operator+(binario a)
{
return x+a.x;
}
main()
{
float s,y,z,ss;
cout<<"Introdusca el valor 1:";
cin>>s;
cout<<"Introdusca el valor 2:";
cin>>y;
cout<<"Introdusca el valor 1:";
cin>>z;
cout<<"Introdusca el valor 1:";
cin>>ss;
binario primero=s,segundo=y,tercero=z,cuarto=ss,a;
a=cuarto+tercero+primero + segundo;
a.visualizar();
return 0;}
#include <iostream.h>
class caja
{
int longitud;
int ancho;
public:
void coloca(int l, int w) {longitud = l; ancho = w;}
int obtiene_area(void) {return longitud * ancho;}
friend caja operator+(caja a, caja b); // Suma dos cajas
friend caja operator+(int a, caja b); // Suma una constante a una caja
friend caja operator*(int a, caja b); // Multiplica caja por una constante
};
caja operator+(caja a, caja b) // Suma el ancho de dos cajas
{
caja temp;
temp.longitud = a.longitud;
temp.ancho = a.ancho + b.ancho;
return temp;
}
caja operator+(int a, caja b) // Suma una constante a caja
{
caja temp;
temp.longitud = b.longitud;
temp.ancho = a + b.ancho;
return temp;
}
caja operator*(int a, caja b) // Multiplica caja por una constante
{
caja temp;
temp.longitud = a * b.longitud;
temp.ancho = a * b.ancho;
return temp;
}
int main()
{
caja chica, mediana, grande;
caja temp;
chica.coloca(2, 4);
mediana.coloca(5, 6);
grande.coloca(8, 10);
cout << "El area es " << chica.obtiene_area() << "\n";
cout << "El area es " << mediana.obtiene_area() << "\n";
cout << "El area es " << grande.obtiene_area() << "\n";
temp = chica + mediana;
cout << "La nueva area es " << temp.obtiene_area() << "\n";
temp = 10 + chica;
cout << "La nueva area es " << temp.obtiene_area() << "\n";
temp = 4 * grande;
cout << "La nueva area es " << temp.obtiene_area() << "\n";
return 0;
}
En este caso sobrecargamos los operadores de + y * con las declaraciones en las líneas 10 a la 12, y en las definiciones en las líneas 15 a la 37. Los métodos están declarados como funciones friend por lo que podemos utilizar la función de doble parámetro como está indicado. Si no utilizamos la construcción friend la función sería parte de uno de los objetos y tal objeto sería el receptor del mensaje. Incluyendo la construcción friend nos permite separar éste método del objeto y llamar al método con una notación fija, utilizando ésta técnica puede escribirse como objeto1 + objeto2 en lugar de objeto1.operador+(objeto2). Además sin la construcción friend no podríamos utilizar una sobrecarga con una variable de tipo int para el primer parámetro porque no podemos enviar un mensaje a una variable de tipoint como en int.operador+(objeto). Dos de los tres operadores sobrecargados usan un int para el primer parámetro por lo que es necesario declararlos como funciones friend. No existe un límite superior en el número de sobrecargas para un operador dado, cualquier número de sobrecargas puede utilizarse siempre y cuando los parámetros sean diferentes para cada sobrecarga particular.
El encabezado en la línea 15 ilustra la primera sobrecarga donde el operador + es sobrecargado dando el tipo retornado seguido por la palabra clave operator y el operador que deseamos sobregargar. Los dos parámetros formales y sus respectivos tipos son listados en paréntesis y las operaciones normales son dadas en la implementación de la función en las líneas 17 a la 20. El estudiante observador notará que la implementación de las funciones friend no son parte de la clase porque el nombre de la clase no está antes del nombre del método en la línea 15.
La mayor diferencia la encontramos
...