logo

SINFLAR VA OBYEKTLAR (DASTURLASH)

Загружено в:

08.08.2023

Скачано:

0

Размер:

33.12890625 KB
SINFLAR VA OBYEKTLAR (DASTURLASH)
Reja:
 
1.       Obyekt tushunchasi.
2.       Sinf tushunchasi.
3.       Murojaat huquqlari.
4.       Konstruktor.
5.       Destruktor.
 
Sinf-struktura tushunchasi kengaytmasi sifatida. Sinflarni eng sodda holda quyidagicha tasvirlash 
mumkin:
Sinf-kaliti Sinf-soni {komponentalar ro‘yxati}
Sinf komponentalari sodda holda tiplangan ma’lumotlar va funksiyalardan iborat bo‘ladi. Figurali 
kavslarga olingan komponentalar ro‘yxati Sinf tanasi deb ataladi. Sinfga tegishli funksiyalar 
komponenta-funksiyalar yoki sinf funksiyalari deb ataladi.
Sinf kaliti sifatida Struct xizmatchi so‘zi ishlatilishi mumkin. Masalan quyidagi konstruksiya 
kompleks son sinfini kiritadi.
struct complex
{
double real;
double imag;
void define (double re=0.0, double im=0.0)
{
real=re; imag=im;
}
void display (void)
{
cout<=”real=”<<real;
cout<=”imag=”<<imag;
}
};
Strukturadan bu sinfning farqi shuki komponenta ma’lumotlardan (real, imag) tashqari ikkita 
komponenta funksiya (define() va display ()) kiritilgan.
Bu kiritilgan sinf o‘zgaruvchilar tipi deb karalishi mumkin. Bu tiplar erdamida konkret ob’ektlarni 
quyidagicha tasvirlash mumkin:
Misol uchun:
complex x,y;
complex dim[8];
Sinfga tegishli ob’ektlar quyidagicha tasvirlanadi;
SINF-NOMI.OB’EKT-NOMI
Dasturda ob’ekt komponentasiga quyidagicha murojat kilish mumkin:
Sinf-nomi.ob’ekt-nomi :: komponenta-nomi   yoki soddarok holda
Ob’ekt-nomi. Element-nomi
 
Misol uchun:
x.real=1.24;
x.imag=0.0; dim[3]. Real=0.25;
dim[3]. Imag=0.0;
Sinfga tegishli funksiyalarga quyidagicha murojat qilinadi:
ob’ekt-nomi. funksiya-nomi
Misol uchun:
X. define(0.9) (Bu holda real=0.9 va imag=0.0)
X. define(4.3,20.0) (Bu holda kompleks son 4.3+i*20.0)
Display funksiyasi ekranda kompleks son qiymatlarini tasvirlaydi.
Komponenta     o‘zgaruvchilar va     komponenta funksiyalar.Sinf 
kompanenta     o‘zgaruvchilari     sifatida     o‘zgaruvchilar ,     massivlar, ko‘rsatkichlar ishlatilishi mumkin. 
Elementlar     ta’riflanganda initsializatsiya     kilish     mumkin emas. Buning sababi shuki sinf 
uchun     xotiradan     joy     ajratilmaydi. Kompanenta elementlariga 
kompanenta     funksiyalar     orkali     murojat     qilinganda     faqat nomlari ishlatiladi Sinfdan 
tashqarida     sinf elementlariga emas ob’ekt     elementlariga     murojat     kilish mumkin .     Bu 
murojat     ikki xil bo‘lishi mumkindir.
Ob’ekt- nomi . Element -     nomi.
Sinf elementlari     sinfga tegishli funksiyalarida ishlatilishidan     oldin ta’riflangan     bo‘lishi shart emas. 
Xuddi shunday bir     funksiyadan xali     ta’rifi berilmagan     ikkinchi     funksiyaga     murojaat kilish 
mumkin.
Komponentalarga murojaat xukuklari.   Komponentalarga murojaat xuquqi murojaat 
spetsifikatorlari yordamida boshkariladi. Bu spetsifikatorlar:
Protected   – ximoyalangan;
Private   – xususiy;
Public   – umumiy;
Ximoyalangan kompanentalardan sinflar ierarxiyasi qurilganda foydalaniladi. Oddiy 
holda   Protected   spetsifikatori   Private   spetsifikatoriga ekvivalentdir. Umumiy ya’ni Public tipidagi 
komponentalarga dasturning ixtiyoriy joyida murojaat kilinishi mumkin.
Xususiy ya’ni   Private   tipidagi komponentalarga sinf tashqarisidan murojaat qilish mumkin emas. 
Agar sinflar Struct xizmatchi so‘zi bilan kiritilgan bo‘lsa, uning hamma komponentalari umumiy 
Public bo‘ladi, lekin bu xuquqni murojaat spetsifikatorlari yordamida o‘zgartirish mumkin.
Agar sinf   Class   xizmatchi so‘zi orkali ta’riflangan bo‘lsa, uning hamma komponentalari xususiy 
bo‘ladi. Lekin bu xuquqni murojaat spetsifikatorlari yordamida o‘zgartirish mumkindir.
Bu spetsifikator yordamida sinflar umumiy holda quyidagicha ta’riflanadi:
 
class class_name
{   
int data_member; // Ma’lumot-element
void show_member(int); // Funksiya-element
};
Sinf ta’riflangandan so‘ng, shu sinf tipidagi o‘zgaruvchilarni(ob’ektlarni) quyidagicha ta’riflash 
mumkin:
class_name object_one, object_two, object_three;
Quyidagi misolda   employee,   sinfi kiritilgandir:
class employee
{
    public:
    long employee_id;
    float salary;
    void show_employee(void) {
  cout<<"Nomer: "<<employee_id<<endl;
  cout<<"Maosh: "<<salary<<endl;
};
};
Bu sinf ikki o‘zgaruvchi va bitta funksiya-elementga ega.
  Quyidagi dastur ikki employee ob’ektini yaratadi. Nuqta operatordan foydalanib ma’lumot 
elementlarga qiymat beriladi so‘ngra   show_employee   elementidan foydalanib xizmatchi xakidagi 
ma’lumot ekranga chikariladi:
#include <iostream>
using namespace std;
class employee
{
    public:
    long employee_id;
    float salary;
    void show_employee(void)
{
  cout<<"Nomer: "<<employee_id<<endl;
  cout<<"Maosh: "<<salary<<endl;
};
};
int main()
{
employee worker, boss;
worker.employee_id = 12345;
worker.salary = 25000;
boss.employee_id = 101;
boss.salary = 101101.00;
cout<<"\n"<<"ishchi"<<endl;
worker.show_employee();
cout<<"\n"<<"boss"<<endl;
boss.show_employee();
return 0;
}
Komponenta funksiya ta’rifi.   Komponenta funksiya albatta sinf tanasida ta’riflangan bo‘lishi lozim. 
Global funksiyalardan farqli komponenta funksiya sinfning hamma komponentalariga murojat 
qilishi mumkin. Funksiyaning faqat prototipi emas to‘la ta’rifi sinf tanasida joylashgan bo‘lsa, bu 
funksiya joylashtiruvchi (inline) funksiya hisoblanadi. Ma’lumki inline funksiyalardassikllar, kalit 
bo‘yicha o‘tish operatori ishlatilishi mumkin emas. Bundan tashqari bunday funksiyalar rekursiv 
funksiya bo‘lolmaydi. Bu chegaralarni engish uchun sinf tanasiga faqat funksiya prototipi 
joylashtirilib, funksiyaning to‘la ta’rifi sinf tashqarisida dasturga kiruvchi boshqa funksiyalar bilan 
birga beriladi. Komponenta funksiyani sinf tashqarisida ta’riflanganda, qaysi sinfga tegishli 
ekanligini quyidagi shaklda ko‘rsatiladi:
Sinf-nomi :: Komponenta funksiya-nomi
Sinf tanasiga komponenta funksiya prototipi quyidagi shaklda joylashtiriladi:
  Tip funksiya-nomi(formal-parametrlar-ta’rifi)
Sinf tashqarisida funksiya quyidagi shaklda ta’riflanadi:
  Tip sinf-nomi :: funksiya-nomi(formal-parametrlar-spetsifikatsiyasi) { funksiya tanasi };
Oldingi misoldagi     employee   sinfida funksiya sinf ichida ta’riflangan. Bunday funksiya 
joylanuvchi   (inline) funksiya   deb qaraladi.
  Funksiyani sinf tashqarisida ta’riflab sinf ichiga funksiya prototipini joylashtirish mumkin. Sinf ta’rifi
bu holda quyidagi ko‘rinishda bo‘ladi:
class employee
{
    public:
    long employee_id;
    float salary;
    void show_employee(void);
};
Har xil funksiyalar bir xil nomli funksiyalardan foydalanishi mumkin bo‘lgani uchun funksiya nomi 
sinf nomi va global ruxsat operatori belgisi (::) qo‘yilishi lozim.
void employee::show_employee(void)
{
  cout<<"Nomer: "<<employee_id<<endl;
  cout<<"Maosh: "<<salary<<endl;
};
Funksiya sinf tashqarisida ta’riflangan bo‘lsa ularni inline funksiya sifatida qarash uchun funksiya 
ta’rifida inline so‘zi aniq ko‘rsatilgan bo‘lishi kerak.
Quyidagi dastur   show_employee   funksiyasi ta’rifini sinf tashqarisiga joylashtiradi va inline so‘zi anik
ko‘rsatiladi:
#include <iostream>
using namespace std;
class employee
{
    public:
    long employee_id;
    float salary;
    void show_employee(void);
};
inline void employee::show_employee(void)
{
  cout<<"Nomer: "<<employee_id<<endl;
  cout<<"Maosh: "<<salary<<endl;
};
 
int main()
{
employee worker, boss;
worker.employee_id = 12345;
worker.salary = 25000;
boss.employee_id = 101;
boss.salary = 101101.00;
cout<<"\n"<<"ishchi"<<endl;
worker.show_employee();
cout<<"\n"<<"boss"<<endl;
boss.show_employee(); return 0;
}
KONSTRUKTORLAR. KONSTRUKTORLAR BU SINF KOMPONENTA FUNKSIYALARI BO‘LIB, 
OB’EKTLARNI AVTOMATIK INITSIALIZATSIYA QILISH UCHUN ISHLATILADI.
Konstruktorlar ko‘rinishi quyidagicha bo‘lishi mumkin:
    Sinf nomi (formal parametrlar ro‘yxati)
    {konstruktor tanasi}
Bu komponenta funksiya nomi sinf nomi bilan bir xil bo‘lishi lozim.
Misol uchun complex sinfi uchun konstruktorni quyidagicha kiritish mumkin :
complex (double re = 0.0; double im = 0.0 )
    {real=re; imag=im;}
 
Konstruktorlar uchun qaytariluvchi tiplar, xatto void tipi ham ko‘rsatilmaydi. Dasturchi tomonidan 
ko‘rsatilmagan holda ham ob’ekt yaratilganda konstruktor avtomatik ravishda chaqiriladi.
Masalan ob’ekt complex cc; shaklida aniqlangan bo‘lsa, konstruktor avtomatik chaqirilib
real va imag parametrlari avtomatik ravishda 0.0 qiymatlariga ega bo‘ladi.
Ko‘zda tutilgan holda parametrsiz konstruktor va quyidagi tipdagi nusxa olish konstruktorlari 
yaratiladi:     T :: T (const T&)
Misol uchun
class F
{...
                        public : F(const T&)
                        ...
    }
Sinfda bir nechta konstruktorlar bo‘lishi mumkin, lekin ularning faqat bittasida parametrlar 
qiymatlari oldindan ko‘rsatilgan bo‘lishi kerak.
Konstruktor adresini hisoblash mumkin emas. Konstruktor parametri sifatida o‘z sinfining nomini 
ishlatish mumkin emas, lekin bu nomga ko‘rsatkichdan foydalanish mumkin.
Konstruktorni oddiy komponenta funksiya sifatida chakirib bo‘lmaydi. Konstruktorni ikki xil shaklda
chaqirish mumkin :
Sinf_nomi .Ob’ekt_nomi     (konstruktor_xaqiqiy_parametlari)
Sinf_nomi (konstruktor_xaqiqiy_parametlari)
Birinchi shakl ishlatilganda xaqiqiy parametrlar ro‘yxati bo‘sh bo‘lmasligi lozim. Bu shakldan yangi 
ob’ekt ta’riflanganda foydalaniladi:
complex SS(10.3; 0.22)
// real=10.3; SS.imag= 0.22;
complex EE (2.3)
// EE . real= 2.3;
EE.imag= 0.0;
complex D() // xato
Konstruktorni ikkinchi shaklda chaqirish nomsiz ob’ekt yaratilishiga olib keladi. Bu nomsiz 
ob’ektdan ifodalarda foydalanish mumkin.
Misol uchun :
complex ZZ= complex (4.0;5.0);
Bu ta’rif orkali ZZ ob’ekt yaratilib, unga nomsiz ob’ekt qiymatlari(real= 4.0; imag= 5.0) beriladi;
Konstruktor nomi sinf nomi bilan bir xil bo‘lishi lozimdir. Misol uchun siz employee sinfdan 
foydalansangiz, konstruktor ham employee nomga ega bo‘ladi. Agar dasturda konstruktor ta’rifi 
berilgan bo‘lsa ob’ekt yaratilganda avtomatik chaqiriladi. Quyidagi dasturda employee nomli sinf 
kiritilgandir:  
class employee
{
public:
employee(long, float);
void show_employee(void);
private:
long employee_id;
float salary;
};
Konstruktor ta’rifi:
employee::employee(long empl_id, float sal)
{
employee_id = empl_id;
if (salary < 50000.0)
salary = sal;
else
salary = 0.0;
}
Shu sinfdan foydalanilgan dastur:
#include <iostream>
using namespace std;
class employee
{
public:
employee(long, float);
void show_employee(void);
private:
long employee_id;
float salary;
};
employee::employee(long empl_id, float sal)
{
employee_id = empl_id;
if (salary < 50000.0)
salary = sal;
else
salary = 0.0;
}
void employee::show_employee(void)
{
cout << "Nomer: " << employee_id << endl;
cout << "Maosh: " << salary << endl;
}
int main()
{
employee worker(101, 10101.0);
cout<<"ishchi"<<endl;
worker.show_employee(); return 0;
}
Konstruktordan foydalanib ob’ekt ta’rifilanganda parametr uzatish mumkin: employee worker(101, 
10101.0);
Agar dasturda employee tipidagi ob’ektlar mavjud bo‘lsa har birini quyidagicha initsializatsiya qilish
mumkin
employee worker(101, 10101.0);
employee secretary(57, 20000.0);
employee manager(1022, 30000.0);
KONSTRUKTORLAR VA KO‘ZDA TUTILGAN QIYMATLAR. KONSTRUKTORLARDA KO‘ZDA TUTILGAN 
QIYMATLARDAN HAM FOYDALANISH MUMKINDIR. MISOL UCHUN QUYIDAGI KONSTRUKTOR 
EMPLOYEE MAOSHI QIYMATINI DASTURDA KO‘RSATILMAGAN BO‘LSA 10000.0 TENG QILIB OLADI:
employee::employee(long empl_id, float sal = 100.00)
{
employee_id = empl_id;
if (salary < 50000.0)
salary = sal;
else
salary = 0.0;
}
KONSTRUKTORLARNI QO‘SHIMCHA YUKLASH. C++ TILIDA KONSTRUKTORLARNI HAM QO‘SHIMCHA
YUKLASH MUMKINDIR. QUYIDAGI DASTURDA KONSTRUKTOR EMPLOYEE QO‘SHIMCHA 
YUKLANGANDIR. BIRINCHI KONSTRUKTOR, DASTUR XIZMATCHI, NOMER VA OYLIGI 
KO‘RSATILISHINI TALAB QILADI. IKKINCHI KONSTRUKTOR OYLIKNI KIRITILISHINI SO‘RAYDI. SINF 
TA’RIFI ICHIDA IKKALA KONSTRUKTOR PROTOTIPI KO‘RSATILISHI LOZIM:
#include <iostream>
using namespace std;
class employee
{
public:
employee(long, float);
employee(long);
void show_employee(void);
private:
long employee_id;
float salary;
};
employee::employee(long employee_id, float salary)
{
employee::employee_id = employee_id;
if (salary < 50000.0) employee::salary = salary;
else
employee::salary = 0.0;
}
employee::employee(long employee_id)
{
employee::employee_id = employee_id;
do
{ cout << "Maosh kiriting $50000 dan kichik: ";
cin >> employee::salary;
}
while (salary >= 50000.0);
}
void employee::show_employee(void)
{
cout << "Nomer: " << employee_id << endl;
cout << "Maosh: " << salary << endl;
}
int main()
{
cout<<"ishchi"<<endl;
employee worker(101, 10101.0);
worker.show_employee();
cout<<"manager"<<endl;
employee manager(102);
manager.show_employee();
return 0;
}
Ob’ektlar massivlari. Ob’ektlar massivi ta’riflash uchun sinf ko‘zda tutilgan (parametrsiz) 
konstruktorga ega bo‘lishi kerak.
Ob’ektlar massivi ko‘zda tutilgan konstruktor tomonidan, yoki har bir element uchun konstruktor 
chaqirish yo‘li bilan initsializatsiya qilinishi mumkin.
class complex a[20];   //ko‘zda tutilgan parametrsiz konstruktorni chaqirish
class complex b[2]={complex(10),complex (100)};
//oshkor chaqirish
Quyidagi misolda   player,   sinfi kiritiladi. Dasturda sinf funksiyasi   show_player   va konstruktor 
tashqarisida ta’riflanadi. So‘ngra   player   tipidagi ikki massiv yaratilib, har biri xakidagi ma’lumot 
ekranga chikariladi
#include <iostream>
#include <string>
using namespace std;
class player
{
public:
player();
player (string name,int weight, int age);
void show_player (void);
private:
string name;
int weight;
int age;
};
player::player()
{
name="";
weight = 0;
age = 0; };
player::player(string name,int weight, int age)
{
player::name=name;
player::weight = weight;
player::age = age;
};
void player::show_player (void)
{
cout<<"Ism: " << name << endl;
cout<<"Vazn: " << weight << endl;
cout<<"Yosh: " << age << endl;
}
class array_player
{ public:
void show_array(player a[],int n)
{ for(int i=0;i<n;i++)
{a[i].show_player();cout<<endl;}}
void input_array(player a[],int n)
{string name;int weight,age;
for(int i=0;i<n;i++)
{cin>>name>>weight>>age;
a[i]=player(name,weight,age);
}
}
};
 
int main()
{array_player arr;
Player happy[]={player("Olimov",58,24),
player("Alimov",72,35)};
arr.show_array(happy,2);
player matt[2];
arr.input_array(matt,2);
arr.show_array(matt,2);
return 0;
}
Initsializatorlar ro‘yxati. Konstruktor yordamida ob’ekt ma’lumotlarni initsiyalizatsiyalashni ikkita 
usuli mavjud.
Birinchi usulda parametrlar qiymatlari konstruktor tanasiga uzatiladi. Ikinchi usulda esa ushbu 
sinfdagi initsializatorlar ro‘yxatidan foydalanish nazarda tutilgan. Bu ro‘yxat parametrlar ro‘yxati va 
konstruktor tanasi orasiga joylashadi. Ro‘yxatdagi har bir initsializator konkret aniq komponentaga
bog‘liq va quyidagi ko‘rinishga ega:
<nom> (<ifoda>)
Destruktorlar. Sinfning biror ob’ekti uchun ajratilgan xotira ob’ekt yukotilgandan so‘ng bo‘shatilishi 
lozimdir.
Sinflarning maxsus komponentalari destruktorlar, bu vazifani avtomatik bajarish imkonini yaratadi.
Destruktorni standart shakli quyidagicha :
~ sinf_nomi ( ) {destruktor tanasi} Destruktor parametri yoki qaytariluvchi qiymatga ega bo‘lishi mumkin emas (xatto void tipidagi).
Agar sinfda oshkor destruktor mavjud bo‘lmasa, ko‘zda tutilgan destruktor chaqiriladi.
Dastur ob’ektni o‘chirganda destruktor avtomatik chaqiriladi.
Misol:
#include <iostream>
using namespace std;
class Person
{
public:
Person ()
{
cout<<"Yaratidi"<<endl;
}
~Person ()
{
cout<<"O'chirldi"<<endl;
}
};
int main()
{
{
Person work;
}
int kk;cin>>kk;
return 0;
}
Natija
Yaratidi
O'chirldi
Ma’lumotlar elementidan birgalikda foydalanish. Odatda, ma’lum sinf ob’ektlari yaratilayotganda, 
har bir ob’ekt o‘z-o‘zining ma’lumotlar elementlari to‘plamini oladi. Biroq shunday hollar ham 
yuzaga keladiki, unda bir xil sinflar ob’ektlariga bir yoki bir nechta ma’lumotlar elementlaridan 
(statik ma’lumotlar elementlaridan) birgalikda foydalanish kerak bo‘lib qoladi. Bunday hollarda 
ma’lumotlar elementlari umumiy yoki juz’iy deb e’lon qilinadi, keyin esa tur oldidan, quyida 
ko‘rsatilganidek, static kalit-so‘z keladi:
private;
static int shared_value;
Sinf e’lon qilingach, elementni sinfdan tashqaridagi global o‘zgaruvchi sifatida e’lon qilish kerak. Bu 
quyida shunday ko‘rsatilgan:
int class_name::shared_value;
Navbatdagi dastur book_series sinfini aniqlaydi. Bu sinf (seriya)ning barcha ob’ektlari (kitoblari) 
uchun bir xilda bo‘lgan page_count elementidan birgalikda foydalanadi. Agar dastur ushbu 
element qiymatini o‘zgartirsa, bu o‘zgarish shu ondayoq barcha sinf ob’ektlarida o‘z aksini topadi:
#include <iostream>
using namespace std;
class book_series
{
public:
    book_series(float);     void show_book(void);
    void set_pages(int) ;
private:
    static int page_count;
    float price;
};
int book_series::page_count;
void book_series::set_pages(int pages)
{
    page_count = pages;
}
book_series::book_series(float price)
{
    book_series::price = price;
}
void book_series:: show_book (void)
{
    cout << "Narx: " << price << endl;
    cout << "Betlar: " << page_count << endl;
}
int main()
{
    book_series programming(213.95);
    book_series word(19.95);
    word.set_pages(256);
    programming.show_book ();
    word.show_book() ;
    cout << endl << "page_count ning o'zgarishi " << endl;
    programming.set_pages(512);
    programming.show_book();
    word.show_book();
return 0;
}
Ko‘rinib turganidek, sinf   page_count   ni   static int   sifatida e’lon qiladi. Sinfni aniqlagandan so‘ng, 
dastur shu vaqtning o‘zida page_count elementini global o‘zgaruvchi sifatida e’lon qiladi. Dastur 
page_count elementini o‘zgartirganda, o‘zgarish shu vaqtning o‘zidayoq book_series sinfining 
barcha ob’ektlarida namoyon bo‘ladi.
Agar ob’ektlar mavjud bo‘lmasa, public static atributli elementlardan foydalanish. Sinf elementini 
static kabi e’lon qilishda bu element ushbu sinfning barcha ob’ektlari tomonidan birgalikda 
qo‘llanadi. Biroq shunday vaziyatlar yuz berishi mumkinki, dastur hali ob’ektni yaratganicha yo‘q, 
ammo u elementdan foydalanishi kerak. Elementdan foydalanish uchun dastur uni public va static 
sifatida e’lon qilishi kerak. Masalan, quyidagi dasturda, xatto book_series sinfidagi ob’ektlar mavjud
bo‘lmasa ham, bu sinfning page_count elementidan foydalaniladi:
#include <iostream>
using namespace std;
class book_series
{
public:
static int page_count; private:
float price;
};
int book_series::page_count;
int main()
{
book_series::page_count = 256;
cout << "page_count ning joriy qiymati " << book_series::page_count <<"ga teng"<<endl;
return 0;
}
Bu o‘rinda, sinf page_count sinfi elementini public sifatida e’lon qilgani uchun, xatto agar 
book_series sinfidagi ob’ektlar mavjud bo‘lmasa ham, dastur sinfning ushbu elementiga murojaat 
qilishi mumkin.
Statik funksiya elementlardan foydalanish. Avvalgi dastur ma’lumotlar   statik   elementlarining 
qo‘llanishini ko‘rsatib bergan edi. C++xuddi shunday usul bilan   statik   funksiya-elementlar (usullar)ni
aniqlash imkonini beradi. Agar   statik   usul yaratilayotgan bo‘lsa, dastur bunday usulni, xatto uning 
ob’ektlari yaratilmagan holda ham, chaqirib olishi mumkin. Masalan, agar sinf sinfdan tashqari 
ma’lumotlar uchun qo‘llanishi mumkin bo‘lgan usulga ega bo‘lsa, siz bu usulni statik qila olishingiz 
mumkin bo‘lardi. Funksiyadan foydalanish uchun dastur uni public va static sifatida e’lon qilishi 
kerak. Masalan, quyidagi dasturda, xatto book_series sinfidagi ob’ektlar mavjud bo‘lmasa ham, bu 
sinfning show_count() usulidan foydalaniladi:
#include <iostream>
using namespace std;
class book_series
{
public:
    static int show_count() { return page_count;};
private:
    float price;
    static int page_count;
};
int book_series::page_count=256;
int main()
{
cout << "page_count ning joriy qiymati " << book_series::show_count() <<"ga teng"<< endl;
 
return 0;
}

SINFLAR VA OBYEKTLAR (DASTURLASH) Reja:   1.       Obyekt tushunchasi. 2.       Sinf tushunchasi. 3.       Murojaat huquqlari. 4.       Konstruktor. 5.       Destruktor.   Sinf-struktura tushunchasi kengaytmasi sifatida. Sinflarni eng sodda holda quyidagicha tasvirlash mumkin: Sinf-kaliti Sinf-soni {komponentalar ro‘yxati} Sinf komponentalari sodda holda tiplangan ma’lumotlar va funksiyalardan iborat bo‘ladi. Figurali kavslarga olingan komponentalar ro‘yxati Sinf tanasi deb ataladi. Sinfga tegishli funksiyalar komponenta-funksiyalar yoki sinf funksiyalari deb ataladi. Sinf kaliti sifatida Struct xizmatchi so‘zi ishlatilishi mumkin. Masalan quyidagi konstruksiya kompleks son sinfini kiritadi. struct complex { double real; double imag; void define (double re=0.0, double im=0.0) { real=re; imag=im; } void display (void) { cout<=”real=”<<real; cout<=”imag=”<<imag; } }; Strukturadan bu sinfning farqi shuki komponenta ma’lumotlardan (real, imag) tashqari ikkita komponenta funksiya (define() va display ()) kiritilgan. Bu kiritilgan sinf o‘zgaruvchilar tipi deb karalishi mumkin. Bu tiplar erdamida konkret ob’ektlarni quyidagicha tasvirlash mumkin: Misol uchun: complex x,y; complex dim[8]; Sinfga tegishli ob’ektlar quyidagicha tasvirlanadi; SINF-NOMI.OB’EKT-NOMI Dasturda ob’ekt komponentasiga quyidagicha murojat kilish mumkin: Sinf-nomi.ob’ekt-nomi :: komponenta-nomi   yoki soddarok holda Ob’ekt-nomi. Element-nomi   Misol uchun: x.real=1.24; x.imag=0.0;

dim[3]. Real=0.25; dim[3]. Imag=0.0; Sinfga tegishli funksiyalarga quyidagicha murojat qilinadi: ob’ekt-nomi. funksiya-nomi Misol uchun: X. define(0.9) (Bu holda real=0.9 va imag=0.0) X. define(4.3,20.0) (Bu holda kompleks son 4.3+i*20.0) Display funksiyasi ekranda kompleks son qiymatlarini tasvirlaydi. Komponenta     o‘zgaruvchilar va     komponenta funksiyalar.Sinf kompanenta     o‘zgaruvchilari     sifatida     o‘zgaruvchilar ,     massivlar, ko‘rsatkichlar ishlatilishi mumkin. Elementlar     ta’riflanganda initsializatsiya     kilish     mumkin emas. Buning sababi shuki sinf uchun     xotiradan     joy     ajratilmaydi. Kompanenta elementlariga kompanenta     funksiyalar     orkali     murojat     qilinganda     faqat nomlari ishlatiladi Sinfdan tashqarida     sinf elementlariga emas ob’ekt     elementlariga     murojat     kilish mumkin .     Bu murojat     ikki xil bo‘lishi mumkindir. Ob’ekt- nomi . Element -     nomi. Sinf elementlari     sinfga tegishli funksiyalarida ishlatilishidan     oldin ta’riflangan     bo‘lishi shart emas. Xuddi shunday bir     funksiyadan xali     ta’rifi berilmagan     ikkinchi     funksiyaga     murojaat kilish mumkin. Komponentalarga murojaat xukuklari.   Komponentalarga murojaat xuquqi murojaat spetsifikatorlari yordamida boshkariladi. Bu spetsifikatorlar: Protected   – ximoyalangan; Private   – xususiy; Public   – umumiy; Ximoyalangan kompanentalardan sinflar ierarxiyasi qurilganda foydalaniladi. Oddiy holda   Protected   spetsifikatori   Private   spetsifikatoriga ekvivalentdir. Umumiy ya’ni Public tipidagi komponentalarga dasturning ixtiyoriy joyida murojaat kilinishi mumkin. Xususiy ya’ni   Private   tipidagi komponentalarga sinf tashqarisidan murojaat qilish mumkin emas. Agar sinflar Struct xizmatchi so‘zi bilan kiritilgan bo‘lsa, uning hamma komponentalari umumiy Public bo‘ladi, lekin bu xuquqni murojaat spetsifikatorlari yordamida o‘zgartirish mumkin. Agar sinf   Class   xizmatchi so‘zi orkali ta’riflangan bo‘lsa, uning hamma komponentalari xususiy bo‘ladi. Lekin bu xuquqni murojaat spetsifikatorlari yordamida o‘zgartirish mumkindir. Bu spetsifikator yordamida sinflar umumiy holda quyidagicha ta’riflanadi:   class class_name {   int data_member; // Ma’lumot-element void show_member(int); // Funksiya-element }; Sinf ta’riflangandan so‘ng, shu sinf tipidagi o‘zgaruvchilarni(ob’ektlarni) quyidagicha ta’riflash mumkin: class_name object_one, object_two, object_three; Quyidagi misolda   employee,   sinfi kiritilgandir: class employee {     public:     long employee_id;     float salary;     void show_employee(void)

{   cout<<"Nomer: "<<employee_id<<endl;   cout<<"Maosh: "<<salary<<endl; }; }; Bu sinf ikki o‘zgaruvchi va bitta funksiya-elementga ega.   Quyidagi dastur ikki employee ob’ektini yaratadi. Nuqta operatordan foydalanib ma’lumot elementlarga qiymat beriladi so‘ngra   show_employee   elementidan foydalanib xizmatchi xakidagi ma’lumot ekranga chikariladi: #include <iostream> using namespace std; class employee {     public:     long employee_id;     float salary;     void show_employee(void) {   cout<<"Nomer: "<<employee_id<<endl;   cout<<"Maosh: "<<salary<<endl; }; }; int main() { employee worker, boss; worker.employee_id = 12345; worker.salary = 25000; boss.employee_id = 101; boss.salary = 101101.00; cout<<"\n"<<"ishchi"<<endl; worker.show_employee(); cout<<"\n"<<"boss"<<endl; boss.show_employee(); return 0; } Komponenta funksiya ta’rifi.   Komponenta funksiya albatta sinf tanasida ta’riflangan bo‘lishi lozim. Global funksiyalardan farqli komponenta funksiya sinfning hamma komponentalariga murojat qilishi mumkin. Funksiyaning faqat prototipi emas to‘la ta’rifi sinf tanasida joylashgan bo‘lsa, bu funksiya joylashtiruvchi (inline) funksiya hisoblanadi. Ma’lumki inline funksiyalardassikllar, kalit bo‘yicha o‘tish operatori ishlatilishi mumkin emas. Bundan tashqari bunday funksiyalar rekursiv funksiya bo‘lolmaydi. Bu chegaralarni engish uchun sinf tanasiga faqat funksiya prototipi joylashtirilib, funksiyaning to‘la ta’rifi sinf tashqarisida dasturga kiruvchi boshqa funksiyalar bilan birga beriladi. Komponenta funksiyani sinf tashqarisida ta’riflanganda, qaysi sinfga tegishli ekanligini quyidagi shaklda ko‘rsatiladi: Sinf-nomi :: Komponenta funksiya-nomi Sinf tanasiga komponenta funksiya prototipi quyidagi shaklda joylashtiriladi:   Tip funksiya-nomi(formal-parametrlar-ta’rifi) Sinf tashqarisida funksiya quyidagi shaklda ta’riflanadi:   Tip sinf-nomi :: funksiya-nomi(formal-parametrlar-spetsifikatsiyasi)

{ funksiya tanasi }; Oldingi misoldagi     employee   sinfida funksiya sinf ichida ta’riflangan. Bunday funksiya joylanuvchi   (inline) funksiya   deb qaraladi.   Funksiyani sinf tashqarisida ta’riflab sinf ichiga funksiya prototipini joylashtirish mumkin. Sinf ta’rifi bu holda quyidagi ko‘rinishda bo‘ladi: class employee {     public:     long employee_id;     float salary;     void show_employee(void); }; Har xil funksiyalar bir xil nomli funksiyalardan foydalanishi mumkin bo‘lgani uchun funksiya nomi sinf nomi va global ruxsat operatori belgisi (::) qo‘yilishi lozim. void employee::show_employee(void) {   cout<<"Nomer: "<<employee_id<<endl;   cout<<"Maosh: "<<salary<<endl; }; Funksiya sinf tashqarisida ta’riflangan bo‘lsa ularni inline funksiya sifatida qarash uchun funksiya ta’rifida inline so‘zi aniq ko‘rsatilgan bo‘lishi kerak. Quyidagi dastur   show_employee   funksiyasi ta’rifini sinf tashqarisiga joylashtiradi va inline so‘zi anik ko‘rsatiladi: #include <iostream> using namespace std; class employee {     public:     long employee_id;     float salary;     void show_employee(void); }; inline void employee::show_employee(void) {   cout<<"Nomer: "<<employee_id<<endl;   cout<<"Maosh: "<<salary<<endl; };   int main() { employee worker, boss; worker.employee_id = 12345; worker.salary = 25000; boss.employee_id = 101; boss.salary = 101101.00; cout<<"\n"<<"ishchi"<<endl; worker.show_employee(); cout<<"\n"<<"boss"<<endl; boss.show_employee();

return 0; } KONSTRUKTORLAR. KONSTRUKTORLAR BU SINF KOMPONENTA FUNKSIYALARI BO‘LIB, OB’EKTLARNI AVTOMATIK INITSIALIZATSIYA QILISH UCHUN ISHLATILADI. Konstruktorlar ko‘rinishi quyidagicha bo‘lishi mumkin:     Sinf nomi (formal parametrlar ro‘yxati)     {konstruktor tanasi} Bu komponenta funksiya nomi sinf nomi bilan bir xil bo‘lishi lozim. Misol uchun complex sinfi uchun konstruktorni quyidagicha kiritish mumkin : complex (double re = 0.0; double im = 0.0 )     {real=re; imag=im;}   Konstruktorlar uchun qaytariluvchi tiplar, xatto void tipi ham ko‘rsatilmaydi. Dasturchi tomonidan ko‘rsatilmagan holda ham ob’ekt yaratilganda konstruktor avtomatik ravishda chaqiriladi. Masalan ob’ekt complex cc; shaklida aniqlangan bo‘lsa, konstruktor avtomatik chaqirilib real va imag parametrlari avtomatik ravishda 0.0 qiymatlariga ega bo‘ladi. Ko‘zda tutilgan holda parametrsiz konstruktor va quyidagi tipdagi nusxa olish konstruktorlari yaratiladi:     T :: T (const T&) Misol uchun class F {...                         public : F(const T&)                         ...     } Sinfda bir nechta konstruktorlar bo‘lishi mumkin, lekin ularning faqat bittasida parametrlar qiymatlari oldindan ko‘rsatilgan bo‘lishi kerak. Konstruktor adresini hisoblash mumkin emas. Konstruktor parametri sifatida o‘z sinfining nomini ishlatish mumkin emas, lekin bu nomga ko‘rsatkichdan foydalanish mumkin. Konstruktorni oddiy komponenta funksiya sifatida chakirib bo‘lmaydi. Konstruktorni ikki xil shaklda chaqirish mumkin : Sinf_nomi .Ob’ekt_nomi     (konstruktor_xaqiqiy_parametlari) Sinf_nomi (konstruktor_xaqiqiy_parametlari) Birinchi shakl ishlatilganda xaqiqiy parametrlar ro‘yxati bo‘sh bo‘lmasligi lozim. Bu shakldan yangi ob’ekt ta’riflanganda foydalaniladi: complex SS(10.3; 0.22) // real=10.3; SS.imag= 0.22; complex EE (2.3) // EE . real= 2.3; EE.imag= 0.0; complex D() // xato Konstruktorni ikkinchi shaklda chaqirish nomsiz ob’ekt yaratilishiga olib keladi. Bu nomsiz ob’ektdan ifodalarda foydalanish mumkin. Misol uchun : complex ZZ= complex (4.0;5.0); Bu ta’rif orkali ZZ ob’ekt yaratilib, unga nomsiz ob’ekt qiymatlari(real= 4.0; imag= 5.0) beriladi; Konstruktor nomi sinf nomi bilan bir xil bo‘lishi lozimdir. Misol uchun siz employee sinfdan foydalansangiz, konstruktor ham employee nomga ega bo‘ladi. Agar dasturda konstruktor ta’rifi berilgan bo‘lsa ob’ekt yaratilganda avtomatik chaqiriladi. Quyidagi dasturda employee nomli sinf kiritilgandir: