Savol javobi
Download 104.3 Kb.
|
dasturlash
Savol javobi Polimorfizm", bir nechta sinflarni bir vaqtda bajarish imkonini beradigan obyektlarning o‘zining qobiliyatidir. Boshqa so‘zlar bilan aytganda, Polimorfizm obyektga qarab, u qanday sinfga tegishli bo‘lsa, uning qanday operatsiyalarni bajarishi kerakligini aniqlashga imkon beradi. Polimorfizmni amalga oshirish uchun, sinfda ularning o‘zaro aloqasi bo‘lishi kerak. Bu aloqalar odatda kalit so‘zlar yoki metodlar orqali ifodalangan. Polimorfizmni amalga oshirish uchun shunday ham zarurki, Polimorfizmning yo‘naltirilgan sinfi yoki interfeysini aniqlash kerakdir. Sinchiklab, bir necha sinflar bir interfeysdan nasl olinadi, va har bir sinf o‘zining qobiliyatini o‘zgartiradi. Masalan, bir sinf "shape" interfeysidan olinishi mumkin bo‘lgan "rectangle" va "circle" sinflariga ega bo‘lishi mumkin. "Rectangle" sinfi "width" va "height"ni hisoblash uchun metodlarga ega bo‘lishi mumkin, "circle" sinfi esa radiusni hisoblash uchun metodlarga ega bo‘lishi mumkin. Bunday sinflar "shape" interfeysini bajarish uchun foydalanilgan, ammo ularning o‘zlariga xos imkoniyatlarga ega bo‘lishi mumkin. 2-savol javobi Dastur bajarilishi davomida obyekt turini olish uchun, obyekt nomi yoki obyektning ma'lumotlari to'g'risida hech qanday ma'lumot yo'qken "type()" funktsiyasidan foydalanish mumkin. Bu funktsiya obyektning klassining nomini qaytaradi. Masalan, quyidagi kodda, "my_object" obyekti yaratiladi va "type()" funktsiyasi uning klassining nomini qaytaradi: class MyClass: pass my_object = MyClass() print(type(my_object)) # prints " Boshqa bir usul, obyektni "isinstance()" funktsiyasi yordamida sinf nomi yoki sinflar ro'yxati bilan solishtirib aniqlashdir. Bu usul "True" yoki "False" qiymat qaytaradi. Masalan, quyidagi kodda, "my_object" obyekti "MyClass" sinfidanmi, yoki "ParentClass" yoki "ChildClass" sinflaridanmi yaratilganligini tekshiradi: class MyClass: pass class ParentClass: pass class ChildClass(ParentClass): pass my_object = MyClass() print(isinstance(my_object, MyClass)) # prints "True" print(isinstance(my_object, ParentClass)) # prints "False" print(isinstance(my_object, ChildClass)) # prints "False" Bunday usullar obyektni sinfining aniqlashida yordam beradi va dasturda dinamik turlash (dynamic typing) imkoniyatini beradi. 3-savol javobi Bu savol C++ tilidagi kodlar bilan bog'liq. Ushbu til o'zgaruvchilar va funksiyalar uchun qiymatlarni ma'lum qilish uchun foydalaniladigan ma'lumotlar tipini ta'minlaydi. C++ tilida, "public" kalit so'zi klassning xususiyatlari uchun bir modifikator sifatida ishlatiladi. "static" kalit so'zi esa bir funksiya yoki o'zgaruvchi uchun ishlatiladi va uni klassning obyektlariga bog'liq emas qiladi. Shuningdek, "operator" kalit so'zi bir funksiyani yoritish uchun ishlatiladi. Misol uchun, "<<" operatori chiqish amallarini bajarish uchun ishlatiladi. Savol matnida "type_info" bu ma'lumotlar turini ta'minlaydigan klassni bildiradi. Bu klassda "public" yoki "static" kalit so'zlari yoki "operator" funksiyalari yo'q. "type_info" klassi C++ standard kutubxonasi ichida aniqlangan. 4-savol javobi type_info" sinfi, C++ dasturlash tilida ma'lumotlar turi haqida ma'lumot beruvchi bir sinfdir. "type_info" sinfi obyektlari turini ta'riflashda foydalaniladi va bu sinf a'zolari obyektlarning turini aniqlashda foydalaniladi. C++ tilida, "type_info" sinf a'zolaridan biri virtual bir destructor (virtual bo'sh ochiruvchi) qabul qiladi. Bu, sinfni yordamchi sinf a'zolari yoki sinf obyektlari o'z ichiga olgan turli turdagi obyektlarni ochirish vaqti tugatilganda avtomatik ravishda ishlatiladi. "Type_info" sinfi a'zolaridan foydalanish uchun turli operatorlar mavjud emas. "type_info" sinfi obyekti "typeid" operatoridan foydalanilarak aniqlanadi. "typeid" operatori bitta operand qabul qiladi va bu operandning turini "type_info" sinf a'zosi sifatida aniqlash uchun ishlatiladi. Misol uchun: #include #include using namespace std; int main()
using namespace std; class MyClass {
int main() { MyClass obj; cout << typeid(obj).name() << endl; // sinf nomini konsolga chiqaramiz return 0; } Ushbu dastur yuritilganda, konsolga "MyClass" chiqadi. Bu, "obj" obyektining turini "type_info" sinf a'zosi orqali aniqlaydi va "name()" metodi orqali sinfning nomini olish uchun ishlatiladi. 6-savol javobi = (tenglik belgisi): Almatirish operatori bir o'zgaruvchidan boshqa o'zgaruvchiga qiymat beradi. Misol uchun: int a = 5; int b = a; // "a" ning qiymatini "b" ga nusxalash += (qo'shishga tenglik): Almatirish operatori o'zgaruvchining qiymatini o'ziga qo'shib saqlaydi. Misol uchun: int a = 5; a += 3; // "a" ning qiymati 8 ga o'zgaradi -= (ayirishga tenglik): Almatirish operatori o'zgaruvchining qiymatidan o'ziga ayirib saqlaydi. Misol uchun: int a = 5; a -= 3; // "a" ning qiymati 2 ga o'zgaradi *= (ko'paytirishga tenglik): Almatirish operatori o'zgaruvchining qiymatini o'ziga ko'paytirib saqlaydi. Misol uchun: int a = 5; a *= 3; // "a" ning qiymati 15 ga o'zgaradi /= (bo'lishga tenglik): Almatirish operatori o'zgaruvchining qiymatidan o'ziga bo'lib saqlaydi. Misol uchun: int a = 6; a /= 3; // "a" ning qiymati 2 ga o'zgaradi %= (qoldiqni olishga tenglik): Almatirish operatori o'zgaruvchining qiymatidan o'ziga bo'lingan qoldiqni saqlaydi. Misol uchun: int a = 6; a %= 4; // "a" ning qiymati 2 ga o'zgaradi <<= (chapga kaytirish operatori): Almatirish operatori o'zgaruvchining qiymatini o'ziga olib chapga kaytiradi. Misol uchun: int a = 5; a <<= 2; // "a" ning qiymati 20 ga o'zgaradi = (o'ngga kaytirish operatori): Almatirish operatori o'zgaruvchining qiymatidan o'ziga olib o'ngga kaytiradi. Misol uchun: int a = 20; a >>= 2; // "a" ning qiymati 5 ga o'zgaradi &= (lojik andga tenglik): Almatirish operatori o'zgaruvchining qiymati bilan bitlar orasida "and" operatsiyasini bajara oladi va natijani o'ziga saqlaydi. Misol uchun: int a = 5; a &= 3; // "a" ning qiymati 7-savol javobi dynamic_cast operatori C++ dasturlash tilida turi ko'rsatilgan bir o'bjektni boshqa bir turga o'zgartirishga xizmat qiladi. Bu operator yalnizgina polimorfizm (virtual funksiyalar orqali) yaratilgan klasslar orasida ishlaydi. dynamic_cast operatori obyektni (yoki uning ishorasini) boshqa bir turga o'zgartirishga xizmat qiladi. Shuningdek, bunda xato kuzatilganda, dynamic_cast operatori NULL qiymat qaytaradi, hatto, NULL qiymatni o'zgartirishga harakat qilmaydi. Agar dynamic_cast operatori ishlayotgan klasslarda ikkinchi klass bir bazaviy klass bo'lsa, avtomatik ravishda boshqaruvchi tomonidan yaratilgan obyektlar boshqaruvchi klassiga o'zgartirib bo'lmaydi. Bu holatda, NULL qiymat qaytariladi. dynamic_cast operatorining amali quyidagi ko'rinishda ifodalash mumkin: class Bazaviy { virtual void foo() {} }; class Tugilgan : public Bazaviy {}; class Noyob : public Bazaviy {}; int main() { Bazaviy* obyekt1 = new Tugilgan; Bazaviy* obyekt2 = new Noyob; Tugilgan* tugilgan1 = dynamic_cast Tugilgan* tugilgan2 = dynamic_cast } Bu misolda, Tugilgan va Noyob klasslar Bazaviy klassidan vorislik oladi. Obyekt1 Tugilgan klassining maydoni bo'lib, obyekt2 esa Noyob klassining maydoni bo'lib yaratilgan. dynamic_cast operatori obyekt1 ni Tugilgan klassiga o'zgartirishga muvaffaq bo'ladi, shuningdek, obyekt2 ni Tugilgan klassiga o'zgartirishga urinishda yana NULL qiymat qaytaradi. 8-savol javobi Download 104.3 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling