- 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
publicvəprivateilə 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
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.
#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;
}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:
avəmeyni sinifdəndir, amma adları və sinifləri (grade) fərqlidir. - Metodun sonundakı
constonun 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).
#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;
}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.
#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;
}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.
#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;
}false true Balance: 120 AZN
| Səviyyə | Kim müraciət edə bilər |
|---|---|
public | istənilən kod |
private | yalnız sinfin öz metodları |
protected | sinfin ö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;
constmetod 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.
privateverilənləri gizlədir,publicmetodlar 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.