19 votos

¿diferencia entre un parámetro de puntero y de referencia?

Estos son los mismos:

int foo(bar* p) {
  return p->someInt();
}

y

int foo(bar& r) {
  return r.someInt();
}

Ignorar el potencial de puntero nulo. ¿Son funcionalmente idénticas no importa si estas dos funciones someInt() es virtual o si se pasan un bar o una subclase de bar ?

Esto cortar cualquier cosa:

bar& ref = *ptr_to_bar;

24voto

shoosh Puntos 34322

C++ referencias son intencionalmente no se especifica en la norma a aplicarse en el uso de punteros. Una referencia es más como un "sinónimo" a una variable de un puntero a él. Esta semántica se abre algunas de las posibles optimizaciones para el compilador cuando es posible darse cuenta de que un puntero puede ser una exageración en algunas situaciones.

Un par de diferencias:

  • Usted no puede asignar NULL a una referencia. Esta es una diferencia crucial y la razón principal por la que prefiere uno más de la otros.
  • Cuando usted toma la dirección de un puntero, se obtiene la dirección de la variable de puntero. Cuando usted toma el dirección de referencia, se obtiene la la dirección de la variable está que se refiere.
  • No se puede reasignar una referencia. Una vez que se inicializa señala el mismo objeto durante toda su vida.

7voto

Ignorando cada azúcar sintáctico y posibilidades que se pueden hacer con el y no con el otro y la diferencia entre los punteros y referencias explicado en otras respuestas a otras preguntas) ... Sí, esos dos son funcionalmente exactamente el mismo! Tanto llamar a la función y ambos manejar virtual funcione igual de bien.

Y no, su línea no rebanada. Es sólo la unión de la referencia directa al objeto apuntado por un puntero.

Algunas de las preguntas sobre por qué se quiere utilizar uno sobre el otro:

En lugar de tratar de dar con diferencias de mí mismo, me delegado a aquellos en caso de que quieras saber.

2voto

Sí que son funcionalmente idénticos. Desde una referencia requiere a un objeto antes de su uso, usted no tendrá que lidiar con null-apuntadores o punteros a memoria no válida.

También es importante ver la diferencia semántica:

  • Utilice una referencia cuando en realidad iba a pasar el objeto normal -, pero es tan grande que tiene más sentido para pasar una referencia al objeto en lugar de hacer una copia (si no modificar el objeto que es).
  • El uso de un puntero cuando usted quiere tratar con la dirección de memoria en lugar de con el objeto.

2voto

Vinay Puntos 3310

Referencia es un puntero constante, es decir, no se puede cambiar la referencia para referirse a otro objeto. Si usted cambia, cambia el valor del objeto referente.

Para Ex:

       int j = 10;
       int &i = j;
       int l = 20;
       i = l; // Now value of j = 20

       int *k = &j;
       k = &l;   // Value of j is still 10

1voto

Chris Shaffer Puntos 18066

No he utilizado C++ en mucho tiempo, así que ni voy a intentar realmente responder a su pregunta (lo siento); Sin embargo, Eric Lippert acaba de publicar un excelente artículo sobre punteros/referencias que yo te quiero.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X