16. Encapsulation — ma'lumotlarni himoyalash¶
Oldingi bobda inheritance haqida o‘rgandik.
Endi C++ dagi yana bir muhim tushuncha — encapsulation bilan tanishamiz.
Encapsulation — class ichidagi ma'lumotlarni to‘g‘ridan-to‘g‘ri o‘zgartirishni cheklash va ularga nazorat orqali murojaat qilish usuli.
Oddiy qilib aytganda:
Ma'lumotlarni class ichida himoyalab, ularga kerakli funksiyalar orqali murojaat qilamiz.
Nima uchun ma'lumotni himoyalash kerak?¶
Masalan, bank hisobidagi balansni olaylik.
double balans = 1000;
Agar hamma joydan balansni xohlagancha o‘zgartirish mumkin bo‘lsa:
balans = -500000;
kabi noto‘g‘ri qiymat berish mumkin.
Shuning uchun balansni to‘g‘ridan-to‘g‘ri o‘zgartirishga ruxsat bermaslik yaxshi.
private¶
Class ichidagi ma'lumotlarni yashirish uchun private ishlatiladi.
Masalan:
class BankHisobi {
private:
double balans;
public:
void korsat() {
cout << balans;
}
};
Endi balans ga class tashqarisidan to‘g‘ridan-to‘g‘ri murojaat qilib bo‘lmaydi.
Masalan, bu noto‘g‘ri:
BankHisobi hisob;
hisob.balans = 1000;
Chunki balans private.
public¶
public orqali class tashqarisidan foydalanish mumkin bo‘lgan methodlarni yaratamiz.
Masalan:
class BankHisobi {
private:
double balans;
public:
void korsat() {
cout << balans;
}
};
Endi:
BankHisobi hisob;
hisob.korsat();
ishlaydi.
private va public farqi¶
public¶
Tashqaridan foydalanish mumkin.
class Test {
public:
int son;
};
Keyin:
Test t;
t.son = 10;
ishlaydi.
private¶
Faqat class ichida foydalaniladi.
class Test {
private:
int son;
};
Keyin:
Test t;
t.son = 10;
ishlamaydi.
Getter¶
private ma'lumotni tashqaridan ko‘rish uchun getter methodidan foydalanishimiz mumkin.
Masalan:
class Talaba {
private:
int yosh;
public:
int getYosh() {
return yosh;
}
};
Endi:
Talaba talaba;
cout << talaba.getYosh();
Bu yosh qiymatini qaytaradi.
Setter¶
private ma'lumotga qiymat berish uchun setter ishlatiladi.
Masalan:
class Talaba {
private:
int yosh;
public:
void setYosh(int yangiYosh) {
yosh = yangiYosh;
}
int getYosh() {
return yosh;
}
};
Endi:
Talaba talaba;
talaba.setYosh(18);
cout << talaba.getYosh();
Natija:
18
Setter nima uchun foydali?¶
Setter yordamida noto‘g‘ri qiymatlarni tekshirish mumkin.
Masalan, yosh manfiy bo‘lishi mumkin emas.
class Talaba {
private:
int yosh;
public:
void setYosh(int yangiYosh) {
if (yangiYosh >= 0) {
yosh = yangiYosh;
}
}
int getYosh() {
return yosh;
}
};
Endi:
talaba.setYosh(-5);
deb yozsak, yosh ga -5 berilmaydi.
To‘liq misol¶
#include <iostream>
using namespace std;
class BankHisobi {
private:
double balans = 0;
public:
void pulQosh(double summa) {
if (summa > 0) {
balans += summa;
}
}
double getBalans() {
return balans;
}
};
int main() {
BankHisobi hisob;
hisob.pulQosh(1000);
cout << hisob.getBalans();
return 0;
}
Natija:
1000
Bu yerda balans tashqaridan to‘g‘ridan-to‘g‘ri o‘zgartirilmaydi.
Encapsulation qanday ishlaydi?¶
Oddiy ko‘rinishda:
Class
|
|-- private ma'lumot
|
|-- public method
|
+-- ma'lumotni o‘qish
|
+-- ma'lumotni o‘zgartirish
Ya'ni tashqi kod ma'lumotga bevosita emas, balki class methodlari orqali murojaat qiladi.
Nima uchun encapsulation kerak?¶
Encapsulation:
- ma'lumotlarni himoyalaydi;
- noto‘g‘ri qiymatlarni cheklashga yordam beradi;
- kodni tartibli qiladi;
- class ichidagi ma'lumotlarni boshqarishni osonlashtiradi.
Oddiy hayotiy misol¶
Bankomatni tasavvur qiling.
Siz bankomat ichidagi pulni to‘g‘ridan-to‘g‘ri o‘zgartira olmaysiz.
Siz:
pul yechish
pul kiritish
balansni ko‘rish
kabi funksiyalardan foydalanasiz.
Class ham shunga o‘xshash.
Ichki ma'lumotlar:
private
bo‘lishi mumkin.
Tashqariga berilgan imkoniyatlar:
public
methodlar orqali amalga oshiriladi.
class da default holat¶
C++ da class ichidagi a'zolar default holatda private hisoblanadi.
Masalan:
class Talaba {
int yosh;
};
Bu:
class Talaba {
private:
int yosh;
};
bilan bir xil.
Shuning uchun ko‘pincha public ni aniq yozamiz:
class Talaba {
private:
int yosh;
public:
void setYosh(int yosh) {
this->yosh = yosh;
}
};
Amaliy mashqlar¶
1-mashq¶
Talaba classini yarating.
Unda private:
yosh
bo‘lsin.
Yoshni o‘rnatish uchun:
setYosh()
va olish uchun:
getYosh()
methodlarini yarating.
2-mashq¶
BankHisobi classini yarating.
Unda private:
balans
bo‘lsin.
Pul qo‘shish uchun:
pulQosh()
methodini yarating.
Balansni olish uchun:
getBalans()
methodini yarating.
3-mashq¶
Telefon classini yarating.
Unda private:
narx
bo‘lsin.
Narxni o‘rnatadigan setter yarating.
Agar narx 0 dan kichik bo‘lsa, uni o‘zgartirmang.
Muhim narsalarni eslab qoling¶
Encapsulation — class ichidagi ma'lumotlarni himoyalash va boshqarish.
private — ma'lumotni class tashqarisidan to‘g‘ridan-to‘g‘ri ishlatishni cheklaydi.
public — tashqaridan foydalanish mumkin bo‘lgan qismlarni belgilaydi.
Getter ma'lumotni olish uchun ishlatiladi:
getYosh()
Setter ma'lumotni o‘zgartirish uchun ishlatiladi:
setYosh(18)
Encapsulation katta dasturlarda ma'lumotlarni xavfsiz va tartibli boshqarishga yordam beradi.