Standart bo‘yicha taqsimlovchilar

|
Standart bo‘yicha taqsimlovchilar
|
bet | 49/131 | Sana | 13.05.2024 | Hajmi | 1,83 Mb. | | #228405 |
Bog'liq Tiplarni dinamik tarzda Standart bo‘yicha taqsimlovchilar.
Tuzilmali o‘zgaruvchisi uchun dinamik xotira ajratish. Tuzilmali o‘zgaruvchisi uchun xotira ajratish va bo‘shatish. Quyidagi tavsifga ega bo‘lgan data tuzilmasi berilgan bo‘lsin:
struct Date
{int day; int month; int year;
};
|
struct Date tipidagi o‘zgaruvchi uchun xotiradan joy ajratish va foydalanish uchun quyidagicha dastur fragmentini yozish kerak:
5.10-dastur. xotiradan joy ajratish va foydalanish.
#include "stdafx.h" #include using namespace std;
// tuzilma, kun, oy, yil;
struct Date
{int day; int month; int year;};
int main(){ // new operatori bilan xotiradan joy ajratish
struct Date * pd; // struct Date ga koʻrsatkich
try{ pd = new struct Date; // xotiraga joy ajratish
} catch (bad_alloc ba) {cout << "Xorita ajratilmadi" << endl;
return -1;}
// Agar xotira ajratilgan boʻlsa, unga 16.14.2020 qimat qilib beramiz.
pd->day = 16; pd->month = 04; pd->year = 2020;
cout << pd->day << ":" << pd->month << ":" << pd->year << endl;
// pd oʻzgaruvchisini xotiradan boʻshatish
delete pd;system("pause"); return 0;}
|
Sinf obʻyekti uchun dinamik xotira ajratish.
CDayWeek sinf obʻyektining ko‘rsatkichiga xotira ajratish va foydalanishni keltiramiz.
5.11-dastur. xotira ajratish va foydalanish.
// ConsoleApplication1.cpp : main project file.
#include "stdafx.h" #include using namespace std;
// sinf, hafta kunlari
class CDayWeek{int d; public:
// konstruktor CDayWeek() { d = 1; }
// funksiyalari
int Get(void) { return d; } void Set(int nd) {
if ((1<=nd)&&(nd<=7)) d = nd;}};
int main(){ // new bilan xotiradan joy ajratish
CDayWeek *p; try {// p koʻrsatkich uchun xotiradan joy ajratish
p = new CDayWeek(); // CDayWeek sinf konstruktorini chaqirish
} catch (bad_alloc ba) {
cout << "Xotira ajratilmadi" << endl; cout << ba.what() << endl; return -1;}
// qimat berish
p->Set(3);
cout << p->Get() << endl;
// p koʻrsatkichdan xotirani boʻshatish delete p;
system("pause"); return 0;}
|
|
new operatori yordamida massivlarga xotiradan joy ajratish va foydalanish. new operatori massiv uchun xotira ajratish uchun foydalanish mumkin. Massivga xotira ajratishda new operatorning umumiy shakli:
ptrArray = new type[size];
|
Bunda, ptrArray - xotira ajratilishi kerak bo‘lgan massiv nomi, type - elementlarning tiplari, size - ular bazaviy va ixtiyoriy bo‘lishi mumkin, massiv o‘lchami (elementlar soni).
Delete operatori yordamida massiv obʻyektidan xotirani bo‘shatish uchun quyidagi fragment yoziladi:
Bazaviy tipli ko‘rsatkich massiviga dinamik xotira ajratish va foydalanish. Quyida float tipidagi ko‘rsatkich massivi uchun xotira ajratadi. So‘ngra qator elementlari ixtiyoriy qiymatlar bilan to‘ldiriladi. Shundan so‘ng ajratilgan xotira delete [] operatori tomonidan bo‘shatiladi.
float * ptrArray; ptrArray = new float[10]; int d;
for(int i = 0; i < 10; i++) ptrArray[i] = i * 2 + 1;
d = ptrArray[3]; delete[] ptrArray;
|
Tizimli o‘zgaruvchilar massivi uchun xotira ajratish va undan foydalanish. 3 ta talaba tuzilmalar massivi uchun xotira ajratish va bo‘shatish ko‘rsatilgan. shuningdek, tuzilmalar massivining element maydonlariga murojaat qilish ham ko‘rsatilgan.
5.12-dastur. Xotira ajratish va foydalanish.
#include "stdafx.h" #include using namespace std;
struct TStudent
{string name; string numBook;
int course; float rank;};
int main(){ int n_students = 3; TStudent * pS;
try{pS = new struct TStudent[n_students];}
catch (bad_alloc ba){cout << "Xotira ajratilmadi " << endl;
cout << ba.what() << endl; return -1;}
pS->name = "Aliyev kbar"; pS->numBook = "965874123";
pS->rank = 3.93; pS->course = 1;
(pS + 1)->name = "Bahromov Batir"; (pS + 1)->numBook = "20930032"; (pS + 1)->rank = 4.98;
pS[1].course = 3; pS[2].name = "QobilovUsmon";
pS[2].numBook = "l2l28983"; pS[2].rank = 4.32;
pS[2].course = 2;
cout << pS->name.c_str() << endl;
cout << pS[1].rank << endl;
cout << (pS + 2)->numBook.c_str() << endl;
delete[] pS; system("pause");return 0;}
Massiv obʻyektlari uchun xotira ajratish va undan foydalanish.New
operatoridan foydalangan holda massiv obʻyektlari uchun xotira ajratish
ko‘rsatiladi va delete operatori bilan xotiradan massiv obʻyektlarini bo‘shatish ko‘rsatiladi.
#include "stdafx.h" #include using namespace std;
class CMonth{private:int month;
public:CMonth() { month = 1; }
CMonth(int nmonth){if ((1 <= nmonth) && (nmonth <= 12)) month = nmonth;
Else month = 1;
} int Get(void) { return month; } void Set(int nmonth){
if ((1 <= nmonth) && (nmonth <= 12)) month = nmonth;}};
int main(){
int nMonths = 12; CMonth * pM;
5.12-dastur. Xotira ajratish va foydalanish.
try {
pM = new CMonth[12];
}
catch (bad_alloc ba)
{
cout << "Xotira ajratimadi: " << endl; cout << ba.what() << endl;
return -1;
}
for (int i = 1; i <= 12; i++) pM[i - 1].Set(i);
cout << pM[3].Get() << endl; cout << pM[5].Get() << endl;
delete[] pM; system("pause");
return 0;
}
Yuqoridagi dastur fragmentida massiv obektlar ichki o‘zgaruvchi 1 qiymatiga initsializatsiya qilinadi, chunki bu qiymat Cmonth() parametrlarisiz konstruktorda o‘rnatiladi. Bu konstruktor massiv uchun initsializator vazifasini bajaradi. Biroq, sinf boshqa konstruktorni amalga oshiradi, yaʻni konstruktor bilan 1 qiymatli parametr yoki parametrli konstruktorni. C++ sintaktikiga ko‘ra, massiv obektlarini parametrli konstruktor bilan ishga tushirib bo‘lmaydi. Shuning uchun, cmonth sinf parametrlar siz konstruktor amalga oshirish kerak. Cmonth() parametrsiz konstruktor sinf dastur fragmentidan olib tashlansa,massiv obektlar uchun xotira ajratish mumkin bo‘lmaydi. Bitta obʻyektlar uchun xotira ajratish mumkin, massiv uchun mumkin emas.
Agar maʻlum bir sinf massiv obʻyektlari uchun xotira ajratish kerak bo‘lsa, bu sinf parametrlarsiz konstruktorga ega bo‘lishi va bajarilishi kerak.
Massiv o‘lchamini dinamik kattalashtirish (kichiklashtirish) uchun xotira ajratish va foydalanish. Tuzilmalar uchun xotirani qayta ajratish, tuzilmalarni ishga tushirish. masalan, Dayweek tuzilishi tip uchun xotira qayta ajratish jarayoni ko‘rsatiladi. Xotirani dinamik ravishda ajratish va qayta ajratish bu usulning xotirani statik ajratishga nisbatan asosiy afzalligi hisoblanadi. Kerak bo‘lganda va kerak bo‘lganda dasturda xotira ajratishingiz mumkin. Dayweek tuzilishi parametrlarsiz konstruktor yordamida amalga oshiriladi (yuqoridagidek).
|
| |