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;
InformationsquelleAutor criddell | 2009-03-06

8 Comentarios

  1. 65

    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:

    • 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.
    • Usted puede asignar NULL a una referencia, SI usted echó a un puntero del tipo y, a continuación, eliminar la referencia el punto por ejemplo, int &ref = (int)NULL; y también puede reasignar una referencia si se coloca dentro de una unión y cambiar el valor correspondiente en la unión.
    • Y debo añadir que estos nunca debe ser hecho, porque cuando una función se pide una referencia, no espera siempre NULO, y aunque la mayoría de las referencias son básicamente cabo de la misma manera como punteros, este PUEDE no ser el caso en todos los escenarios y plataformas.
    • si usted está asignando un valor correspondiente a un sindicato, a continuación, usted no es realmente la asignación de una referencia es usted?
  2. 15

    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.

  3. 13

    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:

           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
  4. 6

    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:

    • Utilizar 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).
    • Utilizar un puntero cuando usted quiere tratar con la dirección de memoria en lugar de con el objeto.
  5. 5

    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.

  6. 4

    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…

  7. 3

    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:

    class Thingy; //assume a constructor Thingy(int,int)
    void foo(const Thingy &a)
    { 
       a.DoSomething();
    }
    
    void bar( ) 
    {
      foo( Thingy(1,2) );
    }

    pero la mayoría de los compiladores se quejan de

    void foo2( Thingy * a);
    
    void bar2()
    {
      foo( &Thingy(1,2) );
    }
    • Tomar la dirección de una variable para obtener un puntero obliga al compilador a guardarlo en la memoria. Asignación de una referencia a una variable local sólo crea un sinónimo; en algunos casos esto puede permitir que el compilador para mantener los datos en el registro y evitar un carga-hit-la tienda. Sin embargo, esto sólo se aplica a las variables locales — una vez que algo se pasa como un parámetro por referencia, no hay ninguna evitando su almacenamiento en pila.

     

    void foo()
    {
       int a = 5;
       //this may be slightly more efficient
       int &b = a;
       printf( "%d", ++b );
       //than this
       int *c = &a;
       printf( "%d", ++(*c) );
    }
    • 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.

  8. 1

    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.

    • En realidad, probablemente generar idéntico código máquina así que en ese sentido son los mismos.

Dejar respuesta

Please enter your comment!
Please enter your name here