No Object Pascal, todos os objetos são criados no espaço heap da memória e não na pilha, portanto, o construtor não será chamado automaticamente pelo compilador como C++. Construir objetos e destruir objetos são de responsabilidade do programador.
Para construir um objeto, você deve primeiro alocar memória para o objeto. Esta etapa é suportada pelo compilador em Object Pascal - o chamado "Compiler Magic". Magic)", o programador não precisa participar desse processo; então os dados membros do objeto devem ser inicializados, e o compilador será responsável por "limpá-los", mas se houver uma atribuição especial, ela poderá ser completada no construtor; quando o objeto é destruído Os recursos solicitados (não a memória ocupada pelo próprio objeto) precisam ser liberados. Essas tarefas são de responsabilidade do destruidor; "mágica do compilador".
Alocação e reciclagem de memória de objeto
Quando o compilador aloca memória para um objeto, o suporte que ele fornece é inserir estas linhas de código assembly antes de chamar o construtor:
teste dl, dl
jz +$08
adicione esp, -$10
chame @ClassCreate // Preste atenção nesta linha de código
A última linha do código acima chama a função _ClassCreate na linha 8949 do arquivo system.pas (sujeito ao Delphi 6). Esta função aloca especificamente memória apropriada para cada objeto. Após a conclusão da alocação de memória, o construtor da classe é chamado para inicializar os membros de dados. Posteriormente, o compilador irá inserir as seguintes linhas de código assembly:
teste dl, dl
jz +$0f
ligue para @AfterConstruction
pop dWord ptr fs:[$00000000]
adicione esp, $ 0c
A tarefa principal é chamar AfterConstruction de cada instância do objeto. Esta chamada não tem utilidade no Delphi. Sua existência é reservada para C++Builder.
Da mesma forma, ao destruir um objeto, o destruidor da classe deve primeiro ser chamado para liberar os recursos solicitados pelo objeto. Depois disso, o espaço de memória ocupado pelo próprio objeto é reciclado. Este trabalho é concluído pelo compilador inserindo o seguinte código assembly após chamar o destruidor:
ligue para @BeforeDestruction
teste dl, dl
jle +$05
ligue para @ClassDestroy
O trabalho realizado por esses códigos corresponde ao que é feito na construção do objeto e na alocação de memória, principalmente chamando a função _ClassDestroy na linha 8997 em system.pas.
Construtor e destruidor
Para definir um construtor, use a palavra-chave Constructor. Por convenção, o nome do construtor é Create (é claro que outros nomes podem ser usados, mas isso não é de forma alguma um bom design!). como:
tipo
TMyFamily = class // A classe definida para sua família
Privado
FMyFatherName : String; // nome do seu pai
FMyMotherName : String; // nome da sua mãe
… // Outros membros da sua família
Público
Construtor Create(strFatherName, strMotherName: String);
…… // Outros métodos
Fim;
Você pode perguntar: se eu não fornecer um construtor para minha classe, seus objetos poderão ser criados? A resposta é: sim. O motivo já foi mencionado anteriormente, a alocação da memória ocupada pelo próprio objeto é finalizada pelo compilador. E como no Object Pascal todas as classes (exceto a própria classe TObject) são derivadas da classe TObject, o compilador chamará o construtor TObject.Create(), mas esta função é uma função vazia e não afetará a classe TMyFamily . Quando os membros de dados (FMyFatherName, FMyMotherName) são inicializados, eles serão automaticamente limpos para strings vazias (ou seja, ''), porque TObject.Create() não conhece seu pai ou sua mãe!
Ao criar um objeto, o construtor é chamado diretamente, da seguinte forma:
MyFamilyObject := TMyFamily.Create('Zhang', 'Li');
Use a palavra-chave Destructor para definir um destruidor. Por convenção, o destruidor é denominado Destroy. como:
tipo
TMyClass = turma
Público
Substituição do destruidor();
Fim;
A razão pela qual a instrução override é adicionada no final da declaração do destruidor é para garantir que o objeto possa ser destruído corretamente no caso de polimorfismo (o polimorfismo será discutido em detalhes na Seção 2.4). Se você não adicionar a palavra-chave override, o compilador emitirá um aviso semelhante a "O método 'Destroy' oculta o método virtual do tipo base 'TObject'". O aviso significa que o Destroy que você definiu esconde o método virtual TObject.Destroy() da classe base. Nesse caso, o objeto não pode ser destruído corretamente em situações polimórficas.
Nota: Os destruidores precisam ser declarados com uma instrução override.
Da mesma forma, se não houver recursos especiais que precisem ser liberados em sua classe, não será necessário definir um destruidor. Entretanto, ao destruir um objeto, você deve chamar o método Free() do objeto em vez de chamar Destroy() diretamente.
MyFamilyObject.Free();
Isso ocorre porque o método Free() determinará se o objeto em si é nulo e, se não for nulo, o Destroy() do objeto será chamado para aumentar a segurança. Agora que existem maneiras mais seguras de fazer isso, certamente não há razão para não fazê-lo.
Nota: Nunca chame Destroy() diretamente em um objeto, mas sim Free().
Pode-se concluir que no Object Pascal você só precisa estar atento à alocação e liberação dos recursos solicitados pelo objeto, e não precisa se preocupar com o espaço ocupado pelo próprio objeto!