Məzmuna keç
Educora
Orta20 dəq7 / 10

Siniflər və obyektlər

Öz tiplərini yarat: sinif üzvləri, metodlar, konstruktorlar və destruktorlar, `public` və `private` ilə inkapsulyasiya.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Sinif və obyekt anlayışlarını izah etmək
  • Üzv dəyişənləri və metodları olan sinif yazmaq
  • İnisializasiya siyahısı olan konstruktorlar və destruktor yazmaq
  • public və private ilə verilənləri qorumaq

Oyunda yüzlərlə personaj var: hər birinin adı, canı, səviyyəsi var və hər biri hərəkət edə, hücum edə bilir. Bütün bunları ayrı-ayrı dəyişənlərdə və funksiyalarda saxlamaq tezliklə dolaşıqlığa çevrilir. C++ sənə öz tipini yaratmağa imkan verir — sinif (class). Sinif verilənləri və onlarla işləyən funksiyaları bir yerdə birləşdirir.

Sinif və obyekt

Tərif
Sinif və obyekt

Sinif yeni tipin çertyojudur: obyektlərdə hansı verilənlərin (üzv dəyişənlərin) və hansı funksiyaların (metodların) olacağını təsvir edir. Obyekt isə həmin sinifdən yaradılmış konkret nüsxədir — int x; yazanda x int tipli dəyişən olduğu kimi.

C++
#include <iostream>
#include <string>

class Student {
public:
    std::string name;
    int grade = 0;

    void introduce() const {
        std::cout << name << " is in grade " << grade << '\n';
    }
};

int main() {
    Student a;
    a.name = "Aysel";
    a.grade = 8;

    Student m;
    m.name = "Murad";
    m.grade = 9;

    a.introduce();
    m.introduce();
    return 0;
}
Gözlənilən nəticə
Aysel is in grade 8
Murad is in grade 9
  • Üzvlərə nöqtə ilə müraciət olunur: a.name, a.introduce().
  • Hər obyektin öz verilənləri var: a və m eyni sinifdəndir, amma adları və sinifləri (grade) fərqlidir.
  • Metodun sonundakı const onun obyekti dəyişmədiyini bildirir; kompilyator bunu yoxlayır.

Konstruktorlar və destruktor

Konstruktor obyekt yaradılanda avtomatik çağırılan xüsusi metoddur. Onun adı sinfin adı ilə eynidir və qaytarılan tipi yoxdur. Konstruktorlar da adi funksiyalar kimi yüklənə bilər. Üzvlərə qiyməti ən yaxşı inisializasiya siyahısında vermək olar — iki nöqtədən sonra, gövdədən əvvəl: : width_(w), height_(h).

C++
#include <iostream>

class Rectangle {
public:
    Rectangle() : width_(1), height_(1) {}
    Rectangle(int w, int h) : width_(w), height_(h) {}

    int area() const { return width_ * height_; }
    int perimeter() const { return 2 * (width_ + height_); }

private:
    int width_;
    int height_;
};

int main() {
    Rectangle tile;
    Rectangle room(4, 3);
    std::cout << "Tile area: " << tile.area() << '\n';
    std::cout << "Room area: " << room.area() << '\n';
    std::cout << "Room perimeter: " << room.perimeter() << '\n';
    return 0;
}
Gözlənilən nəticə
Tile area: 1
Room area: 12
Room perimeter: 14

Destruktor obyekt məhv olanda çağırılır: adı ~ işarəsi ilə başlayır (~Logger). Lokal obyekt görünmə sahəsindən — öz fiqurlu mötərizələrindən — çıxanda məhv olur. Əvvəlki dərsdəki RAII prinsipi məhz buna əsaslanır: resurs konstruktorda alınır, destruktorda qaytarılır.

C++
#include <iostream>
#include <string>

class Logger {
public:
    Logger(const std::string& name) : name_(name) {
        std::cout << "Start " << name_ << '\n';
    }
    ~Logger() {
        std::cout << "End " << name_ << '\n';
    }

private:
    std::string name_;
};

int main() {
    Logger a("A");
    {
        Logger b("B");
    }
    std::cout << "Main done\n";
    return 0;
}
Gözlənilən nəticə
Start A
Start B
End B
Main done
End A
b daxili blok bitəndə, a isə main bitəndə məhv olur.

public, private və inkapsulyasiya

Bank hesabının balansını istənilən kod birbaşa dəyişə bilsəydi, kimsə səhvən ona mənfi qiymət yaza bilərdi. İnkapsulyasiya verilənləri gizlədir və onlara yalnız yoxlanılan metodlar vasitəsilə müraciətə icazə verir. Bunun üçün giriş səviyyələri var: public üzvlər hər yerdən görünür, private üzvlər isə yalnız sinfin öz metodlarından.

C++
#include <iostream>

class BankAccount {
public:
    BankAccount(int balance) : balance_(balance) {}

    void deposit(int amount) {
        if (amount > 0) {
            balance_ += amount;
        }
    }
    bool withdraw(int amount) {
        if (amount <= 0 || amount > balance_) {
            return false;
        }
        balance_ -= amount;
        return true;
    }
    int balance() const { return balance_; }

private:
    int balance_;
};

int main() {
    BankAccount acc(100);
    acc.deposit(50);
    std::cout << std::boolalpha << acc.withdraw(500) << '\n';
    std::cout << acc.withdraw(30) << '\n';
    std::cout << "Balance: " << acc.balance() << " AZN\n";
    // acc.balance_ = 1000000;  // error: balance_ is private
    return 0;
}
Gözlənilən nəticə
false
true
Balance: 120 AZN
150 manatdan 500 çıxarmaq alınmadı, 30 isə çıxarıldı: 150 − 30 = 120.
SəviyyəKim müraciət edə bilər
publicistənilən kod
privateyalnız sinfin öz metodları
protectedsinfin öz metodları və törəmə siniflər (növbəti dərs)

Əsas fikirlər

  • Sinif yeni tipin çertyojudur, obyekt isə onun konkret nüsxəsidir.
  • Üzvlərə nöqtə ilə müraciət olunur; const metod obyekti dəyişmir.
  • Konstruktor obyekt yaradılanda, destruktor (~Ad) isə məhv olanda avtomatik çağırılır.
  • Üzvlərə qiyməti inisializasiya siyahısında vermək ən yaxşı yoldur.
  • private verilənləri gizlədir, public metodlar isə onlara nəzarətli giriş verir — bu, inkapsulyasiyadır.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
Sinif ilə obyekt arasındakı fərq nədir?