Statik a'zolar o'zgaruvchilari odatiy statik o'zgaruvchiga qarama-qarshi bo'lgan sinfning maxsus qismiga kirishlari mumkin.Statik a'zo o'zgaruvchilar class const static yoki constexpr static bo'lmasa, sinf tanasi ichida aniqlanmasligi mumkin.Statik a'zo o'zgaruvchilar o'z sinfidagi a'zo funktsiyalari uchun standart argument sifatida ishlatilishi mumkin. Oddiy o'zgaruvchiga qarama-qarshilik, agar global bo'lsa.Foydalanadi: agar o'zgaruvchining ikkala holatda ham dastur oxirigacha tirik bo'lishini xohlasangiz, lekin statik a'zo parametrlari ushbu sinfning maxsus qismiga kira oladi.
Misol; static int J = 9;
class A {
private:
static int x;
};
int A::x = 5;
class B {
static int y;
public:
void do_something()
{
std::cout << J;//Yes, J is global.
}
};
int B::y = 10;
69. C++da static kalit so’zi va undan sinflarda foydalanish
Class o’zgaruvchisini static deb e’lon qilinganda kompilyator uni obyektlar uchun bitta nusxa ko’rinishida yaratadi. Ya’ni bir nechta obyekt bitta o’zgaruvchidan foydalanadi. Static o’zgaruvchi 0 ga inisalizatsiya qilinadi. Class static a’zolariga murojat qilish ClassName::static_member ko’rinishida murojat qilinadi, obyekt orqali ham murojat qilsa bo’ladi.Static o’zgaruvchini static kalit so’zi bilan e’lon qilinadi.E’lon qilish:
class someclass {
public:
static int ob;
};
Statik usullar - Bu Javadagi usullar. Uni sinf ob'ektini yaratmasdan chaqirish mumkin. Ular nomi (toifasi sinfi) tomonidan hujjatlashtirilgan. Statik kalit so'zni sinf, o'zgaruvchan, usul va blok bilan ishlatish mumkin. Statik a'zolar ma'lum bir nusxada emas, balki sinfga tegishli, demak, agar siz a'zo bo'lgan statik bo'lsa, unga ob'ektsiz kirishingiz mumkin.
Statik kalit so'zi yordamida sinf a'zolarini statik aniqlashimiz mumkin. Agar sinfning bir a'zosini statik deb e'lon qilsak, sinfning qancha ob'ekti yaratilgan bo'lishidan qat'i nazar, statik a'zoning faqat bitta nusxasi mavjud.Statik a'zolarni ommaviy deb e'lon qilsangiz, u holda a'zo funktsiyasidan foydalana olasiz. Statik o'zgaruvchining doirasi bilan hech qanday aloqasi yo'q .. Faqat saqlash muddatini bildiradi.Statik a'zo sinfning barcha moslamalari tomonidan taqsimlanadi. Birinchi ob'ekt yaratilganda, barcha statik ma'lumotlar nolga tenglashtiriladi, agar boshqa boshlashlar mavjud bo'lmasa.
70. C++da obyektlar yaratmasdan turib, sinfdan foydalanish usul
#include
class Fraction
{ private:
int m_numerator;
int m_denominator; public:
Fraction() // jimlik bo’yicha konstruktor
{ m_numerator = 0; m_denominator = 1; }
int getNumerator()
{ return m_numerator; }
int getDenominator()
{ return m_denominator; }
double getValue()
{ return static_cast(m_numerator) / m_denominator; } };
int main()
{ Fraction drob; // argumentlar bo'lmaganligi sababli, standart Fraction () konstruktori chaqiriladi
cout << drob.getNumerator() << "/" << drob.getDenominator() << '\n'; return 0; } Bu sinf alohida int qiymatlari sifatida haqiqiy sonlarni o'z ichiga oladi. Standart
71.Sinf a'zolarining statik o'zgaruvchilarini aniqlash va initsializatsiyalash
Sinf a'zolarining statik o'zgaruvchilarini aniqlash va initsializatsiyalash Sinf tanasi ichida statik a'zolar o'zgaruvchisini e'lon qilganimizda, biz kompilyatorga statik a'zolar o'zgaruvchisi mavjudligi haqida ma'lumot beramiz, lekin uning ta'rifi haqida emas. Statik a'zolar o'zgaruvchilari alohida sinf obyektlarining bir qismi bo'lmaganligi uchun (ular global o'zgaruvchilarga o'xshash tarzda ko'rib chiqiladi va dastur ishga tushganda initsializatsiyalanadi), siz statik a'zolarni sinf tanasidan tashqarida - global miqyosda aniq belgilashingiz kerak. Yuqoridagi dasturda bu quyidagi kod satri bilan amalga oshiriladi:
int Anything::s_value = 3; // statik a'zo o'zgaruvchini aniqlash
Bu yerda biz statik sinf a'zolarining o'zgaruvchisini aniqladik va unga 3 qiymatini berdirk. Agar initsializator ko'rsatilmagan bo'lsa, C++ s_value ga 0 ni belgilaydi. E'tibor bering, statik a'zoning bu ta'rifi spetsifikatorlarga kirmaydi: siz s_value yopiq (yoki private) bo'lsa ham belgilashingiz va ishga tushirishingiz mumkin. Agar sarlavha faylida sinf aniqlangan bo'lsa, unda statik a'zoning ta'rifi odatda sinf kodi bilan faylga joylashtiriladi (masalan, Anything.cpp). Agar sinf .cpp faylida aniqlangan bo'lsa, unda statik a'zoning ta'rifi odatda to'g'ridan-to'g'ri sinf ostida yoziladi. Sarlavha fayliga sinfning statik a'zosining ta'rifini yozmang (global o'zgaruvchilar kabi). Agar bu sarlavha fayli bir necha bor kiritilgan bo'lsa, unda siz bir a'zoning bir nechta ta'rifini olasiz, bu esa kompilyatsiya xatosiga olib keladi.
72. Sinf tanasi ichida statik a'zo o'zgaruvchilarini initsializatsiyalash
Sinf tanasi ichida statik a'zo o'zgaruvchilarini initsializatsiyalash. Sinf tanasida statik a'zolarni aniqlash uchun bir nechta yechimlar mavjud. Birinchidan, agar statik a'zo doimiy integral turi bo'lsa (u char va boolni o'z ichiga oladi) yoki doimiy ro'yxatga olish bo'lsa, unda statik a'zo sinf tanasi ichida initsializatsiyalash mumkin: class Anything { public: static const int s_value = 5; // int tipidagi statik doimiy o'zgaruvchi to'g'ridan -to'g'ri e'lon qilinishi va initsializatsiyalanishi mumkin }; Bu yerda statik a'zolar o'zgaruvchisi butun sonli doimiy bo'lgani uchun, sinf tanasidan tashqaridagi qo'shimcha aniq ta'rifning qo'shimcha qatori endi talab qilinmaydi. Ikkinchidan, C++11 dan boshlab, constexpr ishga tushirilishini qo'llab quvvatlaydigan har qanday ma'lumot turidagi statik constexpr a'zolari sinf tanasi ichida ishga tushirilishi mumkin: #include class Anything { public: static constexpr double s_value = 3.4; // yaxshi static constexpr array s_array = { 3, 4, 5 }; // bu hatto constexprni initsializatsiyalashni qo'llab -quvvatlaydigan sinflar bilan ishlaydi.
73. Statik sinf a'zolarining o'zgaruvchilaridan foydalanish
Statik sinf a'zolarining o'zgaruvchilaridan foydalanish.Nima uchun sinflar ichidagi statik a'zo o'zgaruvchilaridan foydalanish kerak? Har bir sinf obyektiga o'ziga xos identifikator tayinlash uchun (variant sifatida):
#include
class Anything { private:
static int s_idGenerator;
int m_id; public:
Anything()
{ m_id = s_idGenerator++; } // keyingi obyekt uchun identifikator qiymatini oshirish
int getID() const { return m_id; } }; // Biz s_idGenerator -ni private bo'lsa ham belgilaymiz va initsializatsiyalaymiz. // Bu yaxshi, chunki ta'rif spetsifikatorlarga kirmaydi int Anything::s_idGenerator = 1; // biz ID generatorini 1 qiymatidan boshlaymiz
int main()
{ Anything first; Anything second; Anything third; cout << first.getID() << '\n';
cout << second.getID() << '\n'; cout << third.getID() << '\n';
return 0; }
74. Sinfning statik metodlari
Do'stlaringiz bilan baham: |