Di Object Pascal, semua objek dibuat di ruang heap memori, bukan di stack, sehingga konstruktor tidak akan dipanggil secara otomatis oleh compiler seperti C++. Membangun objek dan menghancurkan objek adalah tanggung jawab programmer.
Untuk membangun sebuah objek, Anda harus terlebih dahulu mengalokasikan memori untuk objek tersebut. Langkah ini didukung oleh compiler di Object Pascal - yang disebut "Compiler Magic". Magic)", pemrogram tidak perlu berpartisipasi dalam proses ini; maka anggota data objek harus diinisialisasi, dan kompiler akan bertanggung jawab untuk "membersihkan" mereka, tetapi jika ada tugas khusus, itu dapat diselesaikan di konstruktor; ketika objek dirusak Sumber daya yang diminta (bukan memori yang ditempati oleh objek itu sendiri) harus dilepaskan. Tugas-tugas ini juga merupakan tanggung jawab destruktor; "sihir kompiler".
Alokasi dan daur ulang memori objek
Ketika kompiler mengalokasikan memori untuk suatu objek, dukungan yang diberikannya adalah dengan memasukkan baris kode perakitan berikut sebelum memanggil konstruktor:
tes dl, dl
jz+$08
tambahkan esp, -$10
call @ClassCreate // Perhatikan baris kode ini
Baris terakhir dari kode di atas memanggil fungsi _ClassCreate pada baris 8949 dari file system.pas (tergantung pada Delphi 6). Setelah alokasi memori selesai, konstruktor kelas dipanggil untuk menginisialisasi anggota data. Setelah itu, compiler akan memasukkan baris kode assembly berikut:
tes dl, dl
jz +$0f
hubungi @AfterConstruction
pop dWord ptr fs:[$00000000]
tambahkan esp, $0c
Tugas utamanya adalah memanggil AfterConstruction dari setiap instance objek. Panggilan ini tidak ada gunanya di Delphi.
Demikian pula, ketika menghancurkan suatu objek, destruktor kelas harus dipanggil terlebih dahulu untuk melepaskan sumber daya yang diminta oleh objek tersebut. Setelah itu, ruang memori yang ditempati oleh objek itu sendiri didaur ulang. Pekerjaan ini diselesaikan oleh kompiler yang memasukkan kode perakitan berikut setelah memanggil destruktor:
hubungi @BeforeDestruction
tes dl, dl
jle+$05
hubungi @ClassDestroy
Pekerjaan yang dilakukan oleh kode-kode ini sesuai dengan apa yang dilakukan ketika membangun objek dan mengalokasikan memori, terutama memanggil fungsi _ClassDestroy pada baris 8997 di system.pas.
Konstruktor dan destruktor
Untuk mendefinisikan konstruktor, gunakan kata kunci Konstruktor. Berdasarkan ketentuan, nama konstruktornya adalah Create (tentu saja nama lain dapat digunakan, tetapi itu bukanlah desain yang bagus!). menyukai:
jenis
TMyFamily = class // Kelas yang ditentukan untuk keluarga Anda
Pribadi
FMyfatherName : String; // nama ayahmu
FMyMotherName : String; // nama ibumu
… // Anggota keluargamu yang lain
Publik
Buat Konstruktor(strNamaAyah, strNamaIbu : String);
...... // Metode lainnya
Akhir;
Anda mungkin bertanya, jika saya tidak menyediakan konstruktor untuk kelas saya, apakah objeknya dapat dibuat? Jawabannya adalah: ya. Alasannya telah disebutkan sebelumnya, alokasi memori yang ditempati oleh objek itu sendiri diselesaikan oleh compiler. Dan karena di Object Pascal, semua kelas (kecuali kelas TObject itu sendiri) diturunkan dari kelas TObject, compiler akan memanggil konstruktor TObject.Create(), tetapi fungsi ini adalah fungsi kosong, dan tidak akan mempengaruhi kelas TMyFamily . Ketika anggota data (FMyfatherName, FMyMotherName) diinisialisasi, mereka akan secara otomatis dihapus ke string kosong (yaitu ''), karena TObject.Create() tidak mengenal ayah atau ibu Anda sama sekali!
Saat membuat objek, konstruktor dipanggil secara langsung, dalam bentuk berikut:
Objek Keluarga Saya := TMyFamily.Create('Zhang', 'Li');
Gunakan kata kunci Destructor untuk mendefinisikan destructor. Berdasarkan konvensi, destructor diberi nama Destroy. menyukai:
jenis
TMyClass = kelas
Publik
Penghancuran Destruktor();
Akhir;
Alasan mengapa pernyataan override ditambahkan di akhir deklarasi destruktor adalah untuk memastikan bahwa objek dapat dirusak dengan benar jika terjadi polimorfisme (polimorfisme akan dibahas secara rinci di Bagian 2.4). Jika Anda tidak menambahkan kata kunci override, kompiler akan memberikan peringatan yang mirip dengan "Metode 'Hancurkan' menyembunyikan metode virtual tipe dasar 'TObject'". Peringatan tersebut berarti bahwa Destroy yang Anda tentukan menyembunyikan metode virtual TObject.Destroy() dari kelas dasar. Dalam hal ini, objek tidak dapat dihancurkan dengan benar dalam situasi polimorfik.
Catatan: Destruktor perlu dideklarasikan dengan pernyataan override.
Demikian pula, jika tidak ada sumber daya khusus yang perlu dilepaskan di kelas Anda, Anda tidak perlu mendefinisikan destruktor. Namun, ketika menghancurkan suatu objek, Anda harus memanggil metode Free() objek tersebut alih-alih memanggil Destroy() secara langsung.
MyFamilyObject.Gratis();
Hal ini karena metode Free() akan menentukan apakah objek itu sendiri nihil, dan jika bukan nihil, Destroy() objek tersebut akan dipanggil untuk meningkatkan keamanan. Sekarang ada cara yang lebih aman untuk melakukan hal ini, tentu tidak ada alasan untuk tidak melakukannya.
Catatan: Jangan pernah memanggil Destroy() secara langsung pada suatu objek, melainkan Free() sebagai gantinya.
Dari sini dapat disimpulkan bahwa dalam Object Pascal Anda hanya perlu memperhatikan alokasi dan pelepasan sumber daya yang digunakan oleh objek tersebut, dan tidak perlu memperdulikan ruang yang ditempati oleh objek itu sendiri!