Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Devolvcion por referencia o normalmente

Estas en el tema de Devolvcion por referencia o normalmente en el foro de C/C++ en Foros del Web. Hola cual de este tipo es mejor y porque? @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original //primer tipo int & function ( ) { return edad ...
  #1 (permalink)  
Antiguo 06/02/2014, 08:10
Avatar de patilanz  
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 4 meses
Puntos: 29
Devolvcion por referencia o normalmente

Hola cual de este tipo es mejor y porque?
Código C++:
Ver original
  1. //primer tipo
  2. int & function(){return edad;}
  3. //segundo tipo
  4. int function(){return edad;}
  5. //otros
  6. string & function(){return nombre;}
  7. string function(){return nombre;}

Son funciones miembro.

Saludos
  #2 (permalink)  
Antiguo 06/02/2014, 08:17
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Devolvcion por referencia o normalmente

Una critica a las funciones miembro que retornan referencias es que podrían exponer a miembros que son privados.

Al hacerlas referencias uno podria tambien usarlos al lado izquierdo de una asignacion asi:

objeto.function() = 3;

Si no son referencias, una expresion asi sería un error de compilacion
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 06/02/2014, 08:40
Avatar de patilanz  
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 4 meses
Puntos: 29
Respuesta: Devolvcion por referencia o normalmente

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
Una critica a las funciones miembro que retornan referencias es que podrían exponer a miembros que son privados.

Al hacerlas referencias uno podria tambien usarlos al lado izquierdo de una asignacion asi:

objeto.function() = 3;

Si no son referencias, una expresion asi sería un error de compilacion
Y la devuelvo como const int & ? Cual es la diferencia?
  #4 (permalink)  
Antiguo 06/02/2014, 08:52
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Devolvcion por referencia o normalmente

El compilador tratará lo retornado como const, chequeando cada vez para que no pueda utilizarse en lugares donde una const no es aceptada.

Esto no impide modificar usando lo retornado por ese metodo. Esta dejando la puerta abierta para hacerlo. Por ejemplo:

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class M {
  5.   int x;
  6. public:
  7.   M() : x(0) {}
  8.   const int& f() { return x; }
  9.   void printme() { cout << x << endl; }
  10. };
  11.  
  12. int main()
  13. {
  14.    M m;
  15.    m.printme();
  16.    // m.f() = 3;  // ERROR de compilacion
  17.    *((int *)&m.f()) = 3;
  18.    m.printme();
  19.    return 0;
  20. }
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 06/02/2014 a las 09:23
  #5 (permalink)  
Antiguo 06/02/2014, 11:12
Avatar de patilanz  
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 4 meses
Puntos: 29
Respuesta: Devolvcion por referencia o normalmente

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
El compilador tratará lo retornado como const, chequeando cada vez para que no pueda utilizarse en lugares donde una const no es aceptada.

Esto no impide modificar usando lo retornado por ese metodo. Esta dejando la puerta abierta para hacerlo. Por ejemplo:

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class M {
  5.   int x;
  6. public:
  7.   M() : x(0) {}
  8.   const int& f() { return x; }
  9.   void printme() { cout << x << endl; }
  10. };
  11.  
  12. int main()
  13. {
  14.    M m;
  15.    m.printme();
  16.    // m.f() = 3;  // ERROR de compilacion
  17.    *((int *)&m.f()) = 3;
  18.    m.printme();
  19.    return 0;
  20. }
Hola gracias por la respuesta pero no he entendido muy bien esto:
*((int *)&m.f()) = 3;

Convierte la la referencia constante en un puntero no constante ?

Ya que esto int * convierte la direccion de la referencia constante devuelta por la funcion miembro y luego esto que hace *(lo demas) ??
Creo que me he liado un poco con esta linea.

Saludos
  #6 (permalink)  
Antiguo 06/02/2014, 11:49
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Devolvcion por referencia o normalmente

El cast en C tiene mucha precedencia. Le dice al compilador las intenciones del programador.

De a poco:

&x -> direccion de memoria de x
(int *) expresion -> no importa lo que expresion sea, tratese como (int *) (adios const, si es que lo habia)
* puntero -> desreferenciacion de puntero

Código Para que quede como tabla ...:
Ver original
  1. m.f() -> const int &               -> la referencia
  2. &m.f() -> & ( const int & )        -> la direccion de memoria de ella
  3. (int*) &m.f() -> (int *)           -> tratese como int *
  4. * ( int * ) -> int                 -> desreferenciarlo
__________________
Visita mi perfil en LinkedIn
  #7 (permalink)  
Antiguo 06/02/2014, 13:56
Avatar de patilanz  
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 4 meses
Puntos: 29
Respuesta: Devolvcion por referencia o normalmente

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
El cast en C tiene mucha precedencia. Le dice al compilador las intenciones del programador.

De a poco:

&x -> direccion de memoria de x
(int *) expresion -> no importa lo que expresion sea, tratese como (int *) (adios const, si es que lo habia)
* puntero -> desreferenciacion de puntero

Código Para que quede como tabla ...:
Ver original
  1. m.f() -> const int &               -> la referencia
  2. &m.f() -> & ( const int & )        -> la direccion de memoria de ella
  3. (int*) &m.f() -> (int *)           -> tratese como int *
  4. * ( int * ) -> int                 -> desreferenciarlo
He entendido casi todo menos la ultima parte del desferenciarado para que quieres hacer el puntero nulo ?

Solo esta parte si no me equivoco devuelve un puntero int * : (int *)&m.f() ?

Sin el *()
Yo por desferenciar entiendo anular el puntero y si lo anulas y luego asignas el tres al puntero no tiene sentido ?
Creo que me equivoco ?
  #8 (permalink)  
Antiguo 06/02/2014, 14:06
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Devolvcion por referencia o normalmente

Los punteros guardan direcciones de memoria.
Desreferenciar es aplicarle el operador de desreferenciacion (el * ), ir a la direccion de memoria y leer o cambiar o lo que hay allí.

Desreferenciar no es hacerlo nulo.
__________________
Visita mi perfil en LinkedIn
  #9 (permalink)  
Antiguo 06/02/2014, 14:13
Avatar de patilanz  
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 4 meses
Puntos: 29
Respuesta: Devolvcion por referencia o normalmente

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
Los punteros guardan direcciones de memoria.
Desreferenciar es aplicarle el operador de desreferenciacion (el * ), ir a la direccion de memoria y leer o cambiar o lo que hay allí.

Desreferenciar no es hacerlo nulo.
si... ahora me acabo de dar cuenta esque no savia que se llama asi. Ahora entiendo totalmente el codigo.

Muchas gracias

Etiquetas: funcion, int, referencia, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:42.