Sinfning statik metodlari. Yuqorida biz statik a'zolar o'zgaruvchilari uning obyektlari emas, balki sinfga tegishli a'zolar ekanligini bilib oldik. Statik metodlar. Agar statik a'zolar o'zgaruvchilari public bo'lsa, biz ularga to'g'ridan-to'g'ri sinf nomi va (::) operatori orqali kirishimiz mumkin. Agar statik a'zo o'zgaruvchilari private bo'lsa -chi? Quyidagi kodni ko'rib chiqaylik:
class Value { private: static int s_value; };
int Value::s_value = 3; // private bo'lsa ham, statik a'zoni aniqlash
int main()
{ // Bu yerda Value::s_valuega qanday kirish mumkin, agar s_value private bo'lsa? } Bunday holda, biz main () funksiyasidan Value::s_valuega to'g'ridan-to'g'ri kira olmaymiz, chunki bu a'zo privatedir. Odatda, sinfning private a'zolariga public metodlar orqali kirish mumkin. Biz s_valuega kirish uchun oddiy metodni yaratishimiz mumkin bo'lsa -da, biz metoddan foydalanish uchun shu sinfning obyektini yaratishimiz kerak bo'lardi! Yaxshi variant bor: biz metodni statik qilishimiz mumkin. Statik a'zo o'zgaruvchilari singari, statik metodlar ham bitta sinf obyektiga bog'lanmagan. Mana, yuqoridagi misol, lekin statik metod bilan:
#include
using namespace std;
class Value { private:
static int s_value; public:
static int getValue() { return s_value++; } // statik metod };
int Value::s_value = 3; //sinfning a’zo-o’zgaruvchisining ta'rifi
int main() {
cout << Value::getValue() << '\n';
cout << Value::getValue() << '\n'; }
Statik metodlar ma'lum bir obyektga bog'lanmaganligi sababli, ularni to'g'ridan-to'g'ri sinf nomi va (::) operatori orqali, shuningdek sinf obyektlari orqali chaqirish mumkin (lekin bu tavsiya qilinmaydi).
75. Inkapsulyasiya metodlari va mexanizmlari
Inkapsulyatsiya - ob'ekt mustaqil: har bir ob'ekt shunday tuzilganki, unga kerakli ma'lumotlar dasturning tashqarisida emas, balki shu ob'ekt ichida yashaydi. Masalan, agar menda "Foydalanuvchi" obyekti bo'lsa, unda menda foydalanuvchi haqidagi barcha ma'lumotlar bo'ladi: ism, manzil va boshqa hamma narsalar. Shuningdek, u "Manzilni tekshirish" yoki "Pochta ro'yxatiga obuna bo'lish" metodlariga ega bo'ladi. Inkapsulyatsiya - bu tizimda ishlaydigan ma'lumotlar va usullarni sinfda birlashtirishga va foydalanuvchidan amalga oshirish tafsilotlarini yashirishga imkon beruvchi tizimning xususiyati. Ob'ektlardan foydalanishning asosiy afzalliklaridan biri shundaki, ob'ektga uning barcha atributlari va xatti -harakatlarini ko'rsatish shart emas. Ob'ektga yo'naltirilgan yaxshi loyihada (hech bo'lmaganda bitta yaxshi deb hisoblanadigan) ob'ekt faqat boshqa ob'ektlar u bilan o'zaro aloqada bo'lishi kerak bo'lgan interfeyslarni ko'rsatishi kerak. Ob'ektni ishlatish bilan bog'liq bo'lmagan tafsilotlar boshqa barcha narsalardan yashirilishi kerak. Inkapsulyatsiya ob'ektlarning atributlari va xatti -harakatlarini o'z ichiga olishi bilan belgilanadi. Ma'lumotni yashirish - bu inkapsulyatsiyaning asosiy qismi. Masalan, raqamlar kvadratini hisoblash uchun ishlatiladigan ob'ekt natijalarni olish uchun interfeysni ta'minlashi kerak. Biroq, sonlarning kvadratlarini hisoblash uchun ishlatiladigan atributlar va algoritmlarni so'rovchi ob'ektga taqdim etishga hojat yo'q. Ishonchli sinflar inkapsulyatsiyani hisobga olgan holda ishlab chiqilgan.
76. Ob’yekt elementlariga murojaatni tashkil etish
#include
class DateClass
{ public: int m_day; int m_month; int m_year;
void print()
{ cout << m_day << "/" << m_month << "/" << m_year; } };
int main()
{ DateClass today { 12, 11, 2018 }; today.m_day = 18; // DateClass today obyektining m_day a'zo o'zgaruvchisini tanlash uchun a'zo tanlash operatoridan foydalanish today.print(); // DateClass today obyektining print() metodini chaqirish uchun a'zo tanlash operatoridan foydalanish return 0; }
77. Do’stona sinflar va metodlar
Boshqa sinflarni o'z ichiga olgan sinflar. Ba'zi sinflar a'zo o'zgaruvchilari sifatida boshqa sinflarni o'z ichiga olishi mumkin. Odatiy bo'lib, tashqi sinf yaratishda a'zo o'zgaruvchilar uchun standart konstruktorlar chaqiriladi. Bu konstruktor tanasi bajarilishidan oldin sodir bo'ladi. Buni quyidagicha ko'rsatish mumkin: #include
class A { public:
A() { std::cout << "A\n"; } };
class B { private: A m_a; // B a'zo o'zgaruvchi sifatida A ni o'z ichiga oladi
public: B()
{ std::cout << "B\n"; } }
; int main() { B b; return 0; } Dasturni bajarish natijasi: A B
B o'zgaruvchisi yaratilganda, B () konstruktori chaqiriladi. Konstruktor tanasi bajarilishidan oldin m_a A sinfining standart konstruktorini chaqirib initsializatsiyalanadi. Bu A xulosasini beradi, keyin boshqaruv B konstruktoriga qaytadi va B konstruktorining tanasi bajarila boshlaydi. Bu yerda mantiqiy, chunki B () konstruktori m_a o'zgaruvchisini ishlatishni xohlashi mumkin, shuning uchun avval m_a ni initsializatsiyalash kerak.
78.Sinf a'zolarining o'zgaruvchilarini yopiq qilish
#include
class Anything { public:
static int s_value; // statik a'zo o'zgaruvchini e'lon qilish };
int Anything::s_value = 3; // statik a'zo o'zgaruvchini aniqlash
int main()
{ // Eslatma: Biz bu yerda Anything obyektini yaratmaymiz. Anything::s_value = 4;
cout << Anything::s_value << '\n'; return 0; }
79. C++da inkapsulyatsiyadan foydalanish
C++ da inkapsulyatsiya kirish spetsifikatorlari orqali amalga oshiriladi. Odatda, sinfning barcha a'zolar o'zgaruvchilari yopiqdir (amalga oshirish tafsilotlarini yashirish) va ko'pchilik metodlar ochiq (foydalanuvchiga ochiq interfeys bilan). Foydalanuvchilardan umumiy interfeysdan foydalanishni talab qilish a'zo o'zgaruvchilarini ochishdan ko'ra qiyinroq bo'lib tuyulishi mumkin, lekin u kodni qayta ishlatish va xizmat ko'rsatishninyaxshilanishini ta'minlaydiganko'plabfoydalafzalliklarni beradi. C++standartkutubxonasidagi barcha sinflar inkapsulyatsiyalangan. Tasavvur qiling, agar siz ularni ishlatish uchun string, vector yoki cout (va boshqa obyektlar) ning bajarilishini bilishingiz kerak bo'lsa, C ++ ni o'rganish qanchalik qiyin bo'lardi. C++ da inkapsulyatsiya. Jimlik bo’yicha, sinfda ma'lumotlar va usullar shaxsiydir; ular faqat tegishli sinf tomonidan o'qilishi va o'zgartirilishi mumkin. Kirish darajasini C ++ tomonidan berilgan tegishli kalit so'zlar yordamida o'zgartirish mumkin. C++ da bir nechta spetsifikatorlar mavjud va ular ma'lumotlarga kirishni quyidagicha o'zgartiradilar:
ommaviy (public) ma'lumotlar - hamma uchun ochiq; himoyalangan (protected) - faqat sinf va sinf avlodlari uchun mavjud; xususiy (private) - faqat ular tegishli bo'lgan sinf uchun mavjud. Qisqalik uchun misollarda faqat ikkita daraja (private va public) yoritiladi. Inkapsulyatsiyaga misol. Kontakt sinfida public o'zgaruvchilar va metodlarga asosiy dasturdan kirish mumkin. private o'zgaruvchilar va metodlar faqat sinfning o'zi tomonidan o'qilishi, chaqirilishi yoki o'zgartirilishi mumkin.
#include
using namespace std;
class Contact {
private: int mobile_number; // private variable
int home_number; // private variable
public:
Contact() // constructor
{ mobile_number = 12345678; home_number = 87654321; } void print_numbers(){ cout << "Mobile number: " << mobile_number; cout << ", home number: " << home_number << endl; } };
int main()
{Contact Tony; Tony.print_numbers(); // cout << Tony.mobile_number << endl; // will cause compile time error return 0; }
Mobile_number private o'zgaruvchisini asosiy dasturdan (main) bosib chiqarishga yoki o'zgartirishga urinish kompilyatsiya xatosiga olib keladi, chunki sinfdagi private ma'lumotlarga kirish cheklangan.
80. C++da inkapsulyatsiyaga oid misol
C++ da inkapsulyatsiya. Jimlik bo’yicha, sinfda ma'lumotlar va usullar shaxsiydir; ular faqat tegishli sinf tomonidan o'qilishi va o'zgartirilishi mumkin. Kirish darajasini C ++ tomonidan berilgan tegishli kalit so'zlar yordamida o'zgartirish mumkin. C++ da bir nechta spetsifikatorlar mavjud va ular ma'lumotlarga kirishni quyidagicha o'zgartiradilar: ommaviy (public) ma'lumotlar - hamma uchun ochiq; himoyalangan (protected) - faqat sinf va sinf avlodlari uchun mavjud; xususiy (private) - faqat ular tegishli bo'lgan sinf uchun mavjud. Qisqalik uchun misollarda faqat ikkita daraja (private va public) yoritiladi. Inkapsulyatsiyaga misol. Kontakt sinfida public o'zgaruvchilar va metodlarga asosiy dasturdan kirish mumkin. private o'zgaruvchilar va metodlar faqat sinfning o'zi tomonidan o'qilishi, chaqirilishi yoki o'zgartirilishi mumkin.
#include
using namespace std;
class Contact
{ private int mobile_number // private variable
int home_number;// private variable
public:
Contact()// constructor{
mobile_number = 12345678; home_number = 87654321; }void print_numbers() {cout << "Mobile number: " << mobile_number; cout << ", home number: " << home_number << endl; } };
int main()
{ Contact TonyTony.print_numbers()//
cout << Tony.mobile_number << endl; // will cause compile time error return 0; }
Mobile_number private o'zgaruvchisini asosiy dasturdan (main) bosib chiqarishga yoki o'zgartirishga urinish kompilyatsiya xatosiga olib keladi, chunki sinfdagi private ma'lumotlarga kirish cheklangan.\
81. Statik bo’lmagan sinf a’zolarini initsializatsiyalash
Statik a'zolarga har xil sinf ob'ektlari orqali kirishingiz mumkin bo'lsa (yuqoridagi misolda bo'lgani kabi), statik a'zolar sinf obyektlari yaratilmagan bo'lsa ham mavjud ekanligi ayon bo'ladi! Global o'zgaruvchilar singari, ular dastur ishga tushganda yaratiladi va dastur bajarilgandan so'ng yo'q qilinadi. Shunday qilib, statik a'zolar sinfga tegishli bo'lib, bu sinf obyektlariga tegishli emas. s_value har qanday sinf obyektlaridan mustaqil ravishda mavjud bo'lganligi sababli, unga to'g'ridan -to'g'ri sinf nomi va ko’rinish sohasini aniqlash operatori orqali kirish mumkin (bu holda Anything::s_value orqali):
#include
class Anything
{ public: static int s_value; // statik a'zo o'zgaruvchini e'lon qilish };
int Anything::s_value = 3; // statik a'zo o'zgaruvchini aniqlash
int main()
{// Eslatma: Biz bu yerda Anything obyektini yaratmaymiz. Anything::s_value = 4; cout << Anything::s_value << '\n'; return 0; }
82. C++da do’stona funksiyalar hosil qilish
Boshqa sinflarni o'z ichiga olgan sinflar. Ba'zi sinflar a'zo o'zgaruvchilari sifatida boshqa sinflarni o'z ichiga olishi mumkin. Odatiy bo'lib, tashqi sinf yaratishda a'zo o'zgaruvchilar uchun standart konstruktorlar chaqiriladi. Bu konstruktor tanasi bajarilishidan oldin sodir bo'ladi. Buni quyidagicha ko'rsatish mumkin:
#include
class A { public:
A() { std::cout << "A\n"; } };
class B { private: A m_a; // B a'zo o'zgaruvchi sifatida A ni o'z ichiga oladi
public:
B() { std::cout << "B\n"; } };
int main() { B b; return 0; }
83. Do'stona funksiyalar va bir nechta sinflar
Boshqa sinflarni o'z ichiga olgan sinflar. Ba'zi sinflar a'zo o'zgaruvchilari sifatida boshqa sinflarni o'z ichiga olishi mumkin. Odatiy bo'lib, tashqi sinf yaratishda a'zo o'zgaruvchilar uchun standart konstruktorlar chaqiriladi. Bu konstruktor tanasi bajarilishidan oldin sodir bo'ladi. Buni quyidagicha ko'rsatish mumkin:
#include
class A { public:
A() { std::cout << "A\n"; } };
class B { private: A m_a; // B a'zo o'zgaruvchi sifatida A ni o'z ichiga oladi
public:
B() { std::cout << "B\n"; } };
int main() { B b; return 0; }
84. C++da do’stona sinflar hosil qilish
A'zolarni initsializatsiyalash ro'yxati, shuningdek, sinf a'zolarini initsializatsiyalash uchun ham ishlatilishi mumkin: #include class A { public:
A(int a)
{ std::cout << "A " << a << "\n"; } };
class B
{ private: A m_a; public: B(int b) : m_a(b-1) // konstruktor A (int) m_a a'zosini initsializatsiyalash uchun chaqiriladi
{ std::cout << "B " << b << "\n"; } };
int main() { B b(7); return 0; } Dasturni bajarish natijasi: A 6 B7
85. C++da do’stona metodlar hosil qilishDo’stona sinfdan foydalanish uchun quyida misol keltirilgan. Bunda e’tibor berishimiz lozimki, TwoValues sinfi Min sinfiga do’stona bo’lib, bunda Min sinfi TwoValues sinfining a’zolaridan foydalanishi mumkin.
class TwoValues {
int a, b;
public:
TwoValues(int i, int j) { a = i; b = j; }
friend class Min;
};
class Min {
public:
int min(TwoValues x) { return x.a < x.b ? x.a : x.b; }
};
int main() {
TwoValues ob(10, 20);
Min m;
cout << m.min(ob);
return 0;
}
86. C++da anonim obyektlar
Siz bitta sinfning bir nechta ob'ektlarini yaratishingiz mumkin:
C++
1
#include
2
#include
3
using namespace std;
4
5
class Car {
6
public:
7
string brand;
8
string model;
9
int year;
10
};
11
12
int main() {
13
Car carObj1;
14
carObj1.brand = "BMW";
15
carObj1.model = "X5";
16
carObj1.year = 1999;
17
18
Car carObj2;
19
carObj2.brand = "Ford";
20
carObj2.model = "Mustang";
21
carObj2.year = 1969;
22
23
cout << carObj1.brand << " " << carObj1.model << " " << carObj1.year << "\n";
24
cout << carObj2.brand << " " << carObj2.model << " " << carObj2.year << "\n";
25
return 0;
26
}
Do'stlaringiz bilan baham: |