Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: dasavi en Mayo 06, 2013, 08:01:12 am

Título: [SOLUCIONADO] Clases c++
Publicado por: dasavi en Mayo 06, 2013, 08:01:12 am
Muy buenas de nuevo chicos, a ver si consigo aportar mas en lugar de preguntar tanto :S jaja pero bueno :)
Tengo algunos problemas ahora con clases, mas concretamente con los constructores de copia y sobrecargar los operadores... el profesor nos ha dicho que hagamos acto de fe de lo que dice... pero asi como que no me entero de nada :S ¿Me podría echar alguien una mano?
PD si necesitan mas informacion de lo que estoy pidiendo decidmelo :)
Gracias por todo :)
Título: Re:Clases c++
Publicado por: Prow en Mayo 06, 2013, 08:30:28 am
Aqui tienes bastante información sobre ambos casos:

http://c.conclase.net/curso/?cap=029
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Sobrecarga_de_Operadores
Título: Re:Clases c++
Publicado por: samuellopz en Mayo 23, 2013, 07:25:46 pm
Buenas dasavi como yo también soy estudiante (ing.informática), sé que cuesta bastante asimilar lo de la sobrecarga de operadores. Te lo intento explicar un poco por encima por si puedo aclararte un poco las cosas aunque quizás llegue tarde la respuesta. Sobrecargar un operador es solamente decirle a la máquina como realizar ciertas operaciones (se pueden sobrecargar todos los operadores excepto ::). La sintaxis es:
   tipodevuelto nombre_clase::operator#(argumentos) {
      operaciones
        } //donde # es el operador sobrecargado

la sobrecarga se puede aplicar a dos objetos o a un objeto junto con una variable de otro tipo
para llamar a la función basta con poner tipo1#tipo2, donde el operando izquierdo se pasa implícitamente (se podría decir que es como si fuese una variable interna de la función) y el operando derecho se pasa como argumento (también hay operandos unarios, que no tienen parámetros y su llamada es tipo#), pero si quieres guardar lo que devuelva la función en otra variable hay que poner tipo(int,char,objeto..)=tipo1#tipo2

Te pongo un ejemplo:
imaginate una clase llamada coche en la que se guarde la potencia del motor, numero de puertas..

Código: [Seleccionar]
class coche{
      int potencia;
      int puertas;
      ...
      public:
              coche operator+(coche c);
              bool operator>(); //sobrecarga unaria
              ...
              }

si quieres sumar dos objetos (coches) la máquina no sabe como hacerlo, entonces por eso se sobrecarga el operador +, es decir, programar la máquina para que cuando pongamos a sumar dos coches nos sume las potencias por un lado y las puertas por otro, esto se hace con la primera función, la segunda sirve para ver si la potencia de un coche es mayor que 200

Código: [Seleccionar]
coche coche::operator+(coche c){ //para llamar a la función coche3=coche1+coche2;
      coche nuevo;
      nuevo.potencia=potencia+c.potencia; //potencia pertenece al coche pasado por la izquierda del operador (coche1)
      nuevo.puertas=puertas+c.puertas;
      return nuevo;
      }
     
bool coche::operator>(){ //para llamar a la función boleano=coche_aux>;
     if (potencia>200) return true; //potencia es una variable de coche_aux
     }

el tipo devuelto puede ser cualquiera (int, char...) como puedes observar en el código anterior

espero que si tenias alguna duda esto te sirva, porque hasta que a mí no me lo explicaron así no conseguí entender este tema al 100%
Título: Re:Clases c++
Publicado por: ravenheart en Mayo 23, 2013, 08:51:37 pm
Hum... Buena respuesta, aunque la veo algo enrevesada.

En realidad el concepto de sobrecarga es muy sencillo. Consiste en que el mismo nombre se utiliza para diferentes cosas.

Generalmente al hablar de sobrecarga, se hace referencia a funciones, y cuando se habla de funciones, la sobrecarga consiste simplemente en definir varias funciones con el mismo nombre y diferentes parámetros.

Por ejemplo, si tenemos:

Código: [Seleccionar]
struct Punto {int x; int y; };
struct Circulo {Punto centro; int radio; };
struct Cuadrado {int x; int y; int lado; };
struct Rectangulo {int x; int y; int base; int altura; };

Y tenemos una clase Pantalla, podemos declarar varios métodos con el mismo nombre para dibujar las distintas figuras:

Código: [Seleccionar]
class Pantalla
{
    ...
    void Dibujar(Punto p);
    void Dibujar(Circulo c);
    void Dibujar(Cuadrado c);
    void Dibujar(Rectangulo r);
    ...
}

En ese caso el método Dibujar está sobrecargado.
La sobrecarga de operadores consiste simplemente en aplicar esta ideas a los operadores predefinidos en el lenguaje: +, *, /, ==, <=, etc, que por defecto sólo funcionan con los tipos básicos (int, char, double...), para poder usarlos en otras clases, como ya está explicado en el mensaje anterior :)
Título: Re:Clases c++
Publicado por: dasavi en Junio 03, 2013, 10:34:28 pm
Muchisimas gracias a los dos , perdon por no contestar antes pero estoy de examenes y cojo poco el pc, suena ironico estando en informatica pero bueno xDD gracias a todos!
Título: Re:Clases c++
Publicado por: ravenheart en Junio 04, 2013, 07:19:18 am
Por cierto, el ejemplo del coche es un poco absurdo, pero sí que es práctico, por ejemplo, para definir una clase Matriz e implementar la suma de matrices de modo que se pueda hacer:

Matriz m1 = Matriz(1,2,3,4,5,6,7,8,9);
Matriz m2 = Matriz(9,8,7,6,5,4,3,2,1);
Matriz m3 = m1 + m2;