Sinf elementlariga ko’rsatkich. ko’rsatkichiniqo’llashga oid misollar
Mavzu : Sinf elementlariga ko’rsatkich. ko’rsatkichiniqo’llashga oid misollar . Ko’pincha ,agar sinfda metodni chaqirsangiz, c++uni qaysi obyekt deb hisoblaydi, degan savol ko’p uchrab turadi. Bu savolda c++ yashirin ko’rsatkichi ishlatadi deb javob berish mumkin. yashirin ko’rsatkichi . Quyidagi butun sonli qiymatni o’z ichiga olgan, konstruktori va yordamchi funksiyalari bo’lgan oddiy sinf berilgan. #include<iostream> Using namespace std; Class Value {private: Int m_number; Public: Value (int number) { setNumber (int number); } Void setNumber (int number) { m_number=number; } Int getNumber() { Return m_number; } }; Int main()
{value v(3); v.setNumber(4); cout<<v.getNumber()<<’\n’; return o; } Dasturni bajarish natijasi: 4 v.setNumber(4) ni chaqirganda c++dasturlash tilida setnumber() funksiyasi boshqa obyektda ishlaydi va m_number aslida V.m_number . Hammasi qanday ishlashini batafsil ko’rib chiqaylik. Masalan, quyidagi qatorni ko’raylik: V.setNumber(4); Garchi bir qarashda bizda faqat bitta bahs bordek tuyulsada aslida ikkita savol bor. Kompilyatsiya vaqtida v.setNumber(4) qatori kompilyator tomonidan quyidagilarga o’zgartiradi. setNumber(&V,4);//boshqa obyekt nuqta oldidan obyekt argumentiga aylantiradi. Bu endi faqat standart funksiya chaqiruvchi va V obyekti (ilgari alohida ibyekt bo’lgan va nuqtadan oldin jelgan) endi funksiya argument sifatida manzilga uzatiladi Funksiya chaqiruvchi hozir ikkata argument mavjud bo’lgani uchun, metod mos ravishda o’zgarishi kerak (shuning uchun ikkita argument kerak bo’ladi). Shunday qilib quyidagi metod: Oddiy metodini tuzishda kompilyator unga parametrni bilvosida qo’shadi ko’rsatkichi sinf metodini chaqiradigan obyektning manzilini o’z ichiga olgan yashirin doimiy ko’rsatkichdir. Yana bitta tafsilot bor. Metod ichida sinfning barcha azolarini (funksiya va o’zgaruvchilar)yangilashingiz kerak, shunda ular ushbu metodni chaqiradigan obyektga murojat qiladi. Buni har biriga ->prefiksini qo’shish orqali qilish oson. Shunday qilib, setNumber () funksiyasining tanasida m_number (sinfning azo o’zgaruvchisi) ->m_number ga aylanadi. Qachon boshqasining manzilini ko’rsatsa , ->m_number V.m_numberga ishora qiladi. Yuqoridagilarni umumlashtirib quyidagilarni aytish mumkin:
-V.setNumber(4) ga murojat qilganda kompilyator aslida setNumber(&another ,4) ni chaqiradi. -setNumber ()ichida ko’rsatkich boshqasining manzilini o’z ichiga oladi. -setNumber() ichidagi har qanday azo o’zgaruvchilar ->prefiksi orqali murojat qiladi. Shunday qilib m_number-number deb aytganimizda, komplyator aslida - >m_number=number ni bajaradi. Muhim jihati shundaki, bularning barchasi(dasturchilar) yashiringan va bu qanday ishlashini eslaysizmi yoki yo’qmi muhim emas. Shuni yodda tutish kerakki, barcha oddiy sinf usullarida *metodikasi chaqiruvchi bilan bog’liq obyektni ko’rsatuvchi ko’rsatkich mavjud. * ko’rsatkichi har doim joriy obyektga ishora qiladi. Endiga dasturlashni o’rganishni boshlagan dasturchilar bazida nechta * ko’rsatkichi borligiga chalkashib ketishadi. Har bir metodda parametr sifatida * ko’rsatkichi mavjud bo’lib, u amalda bajarilayotgan obyektning manzilini ko’rsatadi. Masalan: Int main() { Value X(3); //* -& X Valuekonstruktor ichida Value Y(4); //* -& X Valuekonstruktor ichida X.setNumber(5); //* -& X setNumber metodi ichida Y.setNumber(6); //* -& Y setNumber metodi ichida Return 0; } * ko’rsatkichi navbat bilan x yoki y obyektining manzilini o’z ichiga oladi, qaysi metod chaqirilishiga va hozirda bajarilishga bog’liq. * ko’rsatkichiga oshkor ko’rsatkich. Ko’kina hollarda * ko’rsatkichini aniq ko’rsatkish shart emas . biroq bu bazida foydali bo’lishi mumkin. Misol uchun, agar parametr o’zgaruvchisi bilan bir xil parametrga ega bo’lgan konstruktor (yoki metod) bolsa, uni * ko’rsatkich yordamida ajratib ko’rsatish mumkin. Class Something {private
Int data: Public: Somthing (int data) { ->data=data; } }; Bu holatda konstruktor a’zo o’zgaruvchi bilan bir xil nomdagi parametrni oladi. Bunday holda ma’lumot parametrga -> data a’zo o’zgaruvchiga tegishli. Mavzuga doir mustaqil masalalar: 1-misol Human nomli sinf yarating. Unda 2ta xossa Ushbu xossalarga this ko’rsatkichi orqali qiymat taminlovchi parametrli konstruktor qatnashsin. Main funksiyasida 3 ta obyekt yarating. #include<iostream> using namespace std; class Human { private: string name; int age; public: Human(string name, int age) { this->name=name; this->age=age; } void printInfo()
{ cout<<"ismi: "<<name<<endl; cout<<"yoshi: "<<age<<endl; } }; int main() { Human obj1("Ali",12); Human obj2("Maruf",13); Human obj3("Sardor",10); obj1.printInfo(); obj2.printInfo(); obj3.printInfo(); return 0; } 2-misol Book nomli sinf yarating. Unda 3ta xossa bo’sin. Ushbu xossalarga this ko’rsatkichi orqali qiymat taminlovchi parametrli konstruktor qatnashsin. Main funksiyasida 3 ta obyekt yarating.