¿Por qué es necesaria en C++
El compilador quiere asegurarse de no haber cometido errores de ortografía o superado el número incorrecto de argumentos con visión de declarar a la función. Por lo tanto, insiste en que primero ve una declaración de 'agregar' (o cualquier otro tipo, clase o función) antes de ser utilizada.
Esta realidad sólo permite que el compilador para hacer un mejor trabajo de validar el código, y permite que poner en orden los cabos sueltos por lo que puede producir un archivo de objeto que mira aseado. Si no tuviera que reenviar declarar cosas, el compilador produciría un archivo de objeto que debería contener información sobre todas las conjeturas posibles sobre cuál podría ser la función 'agregar'. Y el enlazador debería contener una lógica muy inteligente para tratar de determinar qué 'agregar' realmente desea llamar, cuando la función 'agregar' puede vivir en un archivo de objeto diferente al que el enlazador se une con el que usa agregar para producir un dll o exe Es posible que el enlazador reciba el complemento incorrecto. Digamos que quería usar int add (int a, float b), pero accidentalmente olvidó escribirlo, pero el enlazador encontró una int existente (int a, int b) y pensó que era la correcta y la usó en su lugar. Su código se compilaría, pero no haría lo que esperaba.
tanto, sólo para mantener las cosas explícitas y evitar el adivinanzas, etc., insiste en que el compilador se declara todo antes de que se utiliza.
Diferencia entre declaración y definición
Dicho sea de paso, es importante saber la diferencia entre una declaración y una definición. Una declaración simplemente proporciona suficiente código para mostrar cómo se ve algo, por lo que para una función, este es el tipo de retorno, la convención de llamadas, el nombre del método, los argumentos y sus tipos. Pero el código para el método no es obligatorio. Para una definición, necesita la declaración y luego también el código para la función.
Cómo adelante-declaraciones pueden reducir significativamente los tiempos de construcción
Puede obtener la declaración de una función en su .cpp actual o archivo .h por # includ'ing la cabecera que ya contiene una declaración de la función. Sin embargo, esto puede ralentizar su compilación, especialmente si #incluye un encabezado en .h en lugar de .cpp de su programa, ya que todo lo que #incluye la .h que está escribiendo terminaría #incluyendo todos los encabezados usted escribió #includes también. De repente, el compilador tiene # páginas incluidas y páginas de código que necesita compilar, incluso cuando solo quería usar una o dos funciones. Para evitar esto, puede usar una declaración directa y simplemente escribir la declaración de la función en la parte superior del archivo. Si solo está usando algunas funciones, esto realmente puede hacer que sus compilaciones sean más rápidas en comparación con siempre # incluyendo el encabezado. Para proyectos realmente grandes, la diferencia podría ser una hora o más de tiempo de compilación comprado hasta unos minutos.
rotura referencias cíclicas, donde dos definiciones tanto utilizan entre sí
Además, con visión de declaraciones pueden ayudar a romper los ciclos. Aquí es donde dos funciones ambas intentan usar el uno al otro. Cuando esto sucede (y es una cosa perfectamente válida), puede #incluir un archivo de encabezado, pero ese archivo de encabezado intenta #incluir el archivo de encabezado que está escribiendo actualmente ... que luego # incluye el otro encabezado , que # incluye el que está escribiendo. Estás atrapado en una situación de huevo y pollo con cada archivo de cabecera tratando de incluir # el otro. Para resolver esto, puede reenviar-declarar las partes que necesita en uno de los archivos y dejar el #include fuera de ese archivo.
Ej:
Archivo Car.h
#include "Wheel.h" // Include Wheel's definition so it can be used in Car.
#include <vector>
class Car
{
std::vector<Wheel> wheels;
};
Archivo Wheel.h
Hmm ... Es necesaria la declaración de coche aquí como la rueda tiene un puntero a un Auto, pero Car.h no se puede incluir aquí ya que resultaría en un error de compilación. Si se incluyera Car.h, eso intentaría incluir Wheel.h, que incluiría Car.h, que incluiría Wheel.h, y esto continuaría para siempre, por lo que el compilador genera un error. La solución es reenviar declarar coche en su lugar:
class Car; // forward declaration
class Wheel
{
Car* car;
};
Si la rueda de clase había métodos que deben llamar a los métodos de coche, esos métodos podrían definirse en Wheel.cpp y Wheel.cpp ahora es capaz de incluir Car.h sin causar un ciclo
Una "declaración hacia adelante" en realidad es sólo una declaración. Vea (al final de) esta respuesta: http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration/1410632#1410632 – sbi