Constructor y destructor c++

Constructor y destructor c++

Constructor y destructor c++

Constructor y destructor en c++ programa de ejemplo

Tanto los constructores como los destructores son la función miembro de la clase. Un constructor es una función que inicializa el objeto de la clase y asigna la ubicación de la memoria para un objeto, la función tiene el nombre como el nombre de la clase, conocido por crear el objeto, llamado cuando la instancia de la clase creada. El destructor también tiene el mismo nombre que el nombre de la clase, denotado por el símbolo ~ inclinado, conocido por destruir el constructor, desasigna la ubicación de memoria para creado por el constructor. Una clase puede tener más de un constructor pero tener un destructor.

Cuando creamos un objeto de una clase en C++, podemos querer inicializar los campos de la clase con algunos valores por defecto o determinados. Una clase tiene sus campos y métodos. Los campos son en su mayoría variables u objetos. Asignando valores por defecto a estos campos, facilitamos nuestra programación. El constructor es como una función normal dentro de la clase y el compilador lo llama automáticamente cuando creamos un nuevo objeto de esa clase.

Mientras creamos el objeto pasamos los valores requeridos como un argumento al objeto, estos argumentos son pasados al constructor de la clase. Los valores de los argumentos ahora pueden ser asignados a los campos correspondientes, que están disponibles en la clase. Además, podemos asignar valores por defecto a los campos donde no pasamos los argumentos. Existen diferentes tipos y formas de inicializar el constructor en C++.

Constructor por defecto

Estoy compilando con GCC (4.4.3) en Linux. Conozco vagamente los atributos de función de GCC constructor y destructor, pero la construcción/destrucción que proporcionan parece referirse a todo el programa (es decir, antes de llamar a main(), etc).

No hay forma de hacer esto automáticamente, al menos no de forma portable. En C, normalmente se tienen funciones que funcionan como constructores y destructores – que (de)asignan memoria y (de)inicializan campos -, excepto que tienen que ser llamadas explícitamente:

Para los destructores no hay nada que se pueda acoplar a una variable o tipo de datos. Lo único que conozco que es posible es la gestión de recursos basada en el ámbito que en C se puede implementar a través de variables locales ocultas de ámbito.

¡Espero que eso ayude! Como ha dicho Homunculus, C no es un gran lenguaje si necesitas hacer mucho de este tipo de cosas – pero a veces sólo quieres abstraer el proceso de creación de una estructura, así como su limpieza. Esto es especialmente útil en el diseño modular, donde un módulo puede proporcionar las funciones de interfaz create_ y destroy_, y ocultar la implementación real de las mismas.

Constructor y destructor en java

Supongo que el problema se debe a que declaras un método virtual ‘execute’ en la clase Instruction, y no lo defines en ningún sitio. Los compiladores tienen que producir un objeto vtable para una clase con métodos virtuales y realmente sólo quieren una copia de ella, así que normalmente lo hacen en la unidad de compilación (archivo fuente) que define la primera función virtual…

Sólo una observación extra: en muchos casos (quizás la mayoría, dependiendo de lo que estés codificando), no necesitas implementar el destructor. Sólo lo necesitas si quieres alguna funcionalidad específica (descargar datos a un archivo, por ejemplo).

Constructor por defecto

Así pues, el funcionamiento de los constructores y destructores consiste en que el archivo de objetos compartidos contiene secciones especiales (.ctors y .dtors en ELF) que contienen referencias a las funciones marcadas con los atributos de constructor y destructor, respectivamente. Cuando se carga/descarga la biblioteca, el programa de carga dinámica (ld.so o algo así) comprueba si existen dichas secciones y, en caso afirmativo, llama a las funciones referenciadas en ellas.

El mecanismo .ctors/.dtors, por ejemplo, requiere el apoyo de system-rtl/loader/linker-script. Esto está lejos de estar disponible en todos los sistemas, por ejemplo, en los sistemas profundamente integrados donde el código se ejecuta en el metal desnudo. Es decir, incluso si __attribute__((constructor))/((destructor)) es soportado por GCC, no es seguro que se ejecute ya que depende del enlazador para organizarlo y del cargador (o en algunos casos, del código de arranque) para ejecutarlo. Para usar .init/.fini en su lugar, la forma más fácil es usar las banderas del enlazador: -init & -fini (es decir, desde la línea de comandos de GCC, la sintaxis sería -Wl -init my_init -fini my_fini).

En los sistemas que soportan ambos métodos, una posible ventaja es que el código en .init se ejecuta antes de .ctors y el código en .fini después de .dtors. Si el orden es relevante, esa es al menos una forma burda pero fácil de distinguir entre las funciones init/exit.

Acerca del autor

admin

Ver todos los artículos