2010-03-10 12 views

Respuesta

24

Cada vez que sepa que el método no cambiará el estado del objeto, debe declararlo como constante.

Le ayuda a leer su código. Y ayuda cuando intenta cambiar el estado del objeto: el compilador lo detendrá.

+0

Y si la función ni siquiera está tocando el estado del objeto, sino que puramente transforma los args de entrada en el valor de retorno, entonces debe ser estático. Estático> miembro de const> miembro normal. – Lucas

6

Cuando tiene un objeto const, los únicos métodos que el compilador le permitirá llamar son aquellos marcados como seguros por la palabra clave const. De hecho, solo los métodos de miembro tienen sentido como métodos const.

En C++, cada método de un objeto recibe un puntero implícito this al objeto; Un método const simplemente recibirá un puntero constthis.

3

Suponiendo que estamos hablando acerca de los métodos, como en:

struct Example { 
    void f() const; 
}; 

Entonces si deben ser exigible en un objeto constante, el método debe ser const.

11

tan a menudo como sea posible. Las funciones que no necesitan cambiar los miembros de datos deben declararse como const. Esto hace que el código sea más comprensible y puede dar pistas al compilador para la optimización.

2

no con la suficiente frecuencia ....

Mientras que todas las respuestas son correctas, si está utilizando un libary que no es const correct entonces es difícil de usar const todos los lugares que se debe utilizar.

Si usted tiene un viejo API que toma un char * que a todos los efectos lógicos deberían ser un char * const , entonces tampoco hay que olvidarse const en el código o hacer algo de colada fea. En ese caso, olvido la const.

+2

La alternativa es envolver la API y determinar si realmente DEBERÍA tomar datos de costos y, si es así, descartar la precisión de los datos de entrada dentro de su envoltorio. Esto significa que solo necesita el lanzamiento feo UNA VEZ y puede comentar el hecho de que determinó que esto era seguro y correcto a través de sus pruebas, etc. En mi opinión, la mayoría de las API anteriores deberían incluirse ... –

0

Solía ​​declarar funciones como const pero ahora raramente lo hago nunca más.

El problema principal era que si quería cambiar una función de const a non-const, significaría que todas las otras funciones const que llamaban a esa función también tendrían que cambiarse a non-const.

Eso ocurrió más a menudo de lo que pensé debido a la optimización. Por ejemplo, tenía una función GetData() que solía devolver un puntero a los datos, pero luego optimicé para configurar solo los datos si GetData() termina siendo llamado (lo que cambia el estado del objeto, por lo que ya no es un const función).

Lo mismo para otras funciones que podrían hacer algunos cálculos sin cambiar el estado del objeto, pero en algún momento tiene más sentido almacenar en caché el resultado ya que la función fue llamada muchas veces y fue un cuello de botella.

También en la práctica, al menos para mi proyecto, vi muy poco beneficio al declarar mis funciones como const.

+3

Funciones que don 't cambiar el "valor lógico" todavía puede ser const, solo tiene que usar miembros de datos mutables para su caché. –

+0

Sí, estoy de acuerdo con el comentario de Roger. Los miembros de datos declarados como mutables se pueden cambiar dentro de una función const. – jasonline

1

Uso const en casi todas las oportunidades, y al igual que el hecho de que proporciona tanto la documentación de la intención como impone el cumplimiento de esa intención. Las características del lenguaje no son mucho mejores que eso, y sin embargo curiosamente no se ama.(La realidad parece ser que la mayoría de auto-proclamado C++ codificadores no puede explicar la diferencia entre int*, int*const, const int* y const int*const.)

A pesar de que nunca podría haber ocurrido debido a sus orígenes 'C', a menudo pienso C++ haría ser un mejor lenguaje si const hubiera sido el predeterminado y una aspersión liberal de (digamos) 'var' o alguna palabra clave similar fuera necesaria para permitir la modificación de variables posterior a la construcción.

Cuestiones relacionadas