• Miércoles 20 de Noviembre de 2024, 08:25

Autor Tema:  Dudas BASICAS con C++  (Leído 3416 veces)

Vndecid

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Dudas BASICAS con C++
« en: Sábado 22 de Enero de 2011, 20:26 »
0
Hola a todos tengos unas dudas con C++ que nadie me respondio hasta ahora( (amigos que sabian c++ pero que no me respondieron bien,mails a profesores que no me constestaron .... :hitcomp: ) y quisiera que me la respondan

1)Sobrecarga << y amigas
¿Por que para poder utilizar la sobrecarga de operadores << y << debo usar funciones amigas y no puedo usar algo como esto:

Código: C++
  1. ostream Objeto::operator << (Objeto const & cobjeto)
  2. {
  3.     ostream *salida;
  4.     *salida<<"Info: "<<cobjeto.inf<<" Info2: "<<cobjeto.inf<<endl;
  5.     return *salida;
  6. }
  7.  
  8.  
?

Se que las funciones amigas tienen un pleno "alcance" sobre las variables privadas de la clase pero por que DEBEN ser amigas
y no una funcion como cualquier otra?


2)Operator =
Objeto operator= (Objeto const &)

por que tengo que devolver un objeto Objeto si

Código: C++
  1. Objeto Objeto::operator =(Objeto const &objeto1)
  2. {
  3.     this->info=objeto1.info;
  4.     this->info2=objeto1.info2;
  5.  
  6.     return *this;
  7. }
  8.  
  9.  
estoy copiando la informacion en this ...?¿No deberia ir un void?
Nota:
    Note que si se realiza objeto1=obeto2 declarar void operator =(Objeto const &) es correcto pero no si lo que deseo hacer es objeto1=objeto2=objeto3
    en el ultimo caso funciona poniendo Objeto operator =(Objeto const &objeto1) pero no entiendo el por que de esto


3)Dudas con & operator

Código: C++
  1. friend ostream &operator << (ostream &,Objeto const &);
  2.  

Por que operator lleva un 'Et' adelante??
« última modificación: Lunes 24 de Enero de 2011, 14:58 por Vndecid »

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Dudas BASICAS con C++
« Respuesta #1 en: Lunes 24 de Enero de 2011, 06:39 »
0
Estas dudas se resuelven en un buen libro de C++ :).

  • Los operadores << y >> puedes sobrecargarlos como desees, tanto como funciones miembro como funciones globales que pueden declararse como amigas. Pero, para el caso del ejemplo que pones, en el que se trata de enviar datos a un ostream, si se sobrecargara el operador como función miembro, el primer operando debería ser un objeto o referencia a la clase de la cual es miembro el operador, y tendrías que escribir algo como esto:
    Código: Text
    1.  
    2. instanciaObjeto << cout
    3.  
    4.  
    en lugar del habitual:
    Código: Text
    1.  
    2. cout << instanciaObjeto
    3.  
    4.  
    Para poder escribir el segundo código (lo más "habitual" en C++), se usa una función no miembro porque el objeto no es el operando "más a la izquierda". Por otro lado, el ejemplo que pones de sobrecarga del operador << es incorrecto porque el parámetro debería ser un tipo ostream. Por último, estas funciones se hacen amigas por cuestión de rendimiento, es más rápido que puedan acceder de manera directa a las variables miembro de la clase que utilizar las funciones de acceso de dicha clase.
  • El operador = es binario, es decir, recibe dos operandos, por lo que para la operación
    objeto1 = objeto2 = objeto3
    el compilador ve esto:
    objeto1 = ( objeto2 = objeto3 )
    Si el operador = devolviera void la última operación resultaría en objeto1 = void.
  • Misma razón que el punto anterior, para que puedas "encadenar" instrucciones.
  • Es difícil adivinar. No sabemos si cadena contiene algo o no, si el problema es el operador + que no devuelve lo adecuado...
La imaginación es el límite.
Hardware & Software | Mexchip

Vndecid

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Dudas BASICAS con C++
« Respuesta #2 en: Lunes 24 de Enero de 2011, 10:54 »
0
Todavia no lei el mensaje ..te lo agradezco ...pero tambien le pregunto a mis profes pior un libro que no sea el Deitel & Deitel (que me aburre de sobremanera de c++) pero no me respondieron

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Dudas BASICAS con C++
« Respuesta #3 en: Lunes 24 de Enero de 2011, 11:39 »
0
Internet es mucho más que un libro... (http://www.learncpp.com/)

Vndecid

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Dudas BASICAS con C++
« Respuesta #4 en: Lunes 24 de Enero de 2011, 13:58 »
0
Entonces
1-Se hacen asi opr cuestion de rendimiento (y supongo yo de mayor entendimiento)
2-Excelente sospechaba que era algo asi
3-Entonces el & esta para que pase la direccion del ostream anterior es decir para poder hacer esto cout<<objeto<<objeto2
4-Lo borre por que creo que me anduvo .

Si estas cosas me las hubiesen explicado con anterioridad hubiese sido todo mucho mas facil

Vndecid

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Dudas BASICAS con C++
« Respuesta #5 en: Lunes 24 de Enero de 2011, 14:03 »
0
Cita de: "m0skit0"
Internet es mucho más que un libro... (http://www.learncpp.com/)

Saco una conclución mas antes de preguntar a profesores me parece que voy a tener que preguntar aca antes...

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Dudas BASICAS con C++
« Respuesta #6 en: Lunes 24 de Enero de 2011, 17:30 »
0
Cita de: "Vndecid"
1-Se hacen asi opr cuestion de rendimiento (y supongo yo de mayor entendimiento)
Que no sean funciones miembro es por cuestión de claridad o como mencionas, de  "entendimiento": para que puedan usarse con lo que estamos habituados, a poner el cout o el cin del lado izquierdo :).
Que sean funciones friend es por cuestión de rendimiento, para no "perder tiempo" en acceder a las variables privadas de la clase mediante funciones getVarible/obtenerVariable.

Cita de: "Vndecid"
Si estas cosas me las hubiesen explicado con anterioridad hubiese sido todo mucho mas facil
Recuerda, el autoaprendizaje es de las herramientas más valiosas en cualquier actividad, la escuela sirve para dar formalidad y buenas prácticas ;).
La imaginación es el límite.
Hardware & Software | Mexchip

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Dudas BASICAS con C++
« Respuesta #7 en: Lunes 24 de Enero de 2011, 19:10 »
0
Cita de: "Geo"
Recuerda, el autoaprendizaje es de las herramientas más valiosas en cualquier actividad, la escuela sirve para dar formalidad y buenas prácticas ;).

Amen hermano, has dicho una gran verdad.

Vndecid, esto no significa que debes desdeñar a tu maestros, ya que es imposible que sepan todo, (yo mismo sigo aprendiendo) aunque tampoco significa que debes quedarte solo con lo que te digan los maestros, un buen alumno investiga por su cuenta tambien, practica, y no deja de aprender.Recuerda esa frase que dice "El alumno debe superar al maestro".

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

Vndecid

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Dudas BASICAS con C++
« Respuesta #8 en: Lunes 24 de Enero de 2011, 20:09 »
0
Cita de: "ProfesorX"
Cita de: "Geo"

Vndecid, esto no significa que debes desdeñar a tu maestros, ya que es imposible que sepan todo

Saludos :)

Me pusieron  en (numero tendiendo al 31 de Diciembre) una nota que no merezco en un final por 1/5 de la materia , si tienen la picardia de desaprobarme , ..entonces que se banquen si pregunto. Que me contesten y que se dejen de j...  :argh:  ahora me encuentro en la situacion de estudiar algo asi en con ...33º7 en mis vacaciones, no es que no sepan , es que estan (creo yo) de vacaciones
« última modificación: Lunes 24 de Enero de 2011, 21:49 por Vndecid »

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Dudas BASICAS con C++
« Respuesta #9 en: Lunes 24 de Enero de 2011, 21:34 »
0
Respecto del punto 2:

A menos que exista una buena razón siempre debes devolver una referencia al objeto, en lugar de un objeto. De lo contrario cada vez que retorne esa función llamará al constructor copia, haciéndola muy ineficiente.

Código: C++
  1.  
  2. Objeto& Objeto::operator=(Objeto const &objeto1)
  3. {
  4.     this->info=objeto1.info;
  5.     this->info2=objeto1.info2;
  6.     return *this;
  7. }
  8.  
  9.  

También es importante el "const" del parámetro "objeto1". Es bastante útil para que el compilador sepa que nuestra intención es no modificar el estado del parámetro. Sin embargo tienes que tener cuidado de declarar constantes los métodos que no modifiquen el estado de un objeto. Esto se hace agregando a la declaración del método un const inmediatamente después del cierre de paréntesis de parámetros. En casos especiales, como cacheo de acceso a datos, si necesitas modificar alguna variable en un método constante tienes que declararla como "mutable".

Vndecid

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Dudas BASICAS con C++
« Respuesta #10 en: Lunes 24 de Enero de 2011, 21:53 »
0
Cita de: "Amilius"
Respecto del punto 2:

A menos que exista una buena razón siempre debes devolver una referencia al objeto, en lugar de un objeto. De lo contrario cada vez que retorne esa función llamará al constructor copia, haciéndola muy ineficiente.

Código: C++
  1.  
  2. Objeto& Objeto::operator=(Objeto const &objeto1)
  3. {
  4.     this->info=objeto1.info;
  5.     this->info2=objeto1.info2;
  6.     return *this;
  7. }
  8.  
  9.  

También es importante el "const" del parámetro "objeto1". Es bastante útil para que el compilador sepa que nuestra intención es no modificar el estado del parámetro. Sin embargo tienes que tener cuidado de declarar constantes los métodos que no modifiquen el estado de un objeto. Esto se hace agregando a la declaración del método un const inmediatamente después del cierre de paréntesis de parámetros. En casos especiales, como cacheo de acceso a datos, si necesitas modificar alguna variable en un método constante tienes que declararla como "mutable".


Gracias Amillus  yo lo hacia con el this pero tenia la duda...Aunque te digo que no entendi mucho lo del const al final..vos me queres decir que en un metodo en el cual no se modifica ningun objeto tengo que poner un const al final de la declaracion (esto aparecio en mi final y todos estabamos  :wacko: