Darsliklar C++ Enkapsulatsiya. (Sinf/Class)

C++ C++ Enkapsulatsiya. (Sinf/Class)

Enkapsulatsiya — OOP ning birinchi ustuni. Uning mohiyati: obyektning ichki ma’lumotini tashqi dunyodan yashirib, unga faqat nazorat qilinadigan yo’llar orqali kirish. Bu ma’lumotni tasodifan yoki noto’g’ri o’zgartirishdan himoya qiladi. Bank hisobini tasavvur qiling: balansni istagan kishi to’g’ridan-to’g’ri o’zgartira olmasligi kerak.

Enkapsulatsiyama’lumot (maydonlar) va u ustidagi amallarni (metodlar) bir sinfga jamlab, ichki holatni private bilan yashirish va unga faqat public metodlar orqali kirishga ruxsat berish tamoyili.

Muammo: himoyasiz maydon

Avval maydon public bo’lganda qanday muammo yuzaga kelishini ko’ramiz. Balansni istalgan qiymatga, hatto manfiyga ham o’zgartirib bo’ladi — bu mantiqan noto’g’ri:

#include <iostream>
using namespace std;

class Hisob {
public:
    int balans = 0;
};

int main() {
    Hisob h;
    h.balans = -5000;   // mantiqan noto'g'ri, lekin ruxsat etilgan
    cout << "Balans: " << h.balans << endl;
    return 0;
}
Balans: -5000

Manfiy balans — xato, ammo public maydon bunga yo’l qo’ydi. Bu himoyasizlikni enkapsulatsiya hal qiladi.

Yechim: private + public metodlar

Maydonni private qilib yashiramiz va unga faqat tekshiruvli metodlar orqali kirishga ruxsat beramiz:

#include <iostream>
using namespace std;

class Hisob {
private:
    int balans = 0;

public:
    void toldirish(int summa) {
        if (summa > 0) {
            balans += summa;
        }
    }

    int korish() {
        return balans;
    }
};

int main() {
    Hisob h;
    h.toldirish(1000);
    h.toldirish(-500);   // rad etiladi
    cout << "Balans: " << h.korish() << endl;
    return 0;
}
Balans: 1000

Endi balans to’g’ridan-to’g’ri o’zgartirilmaydi. toldirish metodi manfiy summani rad etdi, shuning uchun balans faqat 1000 bo’lib qoldi. Ma’lumot endi himoyalangan.

Getter va Setter

private maydonga kirishning standart naqshi — getter (o’qish) va setter (yozish) metodlari. Ularni jadvalda ko’ramiz:

Metod turi Vazifasi Misol
Getter maydon qiymatini qaytaradi int korish()
Setter maydonni tekshirib o’rnatadi void ornat(int)

Setter tekshiruvni o’z ichiga oladi:

#include <iostream>
using namespace std;

class Talaba {
private:
    int ball;

public:
    void ballOrnat(int b) {
        if (b >= 0 && b <= 100) {   // faqat 0-100 oralig'i
            ball = b;
        }
    }
    int ballOlish() {
        return ball;
    }
};

int main() {
    Talaba t;
    t.ballOrnat(95);
    cout << "Ball: " << t.ballOlish() << endl;
    return 0;
}
Ball: 95

Nega enkapsulatsiya muhim?

Enkapsulatsiya uch foyda beradi: ma’lumot himoyalanadi (noto’g’ri qiymat kirmaydi), ichki tuzilishni o’zgartirsangiz tashqi kod buzilmaydi, va sinf bilan ishlash soddalashadi (faqat kerakli metodlar ko’rinadi). Bu — ishonchli, katta tizimlar qurishning asosidir.

Xulosa

Bu bo’limda enkapsulatsiya tamoyilini, private maydon va public metodlar bilan ma’lumotni himoyalashni, getter/setter naqshini va tekshiruvli setterni ko’rib chiqdik. Enkapsulatsiya — ishonchli obyekt dizaynining poydevori. Keyingi darsda merosxo’rlik — sinflarni kengaytirishga o’tamiz.