c++ * vs y en la declaración de la función [duplicar]
-
22-08-2019 - |
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)
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.