2009-07-04 14 views
9

Duplicar posibles:
Difference between pointer variable and reference variable in C++C++ * vs y en la declaración de la función

Cuándo debo declarar mi variables como punteros vs objetos pasados ​​por referencia? Recopilan lo mismo en el ensamblado (al menos en tiempo de ejecución asintóticamente), entonces, ¿cuándo debería usar cuál?

void foo(obj* param) 
void foo(obj& param) 
+2

Dupe of http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-c entre muchos, muchos otros –

Respuesta

12

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 recipientes y usted don' Quiero hacer que su código se vea feo al usar foo(*value); en lugar de foo(value); Entonces, para mostrar que el valor no puede ser 0 ponga assert(value); en la función begin.

3

Una razón para usar punteros es si tiene sentido pasar un valor NULL a la función. Con un puntero, se espera que pueda hacer esto. Con una referencia, no se espera que pueda 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 una puntero en una función, la función puede usar el puntero para tomar posesión del objeto (especialmente en un entorno contado de referencia similar a COM). Si pasa una referencia, entonces la función llamada puede esperar usar el objeto durante la duración de la llamada a la función pero no mantener un puntero al objeto para usarlo más tarde.

6

Sigo el Google style guide standard ya que tiene más sentido para mí. Afirma:

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

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

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

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

+1

No estoy de acuerdo con este punto. Este es el uso indebido del concepto de referencia/puntero en el lenguaje. Las referencias son su para garantizar en tiempo de compilación que se inicializa un valor. Este es un contrato muy fuerte donde uno declara que la función solo acepta valores inicializados. Los lenguajes como Java o C# carecen, lo que obliga a los desarrolladores a verificar si el valor que se pasa es NULL (nulo) o no. No veo la aplicación en el contrato que se me permita aceptar solo valores const. – ovanes

1

La otra diferencia entre los punteros y las referencias es que está implícito que no mantendrá una referencia, a menos que pase una a un constructor. Pasar punteros puede significar que un objeto puede retenerlo por un tiempo, como un objeto de patrón compuesto.

0

Una buena razón por la que uso punteros y no referencias en mis aplicaciones C++, es la legibilidad. Cuando utiliza un puntero, ve lo que realmente está sucediendo y, al usar punteros, la sintaxis le dice lo que realmente está sucediendo.

Lo mismo ocurre 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_1int (o float) y somevar_2 es una especie de puntero.

Cuestiones relacionadas