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);
}
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). –