logo

Sinf elementlariga ko’rsatkich. ko’rsatkichiniqo’llashga oid misollar

Yuklangan vaqt:

23.11.2024

Ko'chirishlar soni:

0

Hajmi:

51.955078125 KB
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. #include<iostream>
#include<string>
using namespace std;
class Book
{
private:
    string nomi;
    int yili;
    int soni;
public:
    Book(string nomi, int yili,int soni)
    {
        this->nomi=nomi;
        this->yili=yili;
        this->soni=soni;
    }
    void printInfo()
    {
        cout<<"nomi: "<<nomi<<endl;
        cout<<"yili: "<<yili<<endl;
        cout<<"varoqlari soni: "<<soni<<endl;
    }
};
int main()
{
    Book obj1(" Atom ",2012,3);
    Book obj2("Saodat asri",2012,432);     Book obj3("Payg'ambarlar tarixa",1998,453);
    obj1.printInfo();
    obj2.printInfo();
    obj3.printInfo();
    return 0;
}
3-misol
Mashina   nomli   sinf   yarating.   Unda   this   ko’rsatkichidan   foydalaning.   Unda   3ta
xossa
Bo’lsin. Main funksiyasi ichida 2ta obyekt yarating.
#include<iostream>
using namespace std;
class Car
{
private:
    string name;
    int year;
    string color;     public:
    Car(){}
    Car(string name,int year,string color)
    {
        this->name=name;
        this->year=year;
        this->color=color;
    }
    string getName()
    {
        return name;
    }
    int getYear()
    {
        return year;
    }
    string getColor()
    {
        return color;
    }
};
int main()
{
    Car obj1("Jentra",2023,"Qora");
    Car obj2("Nexia", 2022,"Oq");
        cout<<"Mashina   nomi:   "<<obj1.getName()<<"   Mashinaning   ishlab   chiqarilgan
yili: "<<obj1.getYear()<<" Mashina rangi: "<<obj1.getColor()<<endl;         cout<<"Mashina   nomi:   "<<obj2.getName()<<"   Mashinaning   ishlab   chiqarilgan
yili: "<<obj2.getYear()<<" Mashina rangi: "<<obj2.getColor();
}

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.