Pregunta

He visto funciones miembro programadas dentro de la clase a la que pertenecen y fuera de la clase con un prototipo de función dentro de la clase. Solo he programado utilizando el primer método, pero me preguntaba si es una mejor práctica usar la otra preferencia o solo la preferencia personal.

¿Fue útil?

Solución

Suponiendo que te refieres a C ++, siempre es mejor definir las funciones fuera de la clase, porque si lo pones dentro de la clase, el compilador puede intentar integrarlo, lo que no siempre es deseable:

  1. Aumento del tamaño del código (cada archivo de objeto que incluya este encabezado podría terminar con una copia de la función en su código).
  2. Rompiendo la compatibilidad binaria cuando cambia la definición de la función.

Incluso con las funciones en línea, es generalmente mejor poner definiciones fuera de la clase para mejorar la legibilidad de la interfaz pública de la clase, a menos que la función sea un acceso trivial o algún otro de una sola línea.

Otros consejos

Para C ++, colocar definiciones de métodos en el archivo de encabezado significa que todo lo que incluye un encabezado determinado debe volver a compilarse cuando el encabezado cambie, incluso si es solo un detalle de la implementación.

Mover definiciones fuera del encabezado significa que los archivos que incluyen el encabezado tendrán que volver a compilarse solo cuando el encabezado mismo cambie (funciones agregadas / eliminadas, o declaraciones cambiadas). Esto puede tener un gran impacto en los tiempos de compilación para proyectos complejos.

Hay dos ventajas para ambas técnicas.

Si solo coloca prototipos en la definición de la clase, eso hace que sea más fácil para alguien que está usando su clase ver qué métodos están disponibles. No se distraen con los detalles de la implementación.

Poner el código directamente en la definición de la clase simplifica el uso de la clase, solo tienes que #incluir un encabezado. Esto es especialmente útil (necesario) con clases con plantilla.

Suponiendo que el lenguaje es C ++:

La conclusión es que es una preferencia personal. Dentro de la clase en general es más corto y más directo, especialmente para el

int getFoo() const { return _foo; }

tipo de función. Fuera de la clase te, puedes eliminar " desorden " de la definición de clase.

He visto ambos en uso ...

Por supuesto, las funciones no en línea siempre están fuera de la clase.

También es común mezclar ambos estilos al definir una clase. Para métodos simples que consisten en 1 o 2 líneas, es común y conveniente definir el cuerpo del método dentro de la definición de clase. Para métodos más largos es mejor definirlos externamente. Tendrá definiciones de clase más legibles sin saturarlas con el cuerpo del método.

La ocultación de la implementación de un método es beneficiosa porque la implementación real no distraerá al usuario de la clase, o hará suposiciones sobre la implementación que podrían cambiar en un momento posterior.

Supongo que estás hablando de C ++.

Tener una interfaz agradable y limpia es sin duda una buena idea. Tener un archivo de implementación separado ayuda a mantener su interfaz limpia.

También reduce el tiempo de compilación, especialmente si está utilizando un puntero opaco .

Si implementa la función dentro de la clase, no puede # incluir la clase en varios archivos .cpp o el vinculador se quejará de las múltiples definiciones de la función.

Por lo tanto, la práctica habitual es tener la definición de clase en un archivo .h y la implementación de los miembros en un archivo .cpp (generalmente con el mismo nombre).

Una vez más, al asignar C ++, generalmente restringo esto a los marcadores de posición en las funciones virtuales, por ejemplo,

virtual int MyFunc() {}  // Does nothing in base class, override if needed

Cualquier otra cosa, y el punto de Andrew Medico se activa demasiado fácilmente y daña los tiempos de compilación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top