- 2-Mavzu: Dasturlash tilida sinflar. ОбЪектга йўналтирилган дастурлаш. Do’stona funksiyalar. Inkapsulatsiya. Merosho’rlik. Polimorfizm.
- Virtual funksiyalar
Sinf tushunchasi abstrak tuzilma sifatida . Misollar - Sinf tushunchasi abstrak tuzilma sifatida . Misollar
- Friend funksiyalar /Misollar
- Inkapsulyasiya tushunchasi
- Merosho’rlik tushunchasi
- Polimorfizm tushunchasi
- Virtual funksiyalar haqida
Hisoblash texnikasining rivojlanishi va echilayotgan masalalarni tobora murakkablashuvi dasturlash turli modellarini (paradigmalarini) yuzaga kelishiga sabab bo‘lmoqda. - Hisoblash texnikasining rivojlanishi va echilayotgan masalalarni tobora murakkablashuvi dasturlash turli modellarini (paradigmalarini) yuzaga kelishiga sabab bo‘lmoqda.
- Birinchi kompilyatorlarda (masalan, FORTRAN tili) programmalashning funksiyalardan foydalanishga asoslangan protsedura modelini qo‘llab quvvatlagan.
- Bu model yordamida programma tuzuvchi bir nechta ming qatorli programmalarni yozishi mumkin edi.
-
- Rivojlanishning keyingi bosqichida programmalarning strukturali modeli paydo bo‘ldi va ALGOL, Pascal va C tillar kompilyatorlarida o‘z aksini topdi.
- Strukturali programmalashning mohiyati – programmani o‘zaro bog‘langan protseduralar (bloklar) va ular qayta ishlaydigan berilganlarning majmuasi deb qarashdan iborat.
- Ushbu model programma bloklari keng qo‘llashga, GOTO operatoridan imkon qadar kam foydalanishga tayangan va unda programma tuzuvchi o‘n ming qatordan ortiq programmalarni yarata olgan.
- Yaratilgan programmmani protsedurali modelga nisbatan sozlash va nazorat qilish oson kechgan.
Ma’lumotlarni abstraksiyalash –bu berilganlarni yangi turini yaratish imkoniyati bo‘lib, bu turlar bilan xuddi ma’lumotlarning tayanch turlari bilan ishlagandek ishlash mumkin. - Ma’lumotlarni abstraksiyalash –bu berilganlarni yangi turini yaratish imkoniyati bo‘lib, bu turlar bilan xuddi ma’lumotlarning tayanch turlari bilan ishlagandek ishlash mumkin.
- Odatda yangi turlarni ma’lumotlarning abstrakt turi deyiladi («foydalanuvchi tomonidan aniqlangan tur»deb ham atash mumkin).
- Sinf, shu turdagi ob’ektning tashqi dunyo bilan o‘zaro bog‘lanishi uchun qat’iy muloqot shartlarini aniqlaydi.
- Yopiq berilganlarga yoki kodga faqat shu ob’ekt ichida murojaat qilish mumkin.
- Ochiq berilganlarga va kodlarga, garchi ular ob’ekt ichida aniqlangan bo‘lsa ham, programmaning ixtiyoriy joyidan murojaat qilish mumkin va ular ob’ektni tashqi olam bilan muloqatini yaratishga xizmat qiladi.
- Yaratilgan ob’ektlarni, ularning funksiya – a’zolariga oddiygina murojaat orqali amalga oshiriluvchi so‘rovlar (yoki xabarlar) yordamida boshqarish mumkin.
- Berilgan sinf ob’ektini yaratish konstruktor deb nomlanuvchi maxsus funksiya - a’zo tomonidan, o‘chirish esa destruktor deb nomlanuvchi maxsus funksiya – a’zo orqali amalga oshiriladi.
- Sinf ichki berilganlariga murojaatni cheklab qo‘yishi mumkin. Cheklov berilganlarni ochiq (public), yopiq (private) va himoyalangan (protected) deb aniqlash bilan tayinlanadi.
class - class
- {
- /* sinfning yopiq berilganlar–a’zolari va funksiyalar– a’zolari*/
- public:
- /* sinfning ochiq berilganlar–a’zolari va funksiyalar– a’zolari*/
- }
-
Odatda sinf tavsifida <ob’ektlar ro‘yxati> qismi shart emas. Sinf ob’ektlari keyinchalik, zarurat bo‘yicha e’lon qilinishi mumkin. Garchi <sinf nomi> qismi ham majburiy bo‘lmasa ham, uning bo‘lgani ma’qul. Chunki <sinf nomi> berilganlarning turining yangi nomi bo‘lib, uning yordamida shu sinf ob’ektlari aniqlanadi. - Odatda sinf tavsifida <ob’ektlar ro‘yxati> qismi shart emas. Sinf ob’ektlari keyinchalik, zarurat bo‘yicha e’lon qilinishi mumkin. Garchi <sinf nomi> qismi ham majburiy bo‘lmasa ham, uning bo‘lgani ma’qul. Chunki <sinf nomi> berilganlarning turining yangi nomi bo‘lib, uning yordamida shu sinf ob’ektlari aniqlanadi.
- Sinf ichida e’lon qilingan funksiya va berilganlar shu sinf a’zolari hisobalandi. Sinf e’lonining ichida e’lon qilingan o‘zgaruvchilar berilganlar-a’zolar, sinf ichida e’lon qilingan funksiyalar funksiyalar–a’zolar deyiladi
- Class’ning private va protected qismiga class ga tegishli bo’lmagan friend funksiya murojat qilishi mumkin. Friend funksiyalar klassning ichida friend kalit so’zi bilan yoziladi.
- E’lon qilinishi:
- class myclass {
- …..
- friend int sum(myclass x);
- ….
- };
- class myclass {
- int a, b;
- public:
- friend int sum(myclass x);
- void set_ab(int i, int j) { a = i; b = j; }
- };
- int sum(myclass x) {
- return x.a + x.b; //sum() hech qaysi classga tegishli emas.
- }
- int main() {
- myclass n;
- n.set_ab(3, 4);
- cout << sum(n);
- return 0;
- }
Inkapsulyasiya – bu berilganlar va ularni qayta ishlovchi kodni birlashtirish mexanizmi. Inkapsulyasiya berilganlar va kodni tashqi ta’sirdan saqlash imkonini beradi. - Inkapsulyasiya – bu berilganlar va ularni qayta ishlovchi kodni birlashtirish mexanizmi. Inkapsulyasiya berilganlar va kodni tashqi ta’sirdan saqlash imkonini beradi.
- Yuqoridagi ikkita konsepsiyani amalga oshirish uchun C++ tilida sinflar ishlatiladi. Sinf termini bilan ob’ektlar turi aniqlanadi. Sinfning har bir vakili (nusxasi) ob’ekt deb nomlanadi. Har bir ob’yekt o‘zining alohida holatiga ega bo‘ladi. Ob’yekt holati uning berilganlar-a’zolarining ayni paytdagi qiymati bilan aniqlanadi. Sinf vazifasi uning funksiya-a’zolarining sinf ob’ektlari ustida bajaradigan amallar imkoniyati bilan aniqlanadi.
Vorislik (me’rosxo’rlik)– bu shunday jarayonki, unda bir ob’ekt boshqasining hossalarini o‘zlashtirishi mumkin bo‘ladi. Vorislik orqali mavjud sinflar asosida hosilaviy sinflarni qurish mumkin . - Vorislik (me’rosxo’rlik)– bu shunday jarayonki, unda bir ob’ekt boshqasining hossalarini o‘zlashtirishi mumkin bo‘ladi. Vorislik orqali mavjud sinflar asosida hosilaviy sinflarni qurish mumkin .
- (sinf–avlod) o‘zining ona sinfidan (sinf-ajdod) berilganlar va funksiyalarni vorislik bo‘yicha oladi, hamda ular qatoriga faqat o‘ziga hos bo‘lgan qirralarni amalga oshirishgan imkon beruvchi berilgan va funksiyalarni qo‘shadi. Ajdod sinfdagi himoyalangan berilgan-a’zolarga va funksiya-a’zolarga avdod sinfdan murojaat qilish mumkin bo‘ladi.
Vorislik asosida bir-biri bilan «ona-bola» munosabatidagi sinflar shajarasini yaratish mumkin. Tayanch sinf termini sinflar shajarasidagi ona sinf sinonimi sifatida ishlatiladi. Agar ob’ekt o‘z atributlarini (berilganlar-a’zolar va funksiyalar–a’zolar) faqat bitta ona sinfdan vorislik bilan olsa, yakka (yoki oddiy) vorislik deyiladi. Agar ob’ekt o‘z atributlarini bir nechta ona sinflardan olsa, to‘plamli vorislik deyiladi. - Vorislik asosida bir-biri bilan «ona-bola» munosabatidagi sinflar shajarasini yaratish mumkin. Tayanch sinf termini sinflar shajarasidagi ona sinf sinonimi sifatida ishlatiladi. Agar ob’ekt o‘z atributlarini (berilganlar-a’zolar va funksiyalar–a’zolar) faqat bitta ona sinfdan vorislik bilan olsa, yakka (yoki oddiy) vorislik deyiladi. Agar ob’ekt o‘z atributlarini bir nechta ona sinflardan olsa, to‘plamli vorislik deyiladi.
Vorislik -sinflarda ierarxik ko’rinishdagi sinflanishni ta’minlaydi - Vorislik -sinflarda ierarxik ko’rinishdagi sinflanishni ta’minlaydi
- C++ terminologiyasida:
- Asos sinf (ya’ni voris olinadigan sinf ) base class (asos sinf) deb ataladi.
- Voris sinf (ya’ni voris olish orqali yaratiladigan yangi sinf) derived class (voris sinf) deb ataladi.
- Voris sinf boshqa bironta sinf uchun asos sinf bo’lishi mumkin.
- Demak, bu orqali ko’p sathli vorislik (multiple inheritance) vujudga keladi.
Biron bir sinfdan voris olingandan keyin, ushbu asos sinf a’zolari voris sinfning ham a’zolari bo’lib hisoblanadi. - Biron bir sinfdan voris olingandan keyin, ushbu asos sinf a’zolari voris sinfning ham a’zolari bo’lib hisoblanadi.
- C++ dasturlash tilida voris olish umumiy formasi quyidagicha:
- class voris-sinf-nomi : access asos-sinf-nomi {
- // voris sinf tanasi
- };
class base { - class base {
- int i, j;
- public:
- void set(int a, int b) { i=a; j=b; }
- void show() { cout << i << " " << j << "\n"; }
- };
- class derived : public base {
- int k;
- public:
- derived(int x) { k=x; }
- void showk() { cout << k << "\n"; }
- };
- int main()
- {
- derived ob(3);
- ob.set(1, 2); // asos sinf a’zosiga ruxsat ochiq
- ob.show(); // asos sinf a’zosiga ruxsat ochiq
- ob.showk(); // voris sinf a’zosidan foydalanish
- }
Ushbu misolda asos sinfdan public murojaat turi orqali voris olindi - Ushbu misolda asos sinfdan public murojaat turi orqali voris olindi
- class derived : public base {….}
- Bunda asos sinfning barcha public a’zolari voris sinfning ham public a’zolari bo’ladi.
- Asos sinfning barcha himoyalangan (protected) a’zolari voris sinfning protected a’zolari bo’ladi.
- Lekin, asos sinfning private a’zolari voris sinf uchun ham, boshqa sinflar uchun ham not accessible bo’ladi ,ya’ni asos sinfning private a’zolariga to’g’ridan to’g’ri murojaat yo’q.
- Agar voris sinf private xususiyati orqali yaratilsa, bunda asos sinfning barcha public va protected a’zolari voris sinfning private a’zolari qatoriga o’tadi.
| | | | | | | | | | | | - Boshqa sinf (yoki main funksiya)
| | | | Voris sinf quyidagi ko’rinishlarda, ya’ni murojaat turlari bilan farqlangan holda olinishi mumkin. Bular: public, protected va private vorislik ko’rinishlaridir : - Voris sinf quyidagi ko’rinishlarda, ya’ni murojaat turlari bilan farqlangan holda olinishi mumkin. Bular: public, protected va private vorislik ko’rinishlaridir :
- // public (umumiy) vorislik
- class derived1: public Base{…};
-
- // private (xususiy) vorislik
- class derived2: private Base{….};
-
- // protected (himoyalangan) vorislik
- class derived3: protected Base{….};
- // default (oddiy-xususiy) vorislik
- class derived4: Base{….};
Public vorislik: - Public vorislik:
- Bunda asos sinfning public a’zolari voris sinfning ham public a’zolari va asos sinfning protected a’zolari voris sinfning protected a’zolariga aylanadi.
- Lekin asos sinfning private a’zolari voris sinf uchun yopiqligicha qoladi.
- Protected vorislik:
- Bunda asos sinfning public va protected a’zolari voris sinf uchun protected a’zo bo’lib o’tadi.
- Private vorislik:
- Bunda asos sinfning public va protected a’zolari voris sinfning private a’zosiga ayanadi.
Bir vaqtning o’zida bir nechta sinfdan voris olish mumkin. - Bir vaqtning o’zida bir nechta sinfdan voris olish mumkin.
- Masalan, voris sinf derived ikkita base1 va base2 lardan voris olyapti.
- Quyidagicha formada bir nechta sinfdan voris olish mumkin:
- class derived : public base-class1, public base-class2, …
Polimorfizm –bu kodning, bajarilish paytidan yuzaga keladigan holatga bog‘liq ravishda o‘zini turlicha amal qilish xususiyatidir. Polimorfizm – bu faqat ob’ektlar xususiyati bo‘lmasdan, balki funksiyalar-a’zolar xususiyatidir va ular xususan, bitta nomdagi funksiya-a’zoni, har xil turdagi argumentlarga ega va bajaradigan amali unga uzatiladigan argumentlar turiga bog‘liq bo‘lgan funksiyalar uchun (o‘rnida) foydalanish imkoniyatida namoyon bo‘ladi. - Polimorfizm –bu kodning, bajarilish paytidan yuzaga keladigan holatga bog‘liq ravishda o‘zini turlicha amal qilish xususiyatidir. Polimorfizm – bu faqat ob’ektlar xususiyati bo‘lmasdan, balki funksiyalar-a’zolar xususiyatidir va ular xususan, bitta nomdagi funksiya-a’zoni, har xil turdagi argumentlarga ega va bajaradigan amali unga uzatiladigan argumentlar turiga bog‘liq bo‘lgan funksiyalar uchun (o‘rnida) foydalanish imkoniyatida namoyon bo‘ladi.
- Bu holatga funksiyalarni qayta yuklash deyiladi. Polimorfizm amallarga ham qo‘llanishi mumkin, ya’ni amal mazmuni (natijasi) operand (berilgan) turiga bog‘liq bo‘ladi. Polimorfizmning bunday turiga amallarni qayta yuklash deyiladi.
Polimorfizm yana bir ta’rifi quyidagicha: polimorfizm – bu tayanch sinfga ko‘rsatkichlarning (murojaatlarning) virtual funksiyalarni chaqirishdagi turli shakl (qiymatlarni) qabul qilish imkoniyatidir. - Polimorfizm yana bir ta’rifi quyidagicha: polimorfizm – bu tayanch sinfga ko‘rsatkichlarning (murojaatlarning) virtual funksiyalarni chaqirishdagi turli shakl (qiymatlarni) qabul qilish imkoniyatidir.
- C++ tilining bunday imkoniyati kechiktirilgan bog‘lanish natijasidir. Kechiktirilgan bog‘lanishda chaqiriladigan funksiya-a’zolar adreslari programma bajarilishi jarayonida dinamik ravishda aniqlanadi.
- An’anaviy programmalash tillarida esa bu adreslar statik bo‘lib, ular kompilyasiya paytida aniqlanadi (oldindan bog‘lanish).
- Kechiktirilgan bog‘lanish faqat virtual funksiyalar uchun o‘rinli.
Polimorfizm – bu bitta interfeys, bir nechta metod. Ya’ni metodlarni overload yoki override ko’rinishidir. Polimorfizm ikki xil ko’rinishda namoyon bo’ladi - Polimorfizm – bu bitta interfeys, bir nechta metod. Ya’ni metodlarni overload yoki override ko’rinishidir. Polimorfizm ikki xil ko’rinishda namoyon bo’ladi
- Compile time polimorfizm bu funksiyalar va operatorlar overloadi, ya’ni funksiyalar va operatorlarning qo’shimcha yuklanishidir (function overloading or operator overloading).
- Runtime polimorfizm bu – vorislik va virtual funksiyalardan foydalanishda vujudga keladi (Function overriding).
virtual funksiya asos sinf a’zosi hisoblanadi va voris sinfda qayta bir xil parametr asosida e’lon qilinadi. - virtual funksiya asos sinf a’zosi hisoblanadi va voris sinfda qayta bir xil parametr asosida e’lon qilinadi.
- virtual funksiya yaratish uchun, asos sinf ichida funksiya yaratilishi jarayonida virtual kalit so’zidan foydalaniladi.
- Asos sinfda virtual funksiya e’lon qilingan bo’lsa, voris sinfda ushbu funksiya qayta e’lon qilinishi mumkin va o’z xususiyatlaridan kelib chiqqan holda funksiya tanasi boshqacha yozilishi mumkin.
- Ushbu qayta e’lon qilingan funksiyaning barcha parametrlari asos sinfdagi funksiya parametrlari bilan bir xil bo’lishi lozim, misol uchun: funksiya qaytarish tipi, argumentlar soni va tipi
Asos sinfda virtual funksiya yaratilgan va bu voris sinf uchun override qilinishi mumkin. - Asos sinfda virtual funksiya yaratilgan va bu voris sinf uchun override qilinishi mumkin.
- Agar voris sinfda mazkur virtual funksiya override qilinmagan bo’lsa nima bo’ladi?
- Bunda voris sinf obyekti virtual funksiyaga murojaat qiladi, ya’ni asos sinf virtual funksiyasiga.
- Quyida misol keltirilgan:
class base { - class base {
- public:
- virtual void vfunc() {
- cout << "This is base's vfunc().\n";
- } };
- class derived1 : public base {
- public:
- void vfunc() {
- cout << "This is derived1's vfunc().\n";
- }
- };
- class derived2 : public base {
- public:
- // vfunc() override qilinmagan
- };
int main() - int main()
- {
- base *p, b;
- derived1 d1;
- derived2 d2;
- // base sinfga ko’rsatkich
- p = &b;
- p->vfunc(); // base sinf vfunc() virtual funksiyasi
- // derived1 sinfga ko’rsatkich
- p = &d1;
- p->vfunc(); // derived1 sinf vfunc() virtual funksiyasi
- // derived2 sinfga ko’rsatkich
- p = &d2;
- p->vfunc(); // derived2 sinf vfunc() virtual funksiyasi
- return 0;
- }
Asos sinfdan voris olinganda ushbu sinfdagi virtual funksiya ham vorislik xususiyatiga ega bo’ladi. - Asos sinfdan voris olinganda ushbu sinfdagi virtual funksiya ham vorislik xususiyatiga ega bo’ladi.
- Bu shuni bildiradiki, asos sinf virtual funksiyasi voris sinf uchun mavjud bo’lgani bilan birga, ushbu voris sinfdan yana voris olingan holda ham ushbu virtuallik xususiyati saqlanib qoladi. Ya’ni ushbu funksiya ikkinchi voris sinf uchun ham override qilinadi.
- Bu xususiyat bir nechta vorislikda ham saqlanib qoladi.
Asos sinfda virtual funksiya yaratilgan va bu voris sinf uchun override qilinishi mumkin. - Asos sinfda virtual funksiya yaratilgan va bu voris sinf uchun override qilinishi mumkin.
- Agar voris sinfda mazkur virtual funksiya override qilinmagan bo’lsa , voris sinf obyekti virtual funksiyaga murojaat qiladi, ya’ni asos sinf virtual funksiyasiga.
C++ tilida kamida bitta virtual funksiyaga ega bo’lgan sinf abstrakt sinf deyiladi. - C++ tilida kamida bitta virtual funksiyaga ega bo’lgan sinf abstrakt sinf deyiladi.
- Abstrakt sinfning asosiy xususiyatidan biri shuki, ushbu turdagi sinfdan obyekt olib bo’lmaydi.
- Demak sinfni to’la abstractligini ta’minlash uchun quyidagi qonuniyatdan foydalanamiz:
- class base{
- public:
- virtual vfunc(args....) = 0;
- ..... }
Sinf – bu dasturchi tomonidan yaratilgan sun’iy tur hisoblanadi. - Sinf – bu dasturchi tomonidan yaratilgan sun’iy tur hisoblanadi.
- Sinf orqali ob’yektlar hosil qilinadi. Ob’yektlar orqali esa sinf maydonlariga murojaat qilinadi.
Маълумотларни абстрактцияси деганда нима тушунилади? - Маълумотларни абстрактцияси деганда нима тушунилади?
- Класс нима ?
- Конструктор қандай ишни бажаради?
- Деконструктор вазифаси нима ?
- Sinf ichki berilganlariga murojaatni qanday cheklab qo‘yishi mumkin?
- friend funksiya ga ta’rif bering
- Inkapsulatsiya tushunchasini yoriting
- Merosho’rlik tushunchasiga ta’rif bering
- Polimorfizm tushunchasi nimani anglatadi
- Virtual funksiya ga ta’rif bering
-
- Herbert Shield “C++ The complete references – fourth edition” 2003. Part -2, Chapter – 17.
- TutorialsPoint – simply easy learning programming: http://www.tutorialspoint.com/cplusplus/cpp_inheritance.htm
- http://www.questionscompiled.com/answer/cpp/148/compile-time-polymorphism-and-run-time-polymorphism
Do'stlaringiz bilan baham: |