2011-12-20 25 views
37

Possible Duplicate:
What are the differences between pointer variable and reference variable in C++?
Are there benefits of passing by pointer over passing by reference in C++?paso por el puntero y Pasar por referencia

En ambos casos, que logra el resultado. Entonces, ¿cuándo se prefiere uno sobre el otro? ¿Cuáles son las razones por las que usamos una sobre la otra?

#include <iostream> 
using namespace std; 
void swap(int* x, int* y) 
{ 
    int z = *x; 
    *x=*y; 
    *y=z; 
} 
void swap(int& x, int& y) 
{ 
    int z = x; 
    x=y; 
    y=z; 
} 

int main() 
{ 
    int a = 45; 
    int b = 35; 
    cout<<"Before Swap\n"; 
    cout<<"a="<<a<<" b="<<b<<"\n"; 

    swap(&a,&b); 
    cout<<"After Swap with pass by pointer\n"; 
    cout<<"a="<<a<<" b="<<b<<"\n"; 

    swap(a,b); 
    cout<<"After Swap with pass by reference\n"; 
    cout<<"a="<<a<<" b="<<b<<"\n"; 
} 

salida

Before Swap 
a=45 b=35 
After Swap with pass by pointer 
a=35 b=45 

After Swap with pass by reference 
a=45 b=35 
+0

http://stackoverflow.com/questions/114180/pointer-vs-reference –

+0

[¿Hay ventajas de pasar por el puntero sobre pasar por referencia en C++?] (Http://stackoverflow.com/q/334856/ 187543) – cpx

Respuesta

23

Una referencia es semánticamente los siguientes:

T& <=> *(T * const)

const T& <=> *(T const * const)

T&& <=> [no C equivalent] (C++ 11)

Al igual que con otras respuestas, lo siguiente de las preguntas frecuentes de C++ es la respuesta de una línea: referencias cuando sea posible, punteros cuando sea necesario.

Una ventaja sobre los punteros es que necesita un casting explícito para pasar NULL. Aún así es posible. de los compiladores que he probado, ninguno emiten una advertencia para el siguiente:

int* p() { 
    return 0; 
} 
void x(int& y) { 
    y = 1; 
} 
int main() { 
    x(*p()); 
} 
+1

Las referencias no restringen el objeto de referencia a hacer referencia a algo válido. Puede devolver una referencia a una variable local, por ejemplo. –

+1

Es posible obtener una referencia no válida si desreferencia un puntero NULL, por lo que debe tener cuidado con el código de llamada. Consulte http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c/57656#57656 –

+0

Es posible, pero a menos que esté desreferenciando indicadores sin marcar, entonces no debería suceder. Y si no marcas los punteros antes de desreferenciarlos, entonces tengo noticias para ti ... – moshbear

4

paso por el puntero es la única forma en que podría pasar "por referencia" en C, por lo que aún lo ven utiliza un poco .

El puntero NULL es una práctica convención para decir que un parámetro no se usa o no es válido, por lo tanto, use un puntero en ese caso.

Las referencias no pueden actualizarse una vez que están configuradas, por lo tanto, utilice un puntero si alguna vez necesita reasignarlo.

Prefiere una referencia en todos los casos donde no hay una buena razón para no hacerlo. Hazlo const si puedes.

6

De hecho, la mayoría de los compiladores emiten el mismo código para ambas llamadas a funciones, porque las referencias generalmente se implementan usando punteros.

Siguiendo esta lógica, cuando se usa un argumento de tipo de referencia (no constante) en el cuerpo de la función, el código generado solo operará silenciosamente en la dirección del argumento y lo desreferenciará. Además, cuando se encuentra una llamada a dicha función, el compilador generará un código que pasa la dirección de los argumentos en lugar de copiar su valor.

Básicamente, las referencias y los punteros no son muy diferentes desde un punto de aplicación de vista, el principal (y muy importante) diferencia está en la filosofía: una referencia es el objeto en sí mismo, sólo con un nombre diferente.

Las referencias tienen un par de ventajas más en comparación con los punteros (por ejemplo, no pueden ser NULL, por lo que son más seguras de usar). En consecuencia, si puede usar C++, entonces pasar por referencia generalmente se considera más elegante y debería preferirse. Sin embargo, en C, no hay referencias, por lo que si quieres escribir el código C (o, horribile dictu, código que se compila con un compilador C y C++, aunque esa no sea una buena idea), tendrás que Restrinja el uso de punteros.

4

Here es un buen artículo sobre el asunto - "Utilizar referencias cuando se puede, y los punteros cuando es necesario."

Cuestiones relacionadas