Diferencia entre const. puntero y de referencia?

¿Cuál es la diferencia entre un puntero constante y una referencia?

Constante puntero como el nombre implica, no puede ser obligado de nuevo. Mismo es el caso con el de referencia.

Me pregunto en qué tipo de escenarios sería preferencia sobre la otra. Cuán diferente es su estándar de C++ y sus implementaciones?

saludos

InformationsquelleAutor Arnkrishn | 2010-02-25

5 Kommentare

  1. 50

    Hay 3 tipos de const punteros:

    //Data that p points to cannot be changed from p
    const char* p = szBuffer;
    
    //p cannot point to something different.  
    char* const p = szBuffer;
    
    //Both of the above restrictions apply on p
    const char* const p = szBuffer;

    Método #2 arriba es el más similar a una referencia.

    Que existen diferencias fundamentales entre las referencias y todos los 3 tipos de const consejos anteriores:

    • También, una referencia es un alias a un objeto. Esto significa que una referencia se puede utilizar sin eliminar la referencia (perdonar la confusión en la terminología).
  2. 7

    Supongo que te refieres a una constante de valor puntero (por ejemplo, int* const ptr), no un puntero a constante (por ejemplo, const int* ptr).

    • No inicializar una referencia es un error de compilación (se evita el problema de sin inicializar punteros)
    • Un puntero puede apuntar también a una matriz, o puede ser NULL, donde la referencia se refiere siempre a un objeto exactamente.
    • La sintaxis es muy diferente
    • Se puede referencia a un elemento de la matriz: int& intRef(intArray[2]);. Una constante de puntero que apunta a una matriz de puntos para la dirección de un elemento de la matriz. No estoy seguro de que la matriz de parte de su segunda viñeta significa mucho. Tal vez usted significa que usted puede utilizar el [] operador en un puntero.
  3. 6

    Cuándo se debe utilizar cada uno de ellos:

    referencia:
    El uso de estos por defecto. Es muy común que las personas a eliminar los punteros NULL. Usted eliminar ese riesgo con una referencia.

    puntero const:
    Cuando quieres una referencia, pero no puede hacer uno. Por ejemplo, usted está escribiendo un conductor, y que te gustaría que un puntero al principio de un mapa de memoria. Una referencia no hace mucho sentido en este caso. También, si usted necesita una matriz de las cosas, una referencia no funciona (a pesar de una matriz de clases sencillas con referencia a los miembros de la voluntad).

    En el siguiente ejemplo, un puntero const comprueba un error que una referencia no puede comprobar:

    int addFour( int* register ){
      if(isNull(arg)){
        throw NullPointerException();
      }  
    
      //some stuff
      *register += 4;
    
      return register;
    }
    
    //This could be any function that does pointer math.
    bool isNull(const int* ptr){
      return( NULL == ptr );
    }
  4. 3

    Casi todos los puntos han sido cubiertos por otras respuestas, excepto que esta importante :
    Es posible hacer aritmética de punteros, pero no en referencia.
    E. g.

    int a[3] = {39, 18, 97};
    int * const b = a;
    int c = *(b+1);  //sets c = 18
    • Que es una excelente razón para evitar el uso de raw punteros 😉
    • Pero la aritmética de punteros puede ser útil a veces, supongo.
  5. 0

    Algunas diferencias:

    Una constante de puntero puede apuntar a NULL.

    Una constante de punto puede apuntar a una matriz de objetos.

    Un puntero const puede ser obligado de nuevo por arrojando el constness.

    • Un puntero puede apuntar al primer elemento de un array de objetos…. Usted también puede tener una matriz de tipo de puntero y de referencia a un tipo así.
    • Const casting debe ser extremadamente rara, bien justificada, y está bien documentado. Un montón de fundición mezclado con la funcionalidad normal es generalmente un síntoma de un mal diseño.
    • Echando la constness y la escritura a una constante variable da un fallo de segmentación, así que esto no es definitivamente una buena idea. Las constantes son en muchos sistemas almacenados en una unidad de memoria de sólo lectura o área, o de sus valores pueden ser sustituidos directamente a los cálculos por el compilador, evitando la lectura de la totalidad.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea