En Object Pascal, todos los objetos se crean en el espacio del montón de memoria en lugar de en la pila, por lo que el compilador no llamará automáticamente al constructor como en C++. La construcción y destrucción de objetos es responsabilidad del programador.
Para construir un objeto, primero debe asignar memoria para el objeto. Este paso es compatible con el compilador en Object Pascal, el llamado "Compilador mágico". Magic)", el programador no necesita participar en este proceso; luego se deben inicializar los miembros de datos del objeto, y el compilador será responsable de "limpiarlos", pero si hay una asignación especial, se puede completar. en el constructor; cuando se destruye el objeto, los recursos solicitados (no la memoria ocupada por el objeto en sí) deben liberarse. Estas tareas son responsabilidad del destructor y el reciclaje de la memoria ocupada por el objeto en sí también lo completa; "magia del compilador".
Asignación y reciclaje de memoria de objetos.
Cuando el compilador asigna memoria para un objeto, el soporte que proporciona es insertar estas líneas de código ensamblador antes de llamar al constructor:
prueba dl, dl
jz +$08
añadir especialmente, -$10
llamar a @ClassCreate // Presta atención a esta línea de código
La última línea del código anterior llama a la función _ClassCreate en la línea 8949 del archivo system.pas (sujeto a Delphi 6). Esta función asigna específicamente la memoria adecuada para cada objeto. Una vez completada la asignación de memoria, se llama al constructor de la clase para inicializar los miembros de datos. Posteriormente, el compilador insertará las siguientes líneas de código ensamblador:
prueba dl, dl
jz +$0f
llamar a @AfterConstruction
pop dWord ptr fs:[$00000000]
añadir esp, $0c
El trabajo principal es llamar a AfterConstruction de cada instancia de objeto. Esta llamada no tiene ninguna utilidad en Delphi. Su existencia está reservada para C++Builder.
De manera similar, al destruir un objeto, primero se debe llamar al destructor de la clase para liberar los recursos solicitados por el objeto. Después de eso, el espacio de memoria ocupado por el objeto en sí se recicla. Este trabajo lo completa el compilador insertando el siguiente código ensamblador después de llamar al destructor:
llamar a @BeforeDestruction
prueba dl, dl
jle +$05
llamar a @ClassDestroy
El trabajo realizado por estos códigos corresponde a lo que se realiza al construir el objeto y asignar memoria, principalmente llamando a la función _ClassDestroy en la línea 8997 en system.pas.
constructor y destructor
Para definir un constructor, use la palabra clave Constructor. Por convención, el nombre del constructor es Crear (por supuesto, se pueden usar otros nombres, ¡pero de ninguna manera es un buen diseño!). como:
tipo
TMyFamily = class // La clase definida para tu familia
Privado
FMyFatherName: String // el nombre de tu padre
FMyMotherName : String // el nombre de tu madre
… // Otros miembros de tu familia
Público
Constructor Create(strFatherName, strMotherName: Cadena);
…… // Otros métodos
Fin;
Quizás se pregunte, si no proporciono un constructor para mi clase, ¿se pueden crear sus objetos? La respuesta es: sí. El motivo se ha mencionado antes: el compilador completa la asignación de la memoria ocupada por el objeto en sí. Y dado que en Object Pascal todas las clases (excepto la propia clase TObject) se derivan de la clase TObject, el compilador llamará al constructor TObject.Create(), pero esta función es una función vacía y no afectará a la clase TMyFamily. Cuando se inicializan los miembros de datos (FMyFatherName, FMyMotherName), se borrarán automáticamente y quedarán como cadenas vacías (es decir, ''), porque TObject.Create() no conoce a tu padre ni a tu madre en absoluto.
Al crear un objeto, se llama directamente al constructor, de la siguiente forma:
MyFamilyObject := TMyFamily.Create('Zhang', 'Li');
Utilice la palabra clave Destructor para definir un destructor. Por convención, el destructor se denomina Destroy. como:
tipo
TMiClase = clase
Público
Destructor Destruir(); anular;
Fin;
La razón por la que se agrega una declaración de anulación al final de la declaración del destructor es para garantizar que el objeto se pueda destruir correctamente en el caso de polimorfismo (el polimorfismo se discutirá en detalle en la Sección 2.4). Si no agrega la palabra clave override, el compilador dará una advertencia similar a "El método 'Destruir' oculta el método virtual del tipo base 'TObject'". La advertencia significa que el Destroy que definiste oculta el método virtual TObject.Destroy() de la clase base. En ese caso, el objeto no se puede destruir correctamente en situaciones polimórficas.
Nota: Los destructores deben declararse con una declaración de anulación.
Del mismo modo, si no hay recursos especiales que deban liberarse en su clase, no necesita definir un destructor. Sin embargo, al destruir un objeto, debes llamar al método Free() del objeto en lugar de llamar a Destroy() directamente.
MiFamilyObject.Free();
Esto se debe a que el método Free() determinará si el objeto en sí es nulo y, si no es nulo, se llamará a Destroy() del objeto para aumentar la seguridad. Ahora que existen formas más seguras de hacer esto, ciertamente no hay razón para no hacerlo.
Nota: Nunca llame a Destroy() directamente en un objeto, sino a Free().
De esto se puede concluir que en Object Pascal solo debe prestar atención a la asignación y liberación de los recursos solicitados por el objeto, ¡y no debe preocuparse por el espacio ocupado por el objeto en sí!