Standart kutubhona konteynerlari uchun hotira ajratishda qo'llaniladigan funksiya va klaslar e'lonlari berilgan.
Konteynerlar ichidagi ma'lumotlar manipulyatsiyasida qo'llaniladigan iterator klaslari e'lonlari berilgan.
Konteynerlardagi ma'lumitlarni qayta ishlashda qo'llaniladigan funksiya va klaslar e'lonlari berilgan.
, Fafqulotda hodisalar mehanizmini bajaruvchi klaslar berilgan.
Standart kutubhonaning string klasi e'loni berilgan.
Hotiradagi satrlarga kirish/chiqishni bajaradi-gan funksiyalar prototipi berilgan.
Mahalliy sharoitga moslashgan birliklar (pul,
vaqt, sonlarning turli ko'rinishlari) bilan ishlaydigan funksiyalar e'lonlari berilgan.
Hisoblash sistemalarida sonli ma'lumot tiplari-ning chegaralarini belgilashda ishlatiladigan klas e'lonlari berilgan.
Ijro vaqtida tip identefikatsiyasi uchun qo'llaniladigan klaslar e'loni kiritilgan. Qo'llanuvchi yozgan e'lon fayllari .h bilan tugasa maqsadga muofiq bo'ladi. Bunday fayllar qo'shtirnoqlarga olingan holda dasturga kiritiladi, yani
Kompyuter faning ko'p sohalarida tasodifiy qiymatlar bilan ishlash kerak bo'ladi. Masalan o'yin tuzganda, ma'lum bir tabiiy hodisani modellashtirganda va hokazo. Bunda dasturlash tasodifiy qiymatni olishga asoslangan. Va o'sha tasodifiy qiymatga bog'langan holda biror bir funksiya bajariladi yoki ifoda hisoblanadi. Tasodifiy qiymatni standart kutubhonaning rand() funksiyasi bilanolsa bo'ladi. rand() 0...RAND_NAX orasida yotgan butun son qiymatini qaytaradi. RAND_MAX da aniqlangan simvolik konstantadir. Uning kattaligi 32767 dan kichik bo'lmasligi kerak. rand() qaytaradigan qiymat aslini olganda psevdo-tasodifiydir. Yani dastur qayta-qayta ishlatilganda ayni qiymatlarni beraveradi. To'la tasodifiy qilish uchun dastur har gal ishlatilganda ma'lum bir o'zgaruvchan qiymatga asoslanib boshlanishi kerak.Buning uchun srand() funksiyasi qo'llaniladi. srand() dasturda faqat bir marta chaqirilsa yetarlidir. Dastur ishlash davomida esa ehtiyojga qarab, rand() chaqirilaveradi. Tasodifiy qiymatlar bilan ishlash uchun ni include bilan e'lon qilishimiz kerak. Yuqoridagi funksiyalarning prototiplarini berib o'taylik:
void srand(unsigned int seed);
int rand();
Biz har gal dastur ishlaganda srand() ga seed o'zgaruvchisini klaviaturadan kiritishimiz mumkin, yoki buni avtomatik tarzda bo'ladigan qilishimiz mumkin.
Buning bir yo'li
srand( time(NULL) );
deb yozishdir. Bunda kompyuter avtomatik ravishda o'z ichidagi soatning qiymatini time() funksiyasi yordamida o'qiydi va srand() ga parametr sifatida beradi. time() ni NULL yoki 0 argument bilan chaqirganimizda kompyuter soatining joriy vaqti sekundlar ko'rinishida qaytaradi. Vaqt bilan ishlash uchun ni e'lon qilish kerak bo'ladi. Nardaning 6 lik toshidek ishlaydigan dastur yozaylik.
Bu yerda amallar siklda bajarilmoqda. rand() % 6 ifodasi masshtablash (scaling) deyiladi. rand() dan qaytuvchi qiymat 0...RAND_MAX orasida bo'lishi mumkin, biz bu qiymatni 6 ga ko'ra modulini olsak, bizda javob sifatida faqat 0, 1, 2, 3, 4 va 5 qiymatlari bo'lishi mumkin. Keyin esa biz bu qiymatlarni siljitamiz, yani 1 raqamini qo'shamiz. Shunda javoblar bizga kerakli oraliqda yotgan bo'ladi. ?: shart operatori bilan biz har bir raqamdan keyin ekranga nima bosilib chiqishini hal qilyapmiz, bu yoki endl bo'ladi, yoki bo'shliq bo'ladi. Tasodifiy qiymatlar bilan biz keyingi dasturlarimizda hali yana ishlaymiz.
C/C++ dagi enumeration (ketma-ketlik) tipini tanishtirib o'taylik. Enumeration butun sonli konstantalar yig'indi-sidir.Konstantalar qiymati agar boshlangich qiymat berilmagan bo'lsa, noldan boshlanadi va 1 ga oshib boraveradi, yoki biz qiymatlarni o'zimiz berishimiz mumkin. Masalan:
enum MeningSinifim {AKMAL, TOHIR, NIGORA};
MeninigSinfim SinfA;
SinfA = TOHIR;
SinfA = AKMAL;
Bu yerdagi MeningSinfim qo'llanuvchi tarafidan tuzilgan yangi tipdir.Keyin esa ushbu tipda bo'lgan SinfA o'zgaruv
chisini e'lon qilamiz. Ushbu tipdagi o'zgaruvchi faqat uchta farqli qiymatni qabul qiladi. Bunda AKMAL 0 ga teng, TOHIR 1 ga va NIGORA 2 ga teng bo'ladi. Lekin biz enumeration tipida bo'lgan o'zgaruvchilarga faqat {} qavslar ichida berilgan simvolik ismlarni bera olamiz. Yani to'g'ridan-to'g'ri sonli qiymat bera olmaymiz. Boshqa bir ketma-ketlik:
enum Oylar {YAN = 1, FEV, MAR, APR, MAY, IYUN, IYUL, AVG, SEN, OKT, NOY, DEK};
Bunda qiymatlar birdan boshlanadi va birga ortib boradi. Enumeration qiymatlari katta harflar bilan yozilsa, dastur ichida ajralib turadi. Va sonli konstantalardan ko'ra ishlash qulayroqdir.
O'zgaruvchilarning kattaligi, ismi va turidan tashqari yana bir necha boshqa hossalari bor. Bulardan biri hotirada saqlanish tipidir. O'zgaruvchilar hotirada ikki uslubda saqlanishi mumkin. Birinchisi avtomatik, ikkinchisi statik yo'ldir. Avtomatik bo'lgan birlik u e'lon qilingan blok bajarilishi boshlanganda tuziladi, va ushbu blok tugaganda buziladi, u hotirada egallagan joy esa bo'shatiladi. Faqat o'zgaruvchilar avtomatik bolishi mumkin. Avtomatik sifatini berish uchun o'zgaruvchi boshiga auto yoki register so'zlari qo'yiladi. Aslida lokal o'zgaruvchilar oldiga hech narsa yozilmasa, ularga auto sifati beriladi.
Dastur ijro etilganda o'zgaruvchilar markaziy prosessor registrlariga yuklanib shlov ko'radilar. Keyin esa yana hotiraga qaytariladilar. Agar register sifatini qo'llasak, biz kompyuterga ushbu o'zgaruvchini ishlov ko'rish payti davomida registrlarning birida saqlashni tavsiya etgan bo'lamiz. Bunda hotiraga va hotiradan yuklashga vaqt ketmaydi. Albatta bu juda katta vaqt yutug'i bermasligi mumkin, lekin agar sikl ichida ishlatilsa, yutuq sezilarli darajada bo'lishi mumkin. Shuni etish kerakki, hozirgi kundagi kompilyatorlar bunday ko'p ishlatiladigan o'zgaruvchilarni ajrata olishdi va o'zlari ular bilan ishlashni optimizatsiya qilishadi. Shu sababli o'zgaruvchini register deb e'lon qilish shart bo'lmay qoldi.
Hotirada boshqa tur saqlanish yo'li bu statik saqlanishdir. Statik sifatini o'zgaruvchi va funksiyalar olishlari mumkin. Bunday birliklar dastur boshlanish nuqtasida hotirada quriladilar va dastur tugashiga qadar saqlanib turadilar. O'zgaruvchi va funksiyalarni statik qilib e'lon qilish uchun static yoki extern (tashqi) ifodalari e'lon boshiga qo'yiladi. Statik o'zgaruvchilar
dastur boshida hotirada quriladilar va initsalizatsiya qilinadilar. Fuksiyalarning ismi esa dastur boshidan bor bo'ladi. Lekin statik birliklar dastur boshidan mavjud bo'lishi, ularni dasturning istalgan nuqtasida turib qo'llasa bo'ladi degan gap emas. Hotirada saqlanish uslubi bilan qo'llanilish sohasi tushunchalari farqli narsalardir. O'zgaruvchi mavjud bo'lishi mumkin, biroq ijro ko'rayatgan blok ichida ko'rinmasligi mumkin.
Dasturda ikki hil statik birliklar bor. Birinchi hili bu tashqi identefikatorlardir. Bular global sohada aniqlangan o'zgaruvchi va funksiyalardir. Ikkinchi tur statik birliklar esa static ifodasi bilan e'lon qilingan lokal o'zgaruvchilardir. Global o'zgaruvchi va funksiyalar oldida extern deb yozilmasa ham ular extern sifatiga ega bo'ladilar. Global o'zgaruvchilar ularning e'lonlarini funksiyalar tashqarisida yozish bilan olinadi. Bunday o'zgaruvchi va funksiyalar o'zlaridan faylda keyin keluvchi har qanday funksiya tomonidan qo'llanilishi mumkin.
Global o'zgaruvchilarni ehtiyotorlik bilan ishlatish kerak. Bunday o'zgaruvchilarni harqanday funksiya o'zgartirish imkoniga ega. O'zgaruvchiga aloqasi yo'q funksiya uning qiymatini bilib-bilmasdan o'zgartirsa, dastur mantig'i buzilishi mumkin. Shu sababli global sohada iloji boricha kamroq o'zgaruvchi aniqlanishi lozim. Faqat bir joyda ishlatilinadigan o'zgaruvchilar o'sha blok ichida aniqlanishi kerak. Ularni global qilish noto'g'ridir. Lokal o'zgaruvchilarni, yani funksiya ichida e'lon qilingan o'zgaruvchilarni static so'zi bilan e'lon qilish mumkin. Bunda ular ikkinchi hil static birliklarni tashkil qilishgan bo'lishadi. Albatta ular faqat o'sha funksiya ichida qo'llanishlari mumkin. Ammo funksiya bajarilib tugaganidan so'ng static o'zgaruvchilar o'z qiymatlarini saqlab qoladilar va keyingi funksiya chaqirig'ida saqlanib qolingan qiymatni yana ishlatishlari yoki o'zgartirishlari mumkin.
Statik o'zgaruvchilar e'lon paytida initsalizatsiya qilinadilar. Agar ularga e'lon paytida ochiqchasiga qiymat berilmagan bo'lsa, ular nolga tenglashtiriladi.
static double d = 0.7; // ochiqchasiga qiymat berish,
static int k; // qiymati nol bo'ladi.
Agar static yoki extern ifodalari global identefikatorlar bilan qo'llanilsa, ushbu identefikatorlar mahsus ma'noga egadirlar. Biz u hollarni keyin ko'rib o'tamiz.
O'zgaruvchi dasturning faqat ma'lum sohasida ma'moga egadir. Yani faqat biror bir blok, yoki bu blok ichida joylashgan bloklar ichida qo'llanilishi mumkin. Bunday blokni soha (qo'llanilish sohasi - scope) deb ataylik. Identefikator (oz'garuvchi yoki funksiya ismi) besh hil sohada aniqlanishi mumkin. Bular funksiya sohasi, fayl sohasi, blok sohasi, funksiya prototipi sohasi va klas sohasi.
Agar identefikator e'loni hech bir funksiya ichida joylashmagan bo'lsa, u fayl sohasiga egadir. Ushbu identefikator e'lon nuqtasidan to fayl ohirigacha ko'rinadi. Global o'zgaruvchilar, funksiya prototiplari va aniqlanishlari shunday sohaga egadirlar.
Etiketlar (label), yani identefikatorlardan keyin ikki nuqta (:) keluvchi
ismlar, masalan:
chiqish:
mahsus ismlardir. Ular dastur nuqtasini belgilab turadilar. Dasturning boshqa yeridan esa ushbu nuqtaga sakrashni (jump) bajarish mumkin. Va faqat etiketlar funksiya sohasiga egadirlar. Etiketlarga ular e'lon qilingan funksiyaning istalgan joyidan murojaat qilish mumkin. Lekin funksiya tashqarisidan ularga ishora qilish ta'qiqlanadi. Shu sababli ularning qo'llanilish sohasi funksiyadir. Etiketlar switch va goto ifodalarida ishlatilinadi.
Bu funksiya sonning faktorialini hisoblaydi. Bunda 0 va 1 sonlari uchun faktorial 1 ga teng, 1 dan katta x soni uchun esa x! = x*(x-1)*(x-2)...2*1 formulasi bo'yicha hisoblanadi. Yuqoridagi funksiya rekursiya metodini ishlatmoqda, yani o'zini-o'zini chaqirmoqda. Bu usul dasturlashda keng qo'llaniladi. Funksiyamiz ichida bitta dona etiket - end: qollanilmoqda. Etiketlarni qo'llash strukturali dasturlashga to'g'ri kelmaydi, shu sababli ularni ishlatmaslikga harakat qilish kerak.
Blok ichida e'lon qilingan identefikator blok sohasiga egadir. Bu soha o'zgaruvchi e'lonidan boshlanadi va } qavsda (blokni yopuvchi qavs) tugaydi. Funksiyaning lokal o'zgaruvchilari hamda funksiyaning kiruvchi parametrlari blok sohasiga egadirlar. Bunda parametrlar ham funksiyaning local o'zgaruvchilari qatoriga kiradilar. Bloklar bir-birining ichida joylashgan
bo'lishi mumkin. Agar tashqi blokda ham, ichki blokda ham ayni ismli identefikator mavjud bo'lsa, dastur isjrosi ichki blokda sodir bo'layatgan bir vaqtda ichki identefikator tashqi blokdagi identefikatorni to'sib turadi. Yani ichki blokda tashqi blok identefikatorining ismi ko'rinmaydi. Bunda ichki blok faqat o'zining o'zgaruvchisi bilan ish yuritishi mumkin. Ayni ismli tashqi blok identefikatorini ko'rmaydi. Lokal o'zgaruvchilar static deya belgilanishlariga qaramay, faqat aniqlangan bloklaridagina qo'llanila oladilar. Ular dasturning butun hayoti davomida mavjud bo'lishlari ularning qo'llanilish sohalariga ta'sir ko'rsatmaydi. Funksiya prototipi sohasiga ega o'zgaruvchilar funksiya e'lonida berilgan identefikatorlardir. Aytib o'tkanimizdek, funksiya prototipida faqat o'zgaruvchi tipini bersak yetarlidir. identefikator ismi berilsa, ushbu ism kompilyator tomonidan hisobga olinmaydi. Bu ismlarni dasturning boshqa yerida hech bir qiyinchiliksiz qo'llash mumkin. Kompilyator hato bermaydi. Klas sohasiga ega ismlar klas nomli bloklarda aniqlanadilar. Bizlar klaslarni keyinroq o'tamiz.
Agar funksiya prototipida () qavslar ichiga void deb yozilsa, yoki hech narsa yozilmasa, ushbu funksiya kirish argument olmaydi. Bu qonun C++ da o'rinlidir. Lekin C da bo'sh argument belgisi, yani () qavslar boshqa ma'no beradi. Bu e'lon funksiya istalgancha argument olishi mumkin deganidir. Shu sababli C da yozilgan eski dasturlar C++ kompilyatorlarida hato berishlari mumkindir.
Bundan tashqari funksiya prototipi ahamiyati haqida yozib o'taylik. Iloji boricha har doim funksiya prototiplarini berib o'tish kerak, bu modulli dasturlashning asosidir. Prototip va e'lonlar alohida e'lon fayllar ichida berilishi mumkin. Funksiya yoki klas o'zgartirilganda e'lon fayllari
o'zgarishsiz qoladi. Faqat funksiya aniqlangan fayllar ichiga o'zgartirishlar kiritiladi. Bu esa juda qulaydir.
Funksiyalar dastur yozishda katta qulayliklar beradilar. Lekin mashina saviyasida funksiyani har gal chaqirtirish qo'shimcha ish bajarilishiga olib keladi. Registrlardagi o'zgaruvchilar o'zgartiriladi, lokal yozgaruvchilar quriladi, parametr sifatida berilgan argumentlar funksiya stekiga o'ziladi. Bu, albatta, qo'shimcha vaqt oladi. Umuman aytganda, hech funksiyasiz yozilgan dastur, yani hamma amallari faqat main() funksiyasi ichida bajariladigan monolit programma, bir necha funksiyalarga ega, ayni ishni bajaradigan dasturdan tezroq ishlaydi. Funksiyalarning bu noqulayligini tuzatish uchun inline (satr ichida) ifodasi funksiya e'loni bilan birga qo'llaniladi. inline sifatli funksiyalar tanasi dasturdagi ushbu funksiya chaqirig'i uchragan joyga qo'yiladi. inline deb ayniqsa kichik funksiyalarni belgilash effektivdir. inline ning o'ziga yarasha kamchiligi ham bor, inline qo'llanilganda dastur hajmi oshdi. Agar funksiya katta bo'lsa va dastur ichida ko'p marotaba chaqirilsa, programma hajmi juda kattalashib ketishi mumkin.
Oddiy, inline sifati qo'llanilmagan funksiyalar chaqirilish mehanizmi quyidagicha bo'ladi. Dastur kodining ma'lum bir yerida funksiya tanasi bir marotaba aniqlangan bo'ladi. Funksiya chaqirig'i uchragan yerda funksiya joylashgan yerga ko'rsatkich qo'yiladi. Demak, funksiya chaqirig'ida dastur funksiyaga sakrashni bajaradi. Funksiya o'z ishini bajarib bo'lgandan keyin dastur ishlashi yana sakrash joyiga qaytadi. Bu dastur hajmini ihchamlikda saqlaydi, lekin funksiya chaqiriqlari vaqt oladi.
Kompilyator inline ifodasini inobatga olmasligi mumkin, yani funksiya oddiy holda kompilyatsiya qilinishi mumkin. Va ko'pincha shunday bo'ladi ham. Amalda faqat juda kichik funksiyalar inline deya kompilyatsiya qilinadi. inline sifatli funksiyalarga o'zgartirishlar kiritilganda ularni ishlatgan boshqa dastur bloklari ham qaytadan kompilyatsiya qilinishi kerak. Agar katta proyektlar ustida ish bajarilayatgan bo'lsa, bu ko'p vaqt olishi mumkin. inline funksiyalar C da qo'llanilgan # define makrolari o'rnida qo'llanilish uchun mo'ljallangan.
Funksiya shablonlari (function templates) ham funksiya yuklanishiga o'hshash tushunchadir. Bunda eng asosiy farq funksiya shablonlarida amal ham bir hil yo'l bilan bajariladi. Masalan bir necha sonlar ichidan eng kattasini topish kerak bo'lsin. Sonlar to'plami faqat tipi bilan farqlanadi, int, double yoki float. Ishlash algoritmi esa aynidir. Bu holda biz funksiyalarni yuklab o'tirmasdan, shablon yozib qo'ya qolamiz.
Funkisya shabloni yoki yuklanishisiz ham bu masalani yechish mumkinku degan savol paydo bo'ladi. Masalan, agar biz kiradigan parametrlarning hammasini long double qilsak, istalgan sonli tipdagi argumentni bera olamiz, chunki kompilyator o'zi avtomatik ravishda kirish tiplarini long double ga o'zgartiradi. Lekin, agar biz bunday funksiya yozadigan bo'lsak, hotiradan va tezlikdan yutqizamiz. Dasturimizda faqat char tipidagi, bir baytli qiymatlar bilan ishlashimiz mumkin. long double esa 10 bayt, va eng katta sonni aniqlash uchun sonlarni solishtirganimizda, long double qiymatlarni solishtirish char tipidagi qiymatlarni solishtirishdan ko'ra ancha ko'p vaqt oladi. Qolaversa, har doim ham kompilyator tiplarni biridan ikkinchasiga to'g'ri keltira oladi. Shablonlarning strukturasi bilan tanishaylik. Bizning funksiya ikkita kirish argumentini bir biriga qo'shsin, va javobni qaytarsin.
Shablon funksiya e'loni va aniqlanishidan oldin template <> ifodasi yoziladi, <> qavslardan keyin nuqta-vergul (;) qo'yilmaydi. <> qavslar ichida funksiya kirish parametrlari, chiqish qiymati va lokal o'zgaruvchilar tiplari beriladi. Ushbu formal tiplarning har birining oldida class yoki typename (tip ismi) so'zi qo'yilish kerak. Yuqoridagi misolda T ning o'rniga istalgan boshqa identefikator qo'yish mumkin.
Shablonlarni funksiyalardan tashqari klaslarga ham qo'llasa bo'ladi. Ko'rib turganimizdek, shablonlar faqat bir marotaba yoziladi. Keyin esa mos keladigan tiplar qo'yilib, yozilib ketilaveradi. Aslida shablonlar C++ ning standartida juda ko'p qo'llanilgan. Agar bilib ishlatilsa, shablonlar dasturchining eng kuchli quroliga aylanishi mumkin. Biz keyinroq yana shablonlar mavzusiga qaytamiz.
Sinf shablon(templatelarini yaratish usullari va ulargaa doir masalalarni yechish.
Sinf. Har bir sinf sinflar tabaqalanishida (ierarxiyasida) ma’lum o‘rinni egallaydi. Masalan, barcha soatlar vaqtni o‘lchash asboblari sinfiga (tabaqalanishda ancha yuqori turgan) mansub, soatlar sinfining o‘zi esa xuddi shu mavzudagi ko‘plab hosila variatsiyalarini o‘z ichiga oladi. SHunday qilib, har qanday sinf obyektlarning biron-bir kategoriyasini aniqlaydi, har qanday obyekt esa biron-bir sinf ekzemplyari (nusxasi)dir. Sinf jismoniy mohiyatga ega emas, tuzilmaning e’lon qilinishi uning eng yaqin analogiyasidir. Sinf obyektni yaratish uchun qo‘llangandagina, xotira ajralib chiqadi. Bu jarayon ham sinf nusxasini yaratish deb ataladi. 74 C++tilining har qanday obyekti bir hil atributlarga, shuningdek ushbu sinfning boshqa obyektlari bilan funksionallikka ega. O‘z sinflarini yaratish hamda ushbu sinflar obyektlarining xulq-atvori uchun to‘liq mas’uliyat dasturchi zimmasiga yuklanadi. Biron-bir muhitda ishlar ekan, dasturchi standart sinflarning kattagina kutubxonasi (masalan, C++ Builder Visual Komponentlar Kutubxonasi)ga kirish huquqiga ega bo‘ladi. Abstraksiya – bu identifikatorlardan farqli bo‘lgan istalgan dasturlash tili ifodasi hisoblanadi. Garchi obyektga mo‘ljallanganliklar inkapsulyasiyalashdan foydalanishga yordam bersa-da, biroq ular inkapsulyasiyalashni kafolatlamaydi. Tobe va ishonchsiz kodni yaratib qo‘yish oson. Samarali inkapsulyasiyalash – sinchkovlik bilan ishlab chiqish xamda abstraksiya va tajribadan foydalanish natijasidir. Inkapsulyasiyalashdan samarali foydalanish uchun dasturni ishlab chiqishda avval abstraksiyadan va uning bilan bog‘liq konsepsiyalardan foydalanishni o‘rganib olish lozim. Abstraksiya murakkab masalani soddalashtirish jarayonidir. Muayyan masalani echishga kirishar ekansiz, siz barcha detallarni hisobga olishga o‘rinmaysiz, balki echimni osonlashtiradiganlarini tanlab olasiz. Aytaylik, siz yo‘l harakati modelini tuzishingiz kerak. SHunisi ayonki, bu o‘rinda siz svetoforlar, mashinalar, shosselar, bir tomonlama va ikki tomonlama ko‘chalar, ob-havo sharoitlari va h.k. sinflarini yaratasiz. Ushbu elementlarning har biri transport harakatiga ta’sir ko‘rsatadi. Biroq bu o‘rinda hasharotlar va qushlar xam yo‘lda paydo bo‘lishi mumkin bo‘lsa-da, siz ularning modelini yaratmaysiz. Inchunin, siz mashinalar markalarini ham ajratib ko‘rsatmaysiz. Siz haqiqiy olamni soddalashtirasiz hamda uning faqat asosiy elementlaridan foydalanasiz. Mashina - modelning muhim detali, biroq bu Kadillakmi yoki boshqa biron markadagi mashinami, yo‘l harakati modeli uchun bu detallar ortiqcha. 75 Abstraksiyaning ikkita afzal jihati bor. Birinchidan, u masala echimini soddalashtiradi. Muhimi yana shundaki, abstraksiya tufayli dasturiy ta’minot komponentlaridan takroran foydalanish mumkin. Takroran qo‘llanadigan komponentlarni yaratishda ular odatda g‘oyat ixtisoslashadi. Ya’ni komponentlar biron-bir ma’lum masala echimiga mo‘ljallangani, yana ular keraksiz o‘zaro bog‘liqlikda bo‘lgani sababli. dastur fragmentining boshqa biron o‘rinda takroran qo‘llanishi qiyinlashadi. Imkoni boricha bir qator masalalarni echishga qaratilgan obyektlarni yaratishga harakat qiling. Abstraksiya bitta masala echimidan ushbu sohadagi boshqa masalalarni ham echishda foydalanish imkonini beradi. Sinflarni yozishda biz funksiyalarni yozishdagi tartib qoidalarga rioya qilamiz. Sinfning birinchi qatoriga kalit so‘z class va sinf nomi, so‘ngra yangi qatordan figurali qavslar ochiladi va uning ichiga sinf usullari va atributlari yoziladi. Sinf quyidagi seksiyalarga ega bo‘lishi mumkin: 1. private (private, ichki). 2. protected (protected, himoyalangan qism). 3. public (public, umumiy). Endi bazaviy sinfning umumiy yozilish sintaksisini quyidagicha yozish mumkin: class className { private: protected: public: 76 } C++ ning bazaviy sinflarining seksiyalariga quyidagicha huquqlar aniqlangan: 1. Private seksiyasi – shu sinfning faqat usullariga dostupni aniqlaydi. Hosilaviy sinflar uchun privat usullarga dostup berilmaydi. 2. Himoyalangan protected nomlari faqat shu sinf usullariga va shu sinf hosila sinfi usullariga dostup beradi. 3. Umumiy huquqli public nomlari hamma turdagi sinflarning usullariga dostup beradi. Sinflarni aniqlashda seksiyalardan foydalanishning asosiy qoidalari: 1. Seksiyalar istalgan tartibda e’lon qilinishlari mumkin, hatto qayta tavsiflashlar ham uchrashi mumkin. 2. Agar seksiya nomlangan bo‘lmasa, u holda kompilyator sinfda oxirgi aniqlangan nomlarni private berilma deb qabul qiladi. 3. Agar biz a’zo berilmalarga dostupni cheklamokchi bo‘lsak ularni umum dostupli seksiyaga joylashtirmasligimiz lozim. 5.3 Abstraksiya Abstraksiya – bu identifikatorlardan farqli bo‘lgan istalgan dasturlash tili ifodasi hisoblanadi. Obyektga mo‘ljallangan dasturlashda har bir obyekt prinsipial dinamik mohiyatga ega, ya’ni u vaqtga bog‘lik holda va unga nisbatan tashqi faktorlar ta’sirida o‘zgaradi. Boshqacha aytganda obyekt ma’lum bir darajada o‘zini tutishiga ega. Obyektga mo‘ljallangan dasturlashda abstraksiya OMD ning modeli hisoblanadi. Sinf umumiy xususiyatlar va hulk-atvorga ega bo‘lgan obyektlarni birlashtiradi. Bitta sinfga mansub obyektlar bir xil xususiyatlarga ega bo‘lib, bir xil xatti-xarakat namoyon etadi. Sinflar shablon (qolip)ga o‘xshaydi: ular obyektlarning ekzemplyarlarini tayyorlash uchun qo‘llanadi. Belgilar - sinfning tashqaridan ko‘rinib turgan xususiyatlari. Obyekt ichki o‘zgaruvchiga bevosita kirishni takdim etganda yoki 77 usul yordamida qiymatni kaytargandagina, o‘z belgilarini namoyon kilishi mumkin. Hulq-atvor - xabarga yoki holatning o‘zgarishiga javoban obyekt tomonidan bajariladigan xatti-xarakatlar. U obyekt nima qilayotganini bildiradi. Bir obyekt ikkinchi obyekt ustida xatti-xarakatlar bajarib, uning xulkatvoriga ta’sir ko‘rsatishi mumkin. «Xatti-xarakat» atamasi o‘rniga «usulni chakirish», «funksiyasini chakirish» yoki «xabarni o‘zatish» atamalari ko‘llanadi. Muximi bu atamalarning qaysi biri qullanayotganida emas, albatta, muximi bu xatti-xarakatlar obyekt hulk-atvorini namoyon qilishga da’vat etishidadir. Obyektlar o‘rtasida aloqa obyektga mo‘ljallangan dasturlashning muhim tarkibiy qismidir. Obyektlar o‘zaro aloqasining ikkita asosiy usuli mavjuddir. Birinchi usul: obyektlar biri ikkinchisidan mustaqil ravishda mavjud bo‘ladi. Agar alohida obyektlarga o‘zaro aloqa kerak bo‘lib qolsa, ular birbirlariga xabar jo‘natadi. Obyektlar bir-birlari bilan xabarlar yordamida aloqa qiladi. Xabar olgan obyekt ma’lum xatti-xarakatlarni bajaradi. Xabar uzatish bu obyekt xolatini o‘zgartirish maqsadida uslubni chaqirib olish yoki xulk-atvor modellaridan birini ko‘llashning o‘zginasidir. Ikkinchi usul: obyekt tarkibida boshka obyektlar bo‘lishi mumkin. Xuddi OMDda bo‘lganidek, dastur obyektlardan tashkil topganidek, obyektlar ham, o‘z navbatida, agregatsiya yordamida boshqa obyektlardan jamlanishi mumkin. Ushbu obyektlarning har bittasida uslub va belgilarga ega bo‘lgan interfeys mavjud bo‘ladi. Xabar - obyektga mo‘ljallangan yondoshuvning muhim tushinchasi. Xabarlar mexanizmi tufayli obyektlar o‘z mustakilligini saqlab qolishi mumkin. Boshqa biron obyektga xabar jo‘natayotgan obyekt uchun xabar olgan obyekt talabdagi xatti-xarakatni qanday bajarishi unchalik muhim emas. Unga xattixarakat bajarilganligining o‘zi muhimdir. 78 5.4 Vorislik Vorislik. Vorislik mavjud bo‘lgan sinfning ta’rifi asosida yangi sinfni yaratish imkonini beradi. Yangi sinf boshqasi asosida yaratilgach, uning ta’rifi avtomatik tarzda mavjud sinfning barcha hususiyatlari, hulq-atvori va joriy qilinishiga vorislik qiladi. Avval mavjud bo‘lgan sinf interfeysining barcha metodlari va xususiyatlari avtomatik tarzda voris interfeysida paydo bo‘ladi. Vorislik voris sinfida biron-bir jixatdan to‘g‘ri kelmagan xulq-atvorni avvaldan ko‘ra bilish imkonini beradi. Bunday foydali xususiyat dasturiy ta’minotni talablarning o‘zgarishiga moslashtirish imkonini beradi. Agar o‘zgartirishlar kiritishga ehtiyoj tug‘ilsa, bu holda eski sinf funksiyalariga vorislik qiluvchi yangi sinf yozib qo‘ya qolinadi. Keyin o‘zgartirilishi lozim bo‘lgan funksiyalarga qaytadan ta’rif beriladi hamda yangi funksiyalar qo‘shiladi. Bunday o‘rniga o‘rin qo‘yishning mazmuni shundan iboratki, u dastlabki sinf ta’rifini o‘zgartirmay turib, obyekt ishini o‘zgartirish imkonini beradi. Axir bu holda qayta test sinovlaridan puxta o‘tkazilgan asosiy sinflarga tegmasa ham bo‘ladi. Agar siz ko‘p martalab qo‘llash yoki boshqa biron maqsadlarga ko‘ra vorislikni qo‘llashga ahd qilsangiz, avval har gal qarang - vorislik-sinf bilan vorislikni berayotgan sinfning turlari o‘zaro mos keladimi. Vorislikda turlarining mos kelishi ko‘pincha «Is-a» testi deb ataladi. Ikkita sinf bir hil turga ega bo‘lgandagina, o‘zaro «Is-a» munosabatida turibdi deb hisoblanadi. Birinchi sinf o‘zida ikkinchi sinfning ekzemplyariga ega bo‘lgandagina ikkita sinf o‘zaro «Xas-a» munosabatida turibdi deb hisoblanadi. Boshqa sinfga vorislik bo‘layotgan sinf voris berayotgan sinf bilan shunday munosabatda bo‘lmog‘i lozimki, bunda natijaviy munosabatlar o‘z ma’nosiga ega bo‘lmog‘i, ya’ni vorislik tabaqalanishiga amal qilinishi kerak. Vorislik yordamida qurilgan sinf metodlar va xususiyatlarning uchta ko‘rinishiga ega bo‘lishi mumkin: 79 o‘rniga o‘rin qo‘yish (almashtirish): yangi sinf ajdodlarining metodi yoki xususiyatini shunchaki o‘zlashtirib olmaydi, balki unga yangi ta’rif ham beradi; yangi: yangi sinf butunlay yangi metodlar yoki xususiyatlarni qo‘shadi; Rekursiv: yangi sinf o‘z ajdodlari metodlari yoki xususiyatlarini to‘g‘ridan-to‘g‘ri olib qo‘ya qoladi. Obyektga mo‘ljallangantillarning ko‘pchiligi ta’rifni ma’lumot o‘zatilgan obyektdan qidiradilar. Agar u erdan ta’rif topishning iloji bo‘lmasa, biron ta’rif topilmaguncha, qidiruv tabaqalar bo‘yicha yuqoriga ko‘tarilaveradi. Ma’lumotni boshqarish aynan shunday amalga oshiriladi hamda aynan shu tufayli o‘ringa o‘rin qo‘yish jarayoni ish ko‘rsatadi. Voris sinflar himoyalangan kirish darajasiga ega bo‘lgan metodlar va xususiyatlarga kirish huquqini olishlari mumkin. Bazaviy sinfda faqat avlodlar foydalanishi mumkinligi aniq bo‘lgan metodlargagina himoyalangan kirish darajasini bering. Boshqa hollarda xususiy yoki ommaviy kirish darajasidan foydalanish lozim. Bunday yondoshuv barcha sinflarga, shu jumladan, tarmoq sinflarga ham kirish xuquqi berilganidan ko‘ra, mustahkamroq konstruksiyani yaratish imkonini beradi. Vorislik uch asosiy hollarda qo‘llanadi: ko‘p martalab foydalanishda; ajralib turish uchun; turlarni almashtirish uchun. Vorislikning ayrim turlaridan foydalanish boshqalaridan ko‘ra afzalroq hisoblanadi. Vorislik yangi sinfga eski sinfning amalda qo‘llanishidan ko‘p martalab foydalanish imkonini beradi. Kodni qirqib tashlash yoki kiritish o‘rniga, vorislik kodga avtomatik tarzda kirishni ta’minlaydi, ya’ni kodga kirishda, u yangi sinfning bir qismidek olib qaraladi. Ko‘p martalab qo‘llash uchun vorislikdan foydalanar ekansiz, siz voris qilib olingan realizatsiya (joriy 80 qilinish) bilan bog‘liq bo‘lasiz. Vorislikning bu turini ehtiyotkorlik bilan qo‘llash lozim. Yaxshisi bu o‘rinda «Xas-a» munosabatidan foydalanish kerak. Farqlash uchun vorislik faqat avlod-sinf va ajdod-sinf o‘rtasidagi farqlarni dasturlash imkonini beradi. Farqlarni dasturlash g‘oyat qudratli vositadir. Kodlash hajmining kichikligi va kodning oson boshqarilishi loyiha ishlanmasini osonlashtiradi. Bu holda kod satrlarini kamroq yozishga to‘g‘ri keladiki, bu qo‘shiladigan xatolar miqdorini ham kamaytiradi. Vorislik obyektga mo‘ljallangan dasturlashning muhim xususiyatlariga kiradi. Biz V sinfi A sinfini meroslashini ko‘rsatish uchun (V sinfi A sinfidan tashkil etilgan) V sinfini aniqlashda sinf nomidan keyin ikki nuqta quyiladi va so‘ngra V vorislanayotgan sinflar keltiriladi: class A { public:A(); A(); MethodA(); }; Class B: public A{ public: B(); … }; 5.5 Polimorfizm Polimorfizm. Agar inkapsulyasiyalash va vorislikni obyektga mo’ljallangan yondashuvning foydali vositalari sifatida olib qarash mumkin bo‘lsa, polimorfizm - eng universal va radikal vositadir. Polimorfizm inkapsulyasiyalash va vorislik bilan chambarchas bog‘liq, boz ustiga, polimorfizmsiz obyektga mo’ljallangan yondashuv samarali bo‘lolmaydi. Polimorfizm - obyektga mo’ljallangan yondashuv paradigmasida markaziy tushunchadir. Polimorfizmni egallamay turib, obyektga mo’ljallangan yondashuvdan samarali foydalanish mumkin emas. Polimorfizm shunday holatki, bunda qandaydir bitta narsa ko‘p shakllarga ega bo‘ladi. Dasturlash tilida «ko‘p shakllar» deyilganda, bitta nom avtomatik 81 mexanizm tomonidan tanlab olingan turli kodlarning nomidan ish ko‘rishi tushuniladi. SHunday qilib, polimorfizm yordamida bitta nom turli xulq-atvorni bildirishi mumkin. Vorislik polimorfizmning ayrim turlaridan foydalanish uchun zarurdir. Aynan o‘rindoshlik imkoniyati mavjud bo‘lgani uchun, polimorfizmdan foydalanish mumkin bo‘ladi. Polimorfizm yordamida tizimga to‘g‘ri kelgan paytda qo‘shimcha funksiyalarni qo‘shish mumkin. Dasturni yozish paytida hatto taxmin qilinmagan funksionallik bilan yangi sinflarni qo‘shish mumkin, buning ustiga bularning hammasini dastlabki dasturni o‘zgartirmay turib ham amalga oshirish mumkin. YAngi talablarga osongina moslasha oladigan dasturiy vosita deganda, mana shular tushuniladi. Polimorfizmning uchta asosiy turi mavjud: qo‘shilish polimorfizmi; parametrik polimorfizm; ortiqcha yuklanish; Qo‘shilish polimorfizmini ba’zida sof polimorfizm deb ham ataydilar. Qo‘shilish polimorfizmi shuning bilan qiziqarliki, uning tufayli tarmoq sinf nushalari o‘zini turlicha tutishi mumkin. Qo‘shilish polimorfizmidan foydalanib, yangi tarmoq sinflarni kiritgan xolda, tizimning xulq-atvorini o‘zgartirish mumkin. Uning bosh afzalligi shundaki, dastlabki dasturni o‘zgartirmay turib, yangi xulq-atvorni yaratish mumkin. Aynan polimorfizm tufayli joriy qilishdan takroran foydalanishni vorislik bilan aynanlashtirish kerak emas. Buning o‘rniga vorislikdan avvalam bor o‘zaro almashinish munosabatlari yordamida polimorf xulq-atvorga erishish uchun foydalanish lozim. Agar o‘zaro almashinish munosbatlari to‘g‘ri belgilansa, buning ortidan albatta takroran qo‘llash chiqib keladi. Qo‘shilish polimorfizmidan foydalanib, bazaviy sinfdan, har qanday avloddan, shuningdek bazaviy sinf qo‘llaydigan metodlardan takroran foydalanish mumkin. 82 Parametrik polimorfizmdan foydalanib, turdosh metodlar va turdosh (universal) turlar yaratish mumkin. Turdosh metodlar va turlar dalillarning ko‘plab turlari bilan ishlay oladigan dasturni yozish imkonini beradi. Agar qo‘shilish polimorfizmidan foydalanish obyektni idrok etishga ta’sir ko‘rsatsa, parametrik polimorfizmdan foydalanish qo‘llanayotgan metodlarga ta’sir ko‘rsatadi. Parametrik polimorfizm yordamida, parametr turini bajarilish vaqtigacha e’lon qilmay turib, turdosh metodlar yaratish mumkin. Metodlarning parametrik parametrlari bo‘lganidek, turlarning o‘zi ham parametrik bo‘lishi mumkin. Biroq polimorfizmning bunday turi barcha tillarda xam uchrayvermaydi (C++da mavjud). Ortiqcha yuklanish yordamida bitta nom turlicha metodlarni bildirishi mumkin. Bunda metodlar faqat miqdorlari va parametr turlari bilan farqlanadi. Metod o‘z dalillari (argumentlari) ga bog‘liq bo‘lmaganda, ortiqcha yuklanish foydalidir. Metod o‘ziga xos parametrlar turlari bilan cheklanmaydi, balki har xil turdagi parametrlarga nisbatan ham qo‘llanadi. Masalan max metodini ko‘rib chiqaylik. Maksimal - turdosh tushuncha bo‘lib, u ikkita muayyan parametrlarni qabul qilib, ularning qaysi biri kattaroq ekanini ma’lum qiladi. Ta’rif butun sonlar yoki suzuvchi nuqtali sonlar qiyoslanishiga qarab o‘zgarmaydi. Polimorfizmdan samarali foydalanish sari qo‘yilgan birinchi qadam bu inkapsulyasiyalash va vorislikdan samarali foydalanishdir. Inkapsulyasiyalashsiz dastur osongina sinflarning joriy qilinishiga bog‘liq bo‘lib qolishi mumkin. Agar dastur sinflarning joriy qilinish aspektrlaridan biriga bog‘liq bo‘lib qolsa, tarmoq sinfda bu joriyni to‘g‘rilash mumkin bo‘lmaydi. Vorislik - qo‘shilish polimorfizmining muhim tarkibiy qismi. Hamma vaqt bazaviy sinfga imkon darajada yaqinlashtirilgan darajada dasturlashga o‘ringan holda, o‘rinbosarlik munosabatlarini o‘rnatishga harakat qilish kerak. Bunday usul dasturda ishlov berilayotgan obyektlar turlari miqdorini oshiradi. Puxta o‘ylab ishlab chiqilgan tabaqalanish o‘rinbosarlik munosabatlarini o‘rnatishga yordam beradi. Umumiy qismlarni abstrakt sinflarga olib chiqish 83 kerak hamda obyektlarni shunday dasturlash kerakki, bunda obyektlarning ixtisoslashtirilgan nushalari emas, balki ularning o‘zlari dasturlashtirilsin. Bu keyinchalik har qanday voris sinfni dasturda qo‘llash imkonini beradi. Biroq ko‘p o‘rinlarda tajribasiz loyihachilar polimorfizmni ko‘chaytirish maqsadida hulq-atvorni juda baland tabaqaviy darajaga olib chiqishga urinadilar. Bu holda har qanday avlod ham bu xulq-atvorni ushlab tura oladi. SHuni esdan chiqarmaslik kerakki, avlodlar o‘z ajdodlarining funksiyalarini chiqarib tashlay olmaydilar. Dasturni yanada polimorfizm qilish maqsadida puxta rejalashtirilgan vorislik tabaqalarini bo‘zish yaramaydi. Hamma narsaning xisob-kitobi bor. Xaqiqiy polimorfizmning kamchiligi shundaki, u unumdorlikni pasaytiradi. Polimorfizmdan foydalanganda dasturni bajarish paytida tekshiruvlar o‘tkazish talab qilinadi. Bu tekshiruvlar turlari statik ravishda berilgan qiymatlarga ishlov berishga qaraganda ko‘proq vaqtni talab qiladi.
Xulosa
Xulosa o’rnida shuni aytish joizki C++ dasturlash tili funksiyalar tili hisoblanadi. Unda hech bo’lmaganda bitta main() funksiyasi qo’llaniladi.
Funksiyalar dasturchining ishini sezilarli darajada osonlashtiradi. Abstraktsiya - bu umumiy tushunchadir, uni real dunyoda ham, OOP ga asoslangan dasturlash tillarida ham topishingiz mumkin. Haqiqiy dunyodagi har qanday narsalar, masalan, aytib o'tilgan bankomat aparati yoki hozirgi dasturiy ta'minot loyihangizdagi sinflar va ichki qismni berkituvchi omillar abstraktsiyani ta'minlaydi.
Ushbu abstraktsiyalar, murakkablikni kichikroq qismlarga ajratish orqali ishni ancha osonlashtiradi. Eng asosiysi, siz ularni qanday qilib funksionallikni ta'minlayotganini tushunmasdan turib, foydalanishingiz mumkin bo'ladi.
Foydalanilgan adabiyotlar
1. Стенли Липпман. Язык программирование С++. Базовой курс. Вильямс - М.: 2014.
2. Сидхарма Рао. Освой самостоятельно С++ за 21 день. Вильямс - М.: 2013.
3. Никита Культин. Microsoft Visual C++ в задачах и примерах. БХВПетербург - Петербург.:2010.
4. Б. Страуструп. Язык программирования С++. Специальное издание.- М.:ООО «Бином-Пресс», 2006.-1104 с.
5. Павловская Т.А. С++. Программирование на языке высокого уровня – СПб.: Питер. 2005.- 461 с.
6. Подбельский В.В. Язык С++.- М.; Финансы и статистика- 2003 562с. 7. Павловская Т.С. Щупак Ю.С. С/С++. Структурное программирование. Практикум.-СПб.: Питер,2002-240с
8. Павловская Т.С. Щупак Ю.С. С++. Объектно- ориентированное программ-мирование. Практикум.-СПб.: Питер,2005-265с
9. Глушаков С.В., Коваль А.В., Смирнов С.В. Язык программирования С++: Учебный курс.- Харьков: Фолио; М.: ООО «Издательство АСТ», 2001.-500с.
10. Ш.Ф. Мадрахимов, С. М. Гайназаров С++ тилида программалаш асослари. Т. 2009.
11. www.Intuit.ru. Интернет-Университет информационных технологий. Москва.
12. Пильшиков В.Н. Упражнения по языку Паскаль-М.: МГУ, 1986.
13. Абрамов С.А.,Гнезделова Капустина Е.Н.и др. Задачи по программмированию. - М.: Наука, 1988.
14. Вирт Н. Алгоритмы + структуры данных = программа.-М.:Мир,1985.- 405с.
15. Информатика. Базовой курс. Учебник для Вузов., Санк-Петербург, 2001. под редакцией С.В.Симоновича.
16. Informatika va programmalsh.O’quv qo’llanma. Mualliflar: A.A.Xaldjigitov, Sh.F.Madraximov, U.E.Adamboev, O’zMU, 2005 yil, 145 bet.