Debe usar const
en la firma cada vez que no necesite escribir. Agregar const
a la firma tiene dos efectos: le dice al compilador que desea que verifique y le garantiza que no cambia ese argumento dentro de su función. El segundo efecto es que permite que el código externo use su función para pasar objetos que son a su vez constantes (y temporales), permitiendo más usos de la misma función.
Al mismo tiempo, la palabra clave const
es una parte importante de la documentación de su función/método: la firma de la función dice explícitamente qué pretende hacer con el argumento y si es seguro pasar un objeto que es parte de las invariantes de otro objeto en tu función: estás siendo explícito porque no te meterás con su objeto.
El uso de const
obliga a un conjunto más estricto de requisitos en su código (la función): no puede modificar el objeto, pero al mismo tiempo es menos restrictivo en sus llamadores, haciendo que su código sea más reutilizable.
void printr(int & i) { std::cout << i << std::endl; }
void printcr(const int & i) { std::cout << i << std::endl; }
int main() {
int x = 10;
const int y = 15;
printr(x);
//printr(y); // passing y as non-const reference discards qualifiers
//printr(5); // cannot bind a non-const reference to a temporary
printcr(x); printcr(y); printcr(5); // all valid
}
¿No es la diferencia entre 'const int y a' y' a '' int o incluso const int a' el punto real? Me pregunto por qué el compilador debería marcar la diferencia entre 'const int & a' y' const int a'? ¿O usa y garantiza que el compilador no hará una copia y 'const int a' lo forzará a hacer una copia? ¿Cómo se puede decir 'dejar que el compilador elija'? – kriss
Vea también aquí: http://stackoverflow.com/questions/2139224/2139254#2139254 – sbi
@kriss: El compilador no puede elegir. Considere que declara una función 'void f ( int x);'. En el momento de la declaración, el compilador no tiene información sobre si va a cambiar o no el objeto. Solo al ver el código puede afirmar que el código no cambia o cambia el parámetro. Y aun así, si el código cambia un parámetro, ¿cómo puede el compilador saber si desea que ese cambio sea visible fuera de la función? Incluso si pudiera decidir con la definición, ¿cómo consideraría el compilador la firma en unidades de traducción donde solo se incluye el encabezado? –