¿Qué demonios es un constructor?

madelman
14 de Diciembre del 2002
Por más que leo y leo en los libros no me entero para qué sirven los constructores exactamente. Sí, ya sé que inicializan no se qué.. pero no hay manera. Necesitaría a alguien que me lo explicara en cristiano para que lo pueda cojer. Y si es posible, algún ejemplo no estaría de más.

Gracias.

webJose
14 de Diciembre del 2002
Un constructor es una función que se llama cada vez que se crea un nuevo objeto de la clase. Eso es así porque es conveniente, y por eso los idearon.

Para qué sirven? Para inicializar variables y otras cosas.

Ejemplo:

class CSistemaOperativo
{
public:
CSistemaOperativo() //Constructor
~CSistemaOperativo() //Destructor
//Colocar otras funciones aquí.
private:
OSVERSIONINFO osvi; //Estructura para obtener info del S. O.
bool bInfoLeida; //Indicador de lectura exitosa
}; //Fin de clase.

Los constructores se llaman igual que la clase. Por qué? Bueno, porque así es el lenguaje. Así debe ser. Puede haber más de un constructor definido; solamente hay que seguir las reglas de "Overloading" (no explico esto aquí).

Qué es osvi? Un miembro privado tipo struct OSVERSIONINFO que se utiliza para leer la versión del sistema operativo. Eso es todo. Como requisito, el miembro cbSize de osvi debe inicializarse a sizeof(OSVERSIONINFO).

Por otro lado, bInfoLeida es una variable privada de control, utilizada para saber si ya se leyó o no la info del S. O. en osvi. C++ no inicializa variables automáticamente (como VB por ejemplo), así que tanto osvi como bInfoLeida contienen basura. Los constructors se utilizan para deshacerse de esa basura. En el caso del ejemplo, el constructor podría ser así:

CSistemaOperativo::CSistemaOperativo()
{
//Borrar la basura
memset(&osvi, 0, sizeof(OSVERSIONINFO));
//Colocar sizeof(OSVERSIONINFO) en cbSize
osvi.cbSize = sizeof(OSVERSIONINFO);
//Borrar basura de bInfoLeida
bInfoLeida = false;
} //Fin del constructor.

Eso es todo. Un constructor es una funcion muy conveniente para realizar tareas necesarias para la adecuada operación de una clase. Si no hiciéramos, por ejemplo, bInfoLeida = false antes que cualquier otra cosa, el usuario de la clase podría llamar a otra función, ej. EsWinNT4. La función EsWinNT4 revisa el valor de bInfoLeida, y si el valor es false, entonces llama a (nuevamente, ejemplo) ObtenerInfoSO, que llena la estructura osvi. Pero si el valor es true, entonces ObtenerInfoSO no se llama, para hacer la clase más rápida.

Si no se hace bInfoLeida = false antes que cualquier otra cosa, en el ejemplo anterior EsWinNT4 asume INCORRECTAMENTE que ya se obtuvo la información adecuada en la estructura osvi, y por lo tanto devuelve valores COMPLETAMENTE ERRÓNEOS.

Un destructor es el análogo a un constructor. Los destructores son normalmente utilizados para liberar memoria reservada por malloc(), realloc(), calloc(), o el operador new.

LUIS
14 de Diciembre del 2002
Un constructor no es otra cosa que una función o procedimiento con el cual inicializas (le das valores) a las variables que utilizaras en el programa, sabras que si esto no se hace el programa inicializa las variables con valores aleatorios, eso es todo es muy claro





Antonio
14 de Diciembre del 2002
¡Ahora lo veo claro! Muchísimas gracias a los dos por abrirme los ojos pero creo que Luis ha sido el más efectivo con menos palabras. La clave estuvo cuando dijo que inicializar era "dar valores". Ahí ha estado la madre del cordero que después ha hecho que todo haya ido como la seda. Despues de eso la explicación de webjose sobre los destructores también me ha sido sido muy útil. ¡Joder! ¡He aprendido más con vosotros en dos minutos que en horas estudiando! ¿Podría dirigirme a vosotros directamente la próxima vez que me surja otra duda?

Gracias otra vez.