Son estos los mismos:
int foo(bar* p) {
return p->someInt();
}
y
int foo(bar& r) {
return r.someInt();
}
Ignorar el puntero nulo potencial. Son estas dos funciones funcionalmente idénticos, no importa si someInt()
es virtual o si se pasan un bar
o de una subclase de bar
?
Hace este pedazo de nada:
bar& ref = *ptr_to_bar;
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 poco más diferencias:
Esta es una diferencia crucial y la
razón principal por la que prefiere uno más de la
otros.
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.
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 preguntas sobre por qué se quiere utilizar uno sobre el otro:
Lugar de tratar de llegar con diferencias de mí mismo, me delegado a aquellos en caso de que quieras saber.
De referencia es un puntero constante es decir, no se puede cambiar la referencia para hacer referencia a otro objeto. Si se puede cambiar, el valor de la referencia del objeto cambia.
Por Ejemplo:
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:
No he usado C++ en un largo tiempo, así que ni siquiera voy a intentar realmente la respuesta a su pregunta (lo siento); sin Embargo, Eric Lippert, acaba de publicar un excelente artículo acerca de punteros o referencias que pensé que sería el punto de que a.
No estoy seguro si alguien responde a tu 2ª pregunta ocultos en la parte inferior sobre la creación de divisiones… no, eso no hará que rebanar.
La segmentación es cuando un objeto derivado asignado (copiado) a un objeto de clase base — la clase derivada de la especialización es «rodajas» off. Nota que dije el objeto es copiado, no estamos hablando de los punteros de la copia/asignado, pero los objetos en sí.
En tu ejemplo, que no está sucediendo. Sólo estás de-la referencia a un puntero a un Bar objeto (lo que resulta en un Bar de objeto) que se utiliza como el r-value en una referencia de la inicialización. No estoy seguro de que tengo mi terminología de derecho…
Como todos los demás ha mencionado, en la aplicación de las referencias y los punteros son en gran parte el mismo. Hay algunas advertencias:
Usted no puede asignar NULL a una referencia
(shoosh mencionado esto): que la
significativo ya que no hay
«indefinido» o «inválido» de referencia
valor.
Puede pasar un temporal
variable como un const de referencia,
pero no es legal pasar un puntero
a un temporal.
Por ejemplo, esto está bien:
pero la mayoría de los compiladores se quejan de
Del mismo modo, el __restringir palabra clave no se puede aplicar a las referencias, sólo los punteros.
Usted no puede hacer aritmética de punteros con referencias, por lo que si usted tiene un puntero a una matriz, a continuación, el siguiente elemento de la matriz se puede tener a través de p+1, una referencia sólo puntos en una cosa en toda su vida.
Las funciones son, obviamente no es «el mismo», pero con respecto a la virtual comportamiento que se comportan de manera similar. Con respecto a rebanar, esto sólo sucede cuando trato withvalues, no referencias o punteros.