Pregunta

Posibles Duplicados:
La diferencia entre la variable de puntero y de referencia variable en C++

Cuando debo declarar mis variables como punteros vs los objetos pasados por referencia?Se compila a la misma cosa en la asamblea (al menos en tiempo de ejecución asintóticamente) así que cuando debo usar que?

void foo(obj* param)
void foo(obj& param)
¿Fue útil?

Solución

Mi regla es simple: * uso cuando se quiere mostrar que el valor es opcional y por lo tanto puede ser 0

.

excluir de la regla: todos los _obj_s alrededor se almacenan en contenedores y que no quieren hacer que el código se ven feos mediante el uso de todas partes foo(*value); en lugar de foo(value); De manera que para mostrar que el valor no puede ser 0 Deja assert(value); en la función de comenzar.

Otros consejos

Google estándar, ya que hace el más sentido para mí. Dice lo siguiente:

  

Dentro de parámetro de función enumera todos   referencias deben ser const:

void Foo(const string &in, string *out);
     

De hecho, es una convención muy fuerte   en el código de Google que los argumentos de entrada   son valores o referencias const mientras   argumentos de salida son punteros. Entrada   parámetros pueden ser punteros const, pero   nunca permitimos referencia no const   parámetros.

     

Uno de los casos cuando es posible que desee una entrada   parámetro que es un puntero constante es si   desea hacer hincapié en que la   argumento no se copia, por lo que debe   existir para el tiempo de vida del objeto;   por lo general es mejor para documentar esto en   comentarios también. adaptadores STL tales como   bind2nd y mem_fun no permiten   parámetros de referencia, por lo que debe   declarar funciones con puntero   parámetros en estos casos, también.

Una de las razones para usar punteros es si tiene sentido para pasar un valor NULL en la función. Con un puntero, se espera que sea capaz de hacer esto. Con una referencia, no se espera que sea capaz de hacer esto.

(Sin embargo, al hacer las cosas complicadas aún es posible pasar un valor NULL en un parámetro de referencia. Se puede esperar que la función de llamada se puede bloquear en este caso.)

Otra convención es que si se pasa un puntero en una función, la función puede utilizar el puntero para tomar la propiedad del objeto (especialmente en un entorno contado referencia COM-like). Si se pasa una referencia, a continuación, la función llamada puede esperar para utilizar el objeto de la duración de la llamada a la función pero no para mantener un puntero al objeto para su uso posterior.

La otra diferencia entre los punteros y referencias es que se da a entender que no aferrarse a una referencia, a menos que pase una a un constructor. punteros Pases pueden significar que un objeto podría sostener sobre él durante un tiempo, como un modelo objeto compuesto.

Una buena razón por la que utilizo punteros y no referencias en mis aplicaciones C ++, es la legibilidad. Cuando se utiliza un puntero a ver lo que está sucediendo realmente, y cuando el uso de punteros de la sintaxis le dice lo que está sucediendo realmente.

Lo mismo sucede con "0" o "nulo". Yo prefiero usar "NULO", de esta manera 3 meses más tarde, cuando veo un código que se parece a:

somevar_1 = 0;
somevar_2 = NULL;

Sé que es un somevar_1 int (o float) y somevar_2 es una especie de puntero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top