elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Duda] Retorno de referencias.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Duda] Retorno de referencias.  (Leído 1,574 veces)
Zodiak98

Desconectado Desconectado

Mensajes: 120


Ver Perfil
[Duda] Retorno de referencias.
« en: 30 Septiembre 2013, 18:11 pm »

Hola bueno es que me puse a leer un tema sobre sobrecarga de operadores y me tope con una parte que decía "También podemos hacer retornos de referencias con flujos streams" me puse a buscar y encontré un ejemplo cómo este:
Código
  1. int& max (int a, int b) {
  2.  if (a >= b) return a;
  3.  return b;
  4. }
  5.  
Claro que esta es una función cualquiera que retorna una referencia a int.
Alguien podría explicarme cómo funciona el retorno por referencias y de que serviría? :)


« Última modificación: 30 Septiembre 2013, 18:13 pm por Zodiak98 » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: [Duda] Retorno de referencias.
« Respuesta #1 en: 30 Septiembre 2013, 20:20 pm »

El caso que has expuesto es hasta peligroso.

Cuando una función recibe un parámetro como referencia puedes modificar el valor de la variable referenciada desde la propia función... cuando retornas una referencia permites que desde fuera de la función se modifique el valor de la variable almacenada en la función o en la clase.

Código
  1.  
  2. class A
  3. {
  4.  int valor;
  5.  
  6.  public:
  7.    A( ) : valor( 0 ) { }
  8.  
  9.    int& Valor( )
  10.    { return valor; }
  11. };
  12.  
  13. void main( )
  14. {
  15.  A clase;
  16.  
  17.  cout << clase.Valor( ) << std::endl; // imprime 0
  18.  clase.Valor( ) = 4;
  19.  cout << clase.Valor( ) << std::endl; // imprime 4
  20. }

En el ejemplo que tú has puesto, tanto a como b se pasan por valor, es decir, se crean dos int dentro de la función y se les asignan los valores que se pasen como parámetros. El problema es que estas dos variables creadas dentro de la función solo existen durante la ejecución de la función... una vez que se produce un return las dos variables ya no son válidas en memoria... te puedes imaginar que intentar un acceso al valor retornado ( o una modificación de su valor ) puede desembocar en un fallo de la aplicación.

Un ejemplo que no debería dar problemas podría ser este:

Código
  1. int& max( int& a, int& b )
  2. {
  3.  if ( a >= b ) return a;
  4.  return b;
  5. }

En este caso estás pasando los dos parámetros por referencia, luego el return devolverá una de esas dos referencias y, claro, una vez fuera de la función las variables a y b originales seguirán existiendo.

Personalmente pasar por referencia tipos básicos, salvo que se requiera su modificación dentro de una función, es un poco una tontería. Cuando tu declaras una referencia, se crea un puntero implícito... el acceso a un puntero es más lento que el acceso a una variable por valor... y al programa le cuesta lo mismo copiar una variable de un tipo básico que copiar una dirección en memoria. Total, no se gana nada.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Referencias
Programación Visual Basic
Sancho.Mazorka 2 2,705 Último mensaje 1 Enero 2007, 08:35 am
por Sancho.Mazorka
duda y pregunta sobre ESDLA el retorno del rey
Juegos y Consolas
deopoldo 7 4,396 Último mensaje 21 Diciembre 2008, 15:17 pm
por deopoldo
Duda sobre referencias sobre mi tesis
Dudas Generales
jdc 3 5,482 Último mensaje 3 Mayo 2011, 23:39 pm
por jdc
[Duda] Valor de retorno main
Programación C/C++
apoeti 3 3,412 Último mensaje 12 Septiembre 2012, 16:16 pm
por apoeti
Duda punteros y referencias c++
Programación C/C++
Mozzard 2 1,534 Último mensaje 23 Enero 2019, 22:41 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines