2010-02-25 17 views
33

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

El puntero constante como su nombre lo indica no se puede volver a unir. Lo mismo es el caso con la referencia.

Me pregunto en qué tipo de escenarios se preferiría uno sobre el otro. ¿Qué tan diferente es su estándar de C++ y sus implementaciones?

aplausos

Respuesta

43

Hay 3 tipos de punteros const:

//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 de arriba es más similar a una referencia.

Existen diferencias fundamentales entre las referencias y todos los 3 tipos de punteros const anteriores:

+2

Además, una referencia es un _alias_ a un objeto. Esto significa que se puede usar una referencia sin desreferenciar (perdonen la terminología confusa). –

6

que asumen que quiere decir un puntero constante de valor (por ejemplo, int * const PTR), no un puntero a const (por ejemplo const int * ptr).

  • No inicializando una referencia es un error de compilación (evita el problema de punteros no inicializados)
  • Un puntero también puede apuntar a una matriz, o puede ser NULL, donde una referencia siempre se refiere exactamente a un objeto.
  • La sintaxis es muy diferente
+0

** Puedes ** hacer referencia a un elemento de matriz: 'int & intRef (intArray [2]);'. Un puntero const apuntando a una matriz apunta a la dirección de un elemento de la matriz. No estoy seguro de que la parte de matriz de tu segunda bala signifique mucho. Quizás quieras decir que puedes usar el operador '[]' en un puntero. – thebretness

0

Algunas diferencias:

Un puntero constante puede apuntar a NULL.

Un punto de contacto puede apuntar a una matriz de objetos.

Un puntero de const puede volver a encuadernar tirando la constness.

+0

Un puntero puede apuntar al primer elemento de una matriz de objetos ... También puede tener un tipo de puntero de matriz y hacer referencia también a dicho tipo. –

+0

La fundición de Const debe ser extremadamente rara, estar bien justificada y estar bien documentada. Una gran cantidad de fundición mezclada con funcionalidad normal suele ser un síntoma de un diseño deficiente. – thebretness

+0

Rechazar la constness y escribir en una variable constante da aquí un error de segmentación, por lo que definitivamente no es una buena idea. Las constantes están en muchos sistemas almacenados en un área de memoria de solo lectura separada, o sus valores pueden ser sustituidos directamente por el compilador para cálculos, evitando por completo la lectura. – Tronic

6

cuándo se debe utilizar cada uno:

referencia: utilizar estos por defecto. Es muy común que las personas eliminen referencias a punteros NULL. Eliminas ese riesgo con una referencia.

const pointer: Cuando quiere una referencia, pero no puede hacer una. Por ejemplo, está escribiendo un controlador y desea un puntero al principio de un mapa de memoria.Una referencia no tiene tanto sentido en ese caso. Además, si necesita una variedad de elementos, una referencia no funcionará (aunque sí lo hará una matriz de clases simples con miembros de referencia).

En el siguiente ejemplo, un puntero constante 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); 
} 
2

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

int a[3] = {39, 18, 97}; 
int * const b = a; 
int c = *(b+1); // sets c = 18 
Cuestiones relacionadas