¿Le parece útil?¿Con qué frecuencia declaras que tus funciones son const?
Respuesta
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á.
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
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 const
this
.
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.
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.
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.
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 ... –
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.
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é. –
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
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.
- 1. ¿Declaras que las funciones específicas de tu módulo son estáticas?
- 2. funciones estáticas vs funciones const
- 3. sobrecarga de funciones con parámetros const
- 4. ¿Qué pasa con const?
- 5. ¿Con qué frecuencia deberíamos escribir pruebas unitarias?
- 6. Funciones Pure/const en C++
- 7. ¿Cuáles son tus cmdlets Powershell favoritos?
- 8. ¿Cuáles son tus mejores consejos para eliminar errores?
- 9. ¿Cuáles son tus optimizaciones sql más comunes?
- 10. ¿Con qué frecuencia implementa los tres grandes?
- 11. ¿Tus colecciones son seguras para hilos?
- 12. ¿Por qué viewDidUnload se llama con menos frecuencia que viewDidLoad?
- 13. ¿Qué funciones de expresiones regulares son compatibles con Solr edismax?
- 14. Trazado de dos funciones con diferente frecuencia de muestreo
- 15. ¿Qué son exactamente las funciones anónimas?
- 16. ¿Las funciones idempotentes son las mismas que las funciones puras?
- 17. ¿Cuáles son tus complementos favoritos de ReSharper, lo que aún falta?
- 18. ¿Qué son las funciones __defineGetter __() y __defineSetter __()?
- 19. ¿Con qué frecuencia se lanza xhr.upload.onProgress?
- 20. ¿Con qué frecuencia debería crear un EntityManager?
- 21. ¿Con qué frecuencia se llama a viewDidLoad?
- 22. funciones pure/const en C++ 0x
- 23. Con qué frecuencia se llamará DownloadProgressChangedEventHandler
- 24. ¿Con qué frecuencia se ejecuta el GC?
- 25. Lanzamiento de JavaFX 1.0. ¿Cuáles son tus pensamientos?
- 26. ¿Por qué volver const Racional que racional
- 27. ¿Qué son los clasificadores const de nivel superior?
- 28. ¿Qué funciones de OpenGL no son aceleradas por GPU?
- 29. En C, ¿cómo declaras que los miembros de una estructura son volátiles?
- 30. Publica tus bonificaciones de funciones de extensión corta para jQuery
constantemente! (lo siento, no pude evitarlo) – Thilo