• Domingo 28 de Abril de 2024, 21:34

Autor Tema:  Sobrecarga De Operadores  (Leído 1010 veces)

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Sobrecarga De Operadores
« en: Jueves 21 de Junio de 2007, 14:56 »
0
Hola, estoy buscando un texto que explique bien la sobrecarga de operadores en C++, no me quedan claras algunas cosas todavia referidas. Por ej no se cuando tienen que ser declarados como friend y cuando no. Ademas de la sobrecarga de los flujos de i/o. Lo que me quedo en duda es que lei por ahi que el compilador los interpreta como de funciones se tratase.
Alguien me puedo aclarar estas dudas?

Por ej este codigo:

Código: Text
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct complejo {
  5.    float a,b;
  6. };
  7.  
  8. /* Prototipo del operador + para complejos */
  9. complejo operator +(complejo a, complejo b);
  10.  
  11. int main() {
  12.    complejo x = {10,32};
  13.    complejo y = {21,12};
  14.  
  15.    complejo z;
  16.    /* Uso del operador sobrecargado + con complejos */
  17.    z = x + y;
  18.    cout << z.a << "," << z.b << endl;
  19.   
  20.    cin.get();
  21.    return 0;
  22. }
  23.  
  24. /* Definición del operador + para complejos */
  25. complejo operator +(complejo a, complejo b)  {
  26.    complejo temp = {a.a+b.a, a.b+b.b};
  27.    return temp;
  28. }
  29.  

Aclara que puede ser usado en su notacion funcional, de la sig manera:

Código: Text
  1. z = operator+(x,y);
  2.  

Este otro ejemplo:

Código: Text
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Tiempo {
  5.   public:
  6.    Tiempo(int h=0, int m=0) : hora(h), minuto(m) {}
  7.    
  8.    void Mostrar();
  9.    Tiempo operator+(Tiempo h);
  10.        
  11.   private:
  12.    int hora;
  13.    int minuto;
  14. };
  15.  
  16. Tiempo Tiempo::operator+(Tiempo h) {
  17.    Tiempo temp;
  18.    
  19.    temp.minuto = minuto + h.minuto;
  20.    temp.hora   = hora   + h.hora;
  21.    
  22.    if(temp.minuto >= 60) {
  23.       temp.minuto -= 60;
  24.       temp.hora++;
  25.    }
  26.    return temp;
  27. }
  28.  
  29. void Tiempo::Mostrar() {
  30.    cout << hora << ":" << minuto << endl;
  31. }
  32.  
  33. int main() {
  34.    Tiempo Ahora(12,24), T1(4,45);
  35.    
  36.    T1 = Ahora + T1;   // (1)
  37.    T1.Mostrar();
  38.    
  39.    (Ahora + Tiempo(4,45)).Mostrar(); // (2)
  40.    
  41.    cin.get();
  42.    return 0;
  43. }
  44.  
Que pasa si yo declaro al operador como friend?

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Sobrecarga De Operadores
« Respuesta #1 en: Jueves 21 de Junio de 2007, 22:47 »
0
los Operadores sobrecargados son funciones que usan un operador para su llamado, si tu declaras una función friend quiere decir que tienes acceso a los datos miembros de la clase.

Citar
Código: Text
  1.  
  2. z = operator+(x,y);
  3.  
  4.  

solo eso, puedes llamarlo tanto

Código: Text
  1.  
  2. z = a + b;
  3.  
  4. o
  5.  
  6. z operator+(a,b);
  7.  
  8.  


http://codigomaldito.blogspot.com/2005/12/...nes-friend.html

es una página donde tienen una buena explicación al respecto.
Inside the code

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Sobrecarga De Operadores
« Respuesta #2 en: Viernes 22 de Junio de 2007, 00:32 »
0
y como seria llamarlo en forma fucional a los operadores << y >> ?

por ej:

Código: Text
  1.  
  2. class punto
  3. {
  4. int x,y;
  5. public:punto() {x=y=0;}
  6. punto (int xx,int yy) { x=xx;y=yy;}
  7. void fijarx(int xx) { x=xx;}
  8. void fijary(int yy) {y=yy;}
  9. int leerx() {return x;}
  10. int leery() {return y;}
  11. friend ostream& operator &#60;&#60; (ostream& os,const punto &p);
  12. friend istream& operator &#62;&#62; (istream& is,const punto &p);
  13. };
  14. void main()
  15. {
  16. punto p;
  17. cout&#60;&#60;p&#60;&#60;endl;
  18. p.fijarx(50);
  19. p.fijary(100);
  20. cout&#60;&#60;p&#60;&#60;endl;
  21. cout &#60;&#60;&#34;introducir los valores de x e y&#092;n&#34;;
  22. cin&#62;&#62;p;
  23. cout&#60;&#60;&#34;se ha introducido&#34;&#60;&#60;p;
  24. }
  25. ostream& operator&#60;&#60;(ostream &os,punto &p)
  26. {
  27. os &#60;&#60;&#34;x= &#34;&#60;&#60;p.x&#60;&#60;&#34;,y= &#34;&#60;&#60;p.y;
  28. return os;
  29. }
  30. istream& operator&#62;&#62;(istream &is,punto &p)
  31. {
  32. is &#62;&#62;p.x&#62;&#62;p.y;
  33. return is;
  34. }
  35.