C++ destruktorlari
Destruktor - bu function maxsus a'zosi bo'lib, object qo'llanilish doirasidan chiqib ketganda yoki biz o'chirish ifodasi bilan ob'ektni o'chirib tashlaganimizda avtomatik ravishda chaqiriladi.
C++ da destruktor class nomi bilan bir xil nomga ega va u qaytaruvchi turiga ega emas. ~ destruktorni ko'rsatish uchun identifikatordan oldin keladi. Masalan,
class Wall {
public:
// destruktor yarating
~Wall() {
// kod
}
};
Bu erda ~Wall() Wall sinfining destruktoridir.
[!NOTE] Agar biz sinfimizda hech qanday destruktorni, ko'chirish topshirig'ini yoki konstruktorni ko'chirmasak, u holda C++ kompilyatori avtomatik ravishda bo'sh tanaga ega standart destruktorni yaratadi. Aksariyat hollarda bu etarli. Ammo, agar bizning sinfimiz dinamik xotirani taqsimlash kabi resurslarni qayta ishlashni o'z ichiga olsa, biz destruktorni aniqlashimiz va destruktor tanasidagi resurslarni taqsimlashimiz kerak.
Bizning sinfimiz ko'rsatkich a'zolariga ega bo'lsa, standart nusxa ko'rsatuvchi konstruktor turli xil xotira manzillarini ajratish va a'zo ko'rsatkichlari tomonidan ko'rsatilgan qiymatni nusxalash o'rniga, bir ob'ektning a'zo ko'rsatkichlari qiymatini boshqa ob'ektning a'zo ko'rsatkichlariga tayinlaydi.
O'zgaruvchiga yangi xotira manzilini ajratish va ma'lumotlarni nusxalash uchun biz nusxa ko'chirish konstruktorini e'lon qilishimiz kerak. Bundan tashqari, biz destruktor yordamida xotirani ajratishimiz kerak.
#include <iostream>
using namespace std;
// sinf e'lon qilish
class Wall {
private:
double* length;
double* height;
public:
// parametrlangan konstruktor bilan o'zgaruvchilarni ishga tushirish
Wall(double len = 1.0, double hgt = 1.0)
: length{new double{len}}
, height{new double{hgt}} {
}
// Parametr sifatida Wall ob'ekti bilan konstruktorni nusxalash
// obj parametrining ma'lumotlarini nusxalaydi
Wall(const Wall& obj)
: length{new double{*(obj.length)}}
, height{new double{*(obj.height)}} {
}
void setLength(double len) {
*length = len;
}
double calculateArea() {
return *length * *height;
}
// xotirani ajratish uchun destruktor
~Wall() {
delete length;
delete height;
}
};
int main() {
// Wall sinfining ob'ektini yaratish
Wall wall1(10.5, 8.6);
// Kopiya konstruktori orqali devor1 tarkibini devor2ga nusxalash
Wall wall2 = wall1;
// devor uzunligini o'zgartirish2
wall2.setLength(11.5);
// devor1 va devor2 maydonlarini chop etish
cout << "Area of Wall 1: " << wall1.calculateArea() << endl;
cout << "Area of Wall 2: " << wall2.calculateArea();
return 0;
}
Chiqish
Area of Wall 1: 90.3
Area of Wall 2: 98.9
Bu yerga,
Wall(const Wall& obj)
:length{new double{*(obj.length)}}
, height{new double{*(obj.height)}} {
}
nusxa konstruktori hisoblanadi. U const mos yozuvi sifatida Wall ob'ektini oladi.
: length{new double{*(obj.length)}}
, height{new double{*(obj.height)}}
ma'lumotlarni yangi xotira joylariga ko'chiradigan va uzunlik va balandlik ko'rsatkichlarini mos ravishda ishga tushiradigan ishga tushirish ro'yxati.
-*(obj.length) - argument ob'ektining length ko'rsatkich elementi tomonidan ko'rsatilgan qiymat.
-new double{*(obj.length)} dinamik ravishda double ma'lumotlar turi uchun *(obj.length) qiymati bilan xotira ajratadi va xotira manzilini qaytaradi
-length{new double {*obj.length)}} yangi ob'ektning length o'zgaruvchisini yangi xotira manzili bilan ishga tushiradi.
Xuddi shunday,
height{new double{*(obj.height)}}
yangi ob'ektning height ko'rsatkich elementini ishga tushiradi.
Wall1 va wall2 ob'ektlar ko'rish doirasidan chiqib ketganda, ularning tegishli destruktori chaqiriladi. Destruktor ob'ektlar tomonidan olingan dinamik xotirani ajratadi.
Shuningdek oʻqing