Statik ma'lumotlar turlari c. Java-da statik usullar

Static kalit so'zi bilan sinf a'zolaridan foydalanish mumkin. Bu kontekstda uning ma'nosi C tilidagiga o'xshaydi. Sinf a'zosi statik deb e'lon qilinganda, kompilyatorga ushbu sinfning qancha ob'ekti yaratilgan bo'lishidan qat'i nazar, ushbu a'zoning faqat bitta nusxasi bo'lishi kerakligini ko'rsatadi. Statik a'zo berilgan sinfning barcha ob'ektlari tomonidan baham ko'riladi. Birinchi ob'ekt yaratilganda barcha statik ma'lumotlar nolga tenglashtiriladi va boshqa ishga tushirish ta'minlanmaydi.

Sinfning statik ma'lumotlar a'zosi e'lon qilinganda, bu a'zo aniqlanmaydi. Buning o'rniga, sinfdan tashqarida ular uchun global ta'rif berishingiz kerak. Bu oʻzgaruvchi tegishli sinfni aniqlash uchun scope operatoridan foydalangan holda statik oʻzgaruvchini qayta eʼlon qilish orqali amalga oshiriladi. Bu statik o'zgaruvchiga xotira ajratilishi uchun zarur.

Misol sifatida quyidagi dasturni ko'rib chiqing:

#o'z ichiga oladi
sinf hisoblagichi (
statik int soni;
ommaviy:
void setcount(int i) (count = i;);
void showcount() (cout<< count << " "; }
};
int counter::count; // hisoblash ta'rifi
int main() (
hisoblagich a, b;
a.showcount(); // 0 chiqadi
b.showcount(); // 0 chiqadi
a.setcount(10); // statik sonni 10 ga o'rnating
a.showcount(); // 10 chiqadi
b.showcount(); // 10 ni ham chiqaradi
qaytish 0;
}

Avvalo, butun son tipidagi countning statik o'zgaruvchisi ikki joyda e'lon qilinishiga e'tibor qaratamiz: sinf hisoblagichida va keyin - global o'zgaruvchi sifatida. Borland C++ hisoblashni nolga aylantiradi. Shuning uchun showcount() ga birinchi qo'ng'iroq nolni qaytaradi. Keyin a ob'ekti to'plamlar soni 10 ga teng bo'ladi. Shundan so'ng, a va b ob'ektlar showcount() funksiyasidan foydalangan holda bir xil 10 qiymatini ko'rsatadi. a va b ob'ektlar tomonidan umumiy hisobning faqat bitta nusxasi mavjud bo'lganligi sababli, ikkala holatda ham chiqish chiqadi. qiymati 10.

Statik a'zo funktsiyalariga ega bo'lish ham mumkin. Statik a'zo funktsiyalari o'z sinfida e'lon qilingan statik bo'lmagan ma'lumotlar yoki statik bo'lmagan funktsiyalarga bevosita murojaat qila olmaydi. Buning sababi shundaki, ularda this ko'rsatkichi yo'q, shuning uchun qaysi statik bo'lmagan ma'lumotlar bilan ishlashni bilishning hech qanday usuli yo'q. Misol uchun, agar f() statik funksiyasini o'z ichiga olgan ikkita sinf ob'ekti mavjud bo'lsa va f() ushbu sinf tomonidan aniqlangan statik bo'lmagan varga kirishga harakat qilsa, var ning qaysi nusxasidan foydalanish kerakligini qanday aniqlash mumkin? Kompilyator bunday muammoni hal qila olmaydi. Statik funktsiyalar faqat boshqa statik funktsiyalarga yoki statik ma'lumotlarga kirishi mumkinligining sababi shu. Bundan tashqari, statik funktsiyalar virtual bo'lishi yoki const yoki volatile modifikatorlari bilan e'lon qilinishi mumkin emas. Statik funksiyani sinf obyekti yoki sinf nomi va qamrov operatori yordamida chaqirish mumkin. Ammo shuni unutmasligimiz kerakki, ob'ekt yordamida statik funktsiyani chaqirganda ham, bu ko'rsatgich o'tkazilmaydi.

Quyidagi qisqa dastur statik funktsiyalardan foydalanishning ko'p usullaridan birini ko'rsatadi. Juda keng tarqalgan holat, masalan, tarmoqdagi umumiy fayl kabi cheklangan manbaga kirishni ta'minlash kerak bo'lganda. Ushbu dastur ko'rsatadiki, statik ma'lumotlar va funktsiyalardan foydalanish ob'ekt manba holatini tekshirishi va iloji bo'lsa, unga kirishi mumkin bo'lgan usul bo'lib xizmat qiladi.

#o'z ichiga oladi


sinfga kirish (
statik enum access_tacs;
// ...
ommaviy:


{
AClarni qaytarish;
}
// ...
};

int main()
{
obj1, obj2 kirish;
access::set_access(qulflangan); // sinf nomidan foydalanib qo'ng'iroq qiling
// ... kod

if (obj2.get_access()==locked) ( // ob'ekt yordamida qo'ng'iroq qilish

cout<< "Access resource.\n";
}
boshqa cout<< "Locked out.\n";
// ...
qaytish 0;
}

Ushbu dasturni ishga tushirganingizda, ekranda "qulflangan" ko'rinadi. Esda tutingki, set_access() funksiyasi sinf nomi va qamrov operatori bilan chaqiriladi. get_access() funksiyasi obyekt va nuqta operatori bilan chaqiriladi. Statik funktsiyani chaqirishda ushbu shakllardan birini ishlatish mumkin va ikkalasi ham bir xil ta'sirga ega. Uning qanday ishlashini tushunish uchun ushbu dastur bilan biroz tajriba o'tkazishga arziydi.

Ta'kidlanganidek, statik funktsiyalar faqat bitta sinfdagi boshqa statik funktsiyalarga yoki statik ma'lumotlarga to'g'ridan-to'g'ri kirish huquqiga ega. Buni tekshirish uchun dasturning quyidagi versiyasini kompilyatsiya qilishga harakat qilaylik:

// bu dasturda xato bor va kompilyatsiya qilinmaydi
#o'z ichiga oladi
enum access_t (birgalikda, foydalanishda, qulflangan, qulfdan chiqarilgan);
// sinf nodir resursni boshqaradi
sinfga kirish (
statik enum access_tacs;
int i; // statik emas
// ...
ommaviy:
statik void set_access(enum access_t a) (acs = a;)
statik enum access_t get_access()
{
i = 100; // kompilyatsiya qilmaydi
AClarni qaytarish;
}
// ...
};
enum access_t access::acs; // acsni belgilang
int main()
{
obj1, obj2 kirish;
access::set_access(qulflangan); // sinf nomi bilan qo'ng'iroq qiling
// ... kod
// obj2 resursga kirishi mumkin
if(obj2.get_access()==locked) ( // ob'ekt yordamida qo'ng'iroq qilish
kirish ::set_access(foydalanishda); // sinf nomi bilan qo'ng'iroq qiling
cout<< "Access resource.\n";
}
boshqa cout<< "Locked out.\n";
// ...
}

Get_access() funktsiyasi statik bo'lmagan o'zgaruvchiga kirishga harakat qilayotgani uchun bu dastur kompilyatsiya qilmaydi.

Avvaliga siz statik a'zolardan darhol foydalanish zaruriyatini sezmaysiz, lekin C++ dasturlash bo'yicha tajriba orttirganingiz sayin, ular ma'lum vaziyatlarda juda qulay bo'lib qoladi, chunki ular global o'zgaruvchilardan foydalanishdan qochadi.

Ko'pgina C++ kalit so'zlari sizga bitta narsani qilish imkonini beradi. Butun son oʻzgaruvchini eʼlon qilish uchun yoki funksiya butun son qiymatini qaytarganda yoki argument sifatida butun sonni qabul qilganda int dan foydalanasiz. Xotirani ajratish uchun yangi operatordan, bo'shatish uchun esa o'chirish operatoridan foydalanasiz. O'zgaruvchining qiymatini o'zgartirib bo'lmasligini ko'rsatish uchun const dan foydalanishingiz mumkin. Ajablanarlisi shundaki, statik kalit so'z, garchi u "o'zgarmas" degan ma'noni anglatsa ham, bir nechta (va aftidan, bir-biriga bog'liq bo'lmagan) foydalanishga ega. Statik kalit so'z uchta asosiy kontekstda ishlatilishi mumkin:

  • funktsiya ichida;
  • sinf ichidagi ta'rif;
  • ko'p faylli dasturni tashkil etuvchi fayl ichidagi global o'zgaruvchining oldida.

Funktsiya ichida statikdan foydalanish eng oson. Bu shunchaki o'zgaruvchi ishga tushirilgandan so'ng u dastur tugaguniga qadar xotirada qolishini bildiradi. Siz uni dastur tugaguniga qadar o'z qiymatini ushlab turadigan o'zgaruvchi sifatida ko'rishingiz mumkin. Masalan, static int count = 0 qatorlarini qo'shish orqali funktsiya necha marta chaqirilganligini yozish uchun statik o'zgaruvchidan foydalanishingiz mumkin; va count++; funksiyaga aylanadi. count statik o'zgaruvchi bo'lgani uchun chiziq static int count = 0; faqat bir marta amalga oshiriladi. Har safar funktsiya chaqirilganda, count unga berilgan oxirgi qiymatga ega bo'ladi.

O'zgaruvchining tsikl ichida qayta ishga tushirilishining oldini olish uchun shu tarzda static dan ham foydalanishingiz mumkin. Masalan, quyidagi kodda static int qatori = 0 bo'lsa ham, soni_times o'zgaruvchisi 100 ga teng bo'ladi; sikl ichida bo'lib, u erda dastur siklga har gal kelganda bajarilishi kerak. Ayyorlik shundaki, statik kalit so'z o'zgaruvchini qayta ishga tushirishni oldini oladi. Statik kalit so'zdan foydalanishning bir tomoni shundaki, u siz uchun o'zgaruvchini avtomatik ravishda nolga qo'yadi - lekin unga tayanmang (bu sizning niyatlaringizni noaniq qiladi).

For(int ix=0; ix< 10; ix++) { for(int iy = 0; iy < 10; iy++) { static int number_of_times = 0; number_of_times++; } }

Qaytarilgan funktsiyaning oxirgi qiymati haqidagi ma'lumotlarni saqlash uchun statik o'zgaruvchilardan foydalanishingiz mumkin, masalan, funktsiya tomonidan hisoblangan maksimal qiymatni saqlamoqchi bo'lsangiz. Agar siz satrni tahlil qilayotgan bo'lsangiz, funksiya tomonidan qaytarilgan oxirgi belgini ham saqlashingiz mumkin, shunda uni oxirgi belgini qaytarishi kerakligini ko'rsatadigan argument bilan chaqirishingiz mumkin.

Statikning ikkinchi qo'llanilishi sinf ta'rifi doirasida. Garchi sinf ichida e'lon qilingan o'zgaruvchilarning ko'pchiligi sinfning har bir misolida boshqa qiymatga ega bo'lishi mumkin bo'lsa-da, sinfning statik maydonlari ushbu sinfning barcha misollari uchun bir xil qiymatga ega bo'ladi va hatto bu sinfning namunasini yaratish shart emas. . Statik sinf o'zgaruvchilari yangi ob'ektlarni yaratish uchun zarur bo'lgan ma'lumotlarni saqlaydi deb o'ylash foydalidir (masalan, sinf fabrikasida). Misol uchun, agar siz sinf misollarini raqamlashni istasangiz, oxirgi ishlatilgan raqamni kuzatish uchun statik o'zgaruvchidan foydalanishingiz mumkin. Shuni ta'kidlash kerakki, statik klass o'zgaruvchilardan foydalanishda class_name::x; , instance_of_class.x emas; . Bu dasturchiga statik o'zgaruvchilar bir xil sinf misoliga tegishli emasligini va bu sinfning namunasini yaratishingiz shart emasligini eslatishga yordam beradi. Siz allaqachon sezgan bo'lsangiz kerak, siz sinf nomi orqali kirganingizda staticga kirish uchun scope operatoridan, :: dan foydalanishingiz mumkin.

static yordamida dasturni disk raskadrovka qilish yoki amalga oshirishda uni sinf ichida ishga tushira olmasligingizni yodda tutish kerak. Aslida, agar siz barcha sinf kodlarini sarlavha fayliga yozishga qaror qilsangiz, sarlavha faylida statik o'zgaruvchini ishga tushira olmaysiz; buni .cpp faylida bajaring. Bundan tashqari, siz sinfning statik a'zolarini ishga tushirishingiz kerak, aks holda ular doirada bo'lmaydi. (Sintaksis biroz g'alati: class_name::static_variable = qiymat yozing.)

Statik sinf funktsiyalariga ham ega bo'lishingiz mumkin. Statik funksiyalar sinf namunasini talab qilmaydigan va xuddi shu tarzda, statik o‘zgaruvchilarga o‘xshatib, obyekt nomi bilan emas, sinf nomi bilan chaqiriladigan funksiyalardir. Masalan, a_class::static_function(); , emas, balki an_instance.function(); . Statik funktsiyalar faqat sinfning statik a'zolarida ishlashi mumkin, chunki ular sinfning muayyan misollariga ishora qilmaydi. Statik funktsiyalardan statik o'zgaruvchilarni o'zgartirish, ularning qiymatlarini kuzatish uchun foydalanish mumkin - masalan, har bir sinf misoliga noyob identifikator berish uchun hisoblagichdan foydalanishga qaror qilsangiz, statik funktsiyadan foydalanishingiz mumkin.

Masalan, siz quyidagi koddan foydalanishingiz mumkin:

Sinf foydalanuvchisi ( private: int id; static int next_id; public: static int next_user_id() ( next_id++; return next_id; ) // foydalanuvchi sinfi user() uchun boshqa usullar // sinf konstruktori ( id = user::next_id++; / / yoki usul chaqiruvi, id = user.next_user_id(); ) ); int user::next_id = 0;

Esda tutingki, siz statik o'zgaruvchini o'rnatayotganda uning turini kiritishingiz kerak!

foydalanuvchi a_user;

identifikatorni boshqa foydalanuvchi ob'ekti tomonidan foydalanilmaydigan keyingi ID raqamiga o'rnatadi. E'tibor bering, identifikatorni doimiy deb e'lon qilish yaxshi uslubdir.

Statikning oxirgi ishlatilishi kod faylidagi global o'zgaruvchidir. Bunday holda, statikdan foydalanish loyihaning bir qismi bo'lgan boshqa fayllardagi manba kodi o'zgaruvchiga kira olmasligini ko'rsatadi. Faqat bitta fayl ichidagi kod o'zgaruvchini ko'rishi mumkin (uning qamrovi fayl bilan cheklangan). Ushbu uslub ob'ektga yo'naltirilgan kodni modellash uchun ishlatilishi mumkin, chunki u o'zgaruvchilarning ko'rinishini cheklaydi va shu bilan nomlar to'qnashuvining oldini olishga yordam beradi. Statikdan foydalanishning bu usuli C dan olingan.

Kirish modifikatoriga qo'shimcha ravishda siz maydon, usul yoki xususiyat nomidan oldin kalit so'z yozishingiz mumkin statik .
« statik " degani, berilgan maydon, usul yoki xususiyat sinfning har bir ob'ektiga emas, balki ularning barchasiga tegishli bo'lishini anglatadi.

Klassik misol: bir xil sinfning nechta ob'ekti yaratilganligini qanday aniqlash mumkin? Bu muammoni hal qilish uchun xizmat qilish kifoya statik maydonlar va usullar.

Keling, yo'lbarslar misolini ko'rib chiqaylik. Keling, sinfni aniqlaymiz " Yo'lbars". Agar biz sinf maydonini shunday yozsak: umumiy int hisobi; keyin har bir ob'ekt shu maydonga ega bo'ladi va har bir ob'ektning o'ziga xosligi bo'ladi. Bundan tashqari, agar bitta ob'ekt yaratilmagan bo'lsa, unda bu maydon umuman mavjud bo'lmaydi.
Shuning uchun, keling, bu maydonni statik qilaylik ( statik).

Keling, hisoblagichni oshiradigan konstruktor yarataylik hisoblash Har bir yangi ob'ektni yaratishda:
public Tiger() ( count++; ).
Bu erda biz yo'lbarsning individual xususiyatlarini ham belgilashimiz mumkin: vazn, balandlik, taxallus.

Shuningdek, biz yaratilgan ob'ektlar sonini ko'rsatadigan statik usulni yozamiz:
umumiy statik bekor ShowNumberOfObjects().

Keyin bizning konsol ilovamiz ikkita sinfga ega bo'ladi:

Ommaviy sinf Tiger ( umumiy statik int count; public Tiger() ( count++; ) public static void ShowNumberOfObjects() ( Console.WriteLine("Tigers = (0)", Tiger.count.ToString()); ) ) sinf Dasturi ( static void Main(string args) ( // Ob'ektlar yaratmasdan yo'lbarslar soni qancha? Tiger.ShowNumberOfObjects(); // 0, chunki biz hali ob'ektlar yaratmaganmiz // 3 ta yo'lbars yaratish Tiger t1 = yangi Tiger (); Tiger t2 = new Tiger (); Tiger t3 = new Tiger (); Tiger.ShowNumberOfObjects(); // 3 ta yo‘lbars chiqadi Console.ReadLine(); ) )

Natija: 3.

Xulosa. Statik usul hech qanday ob'ektga ega bo'lmasdan uni chaqirish imkonini beradi. Ob'ekt nomi o'rniga, usulni chaqirganda, Tiger sinfining nomi ko'rsatiladi: Tiger.ShowNumberOfObjects();

Statik usul va statik bo'lmagan usul o'rtasidagi farqlar:

1. Statik usulni chaqirish uchun ob'ekt kerak emas.
2. Statik usul ichida ob'ektga ishora qiluvchi bu o'zgaruvchi mavjud emas, shunga ko'ra, bu sinfning barcha statik bo'lmagan maydonlari mavjud emas, chunki hech narsa kabi.
3. Oddiy usul ichida ham statik, ham statik bo'lmagan maydonlar mavjud.
4. C# 4.0 dan boshlab, sinfning o'zini statik qilish mumkin bo'ldi.

Ba'zan siz faqat statik usullardan tashkil topgan sinflarni yaratasiz, masalan, Math sinfi. Aslida, bunday sinflar global funktsiyalarning konteynerlaridir, ammo bu OOP kontseptsiyasidan ajralib turadi. Bundan tashqari, mos ravishda statik sinf misollarini yaratish mumkin bo'lmaydi.

Endi “struktura” tushunchasi bilan shug‘ullanib, uning sinfdan farqini bilib olaylik.

Oxirgi yangilanish: 08.10.2017

To'g'ridan-to'g'ri ob'ektga murojaat qiluvchi o'zgaruvchilar va usullardan tashqari, C++ to'g'ridan-to'g'ri sinfga tegishli o'zgaruvchilar va usullarni aniqlash yoki boshqa tarzda statik sinf a'zolarini aniqlash imkonini beradi. Statik o'zgaruvchilar va usullar umuman butun sinfga tegishli. Ularni aniqlash uchun statik kalit so'z ishlatiladi.

Masalan, bankda juda ko'p turli depozitlar bo'lishi mumkin, ammo barcha depozitlar uchun umumiy foiz stavkalari bo'ladi. Shunday qilib, bank hisobini tavsiflash uchun biz quyidagi sinfni aniqlaymiz va foydalanamiz:

#o'z ichiga oladi sinf Hisob ( ommaviy: Hisob(ikki marta) ( bu->sum = summa; ) statik int getRate() ( qaytish tezligi; ) statik bekor setRate(int r) (stavka = r; ) double getIncome() ( summani qaytarish + so'm * tarif / 100; ) xususiy: ikki baravar yig'indi; statik int tezligi; ); int Account::stavka = 8; int main() (Hisob qaydnomasi 1(20000); Hisob qaydnomasi 2(50000); Hisob::setRate(5); // std::cout tezligini tiklash<< "Rate: " << Account::getRate() << std::endl; std::cout << "Rate: " << account1.getRate() << " Income: " << account1.getIncome() << std::endl; std::cout << "Rate: " << account2.getRate() << " Income: " << account2.getIncome() << std::endl; return 0; }

Hisob sinfi ushbu o'zgaruvchini boshqarish uchun bitta statik o'zgaruvchini, tarifni va ikkita statik funktsiyani belgilaydi. Statik funktsiyalarni belgilashda shuni yodda tutingki, ular ichida biz faqat statik klass o'zgaruvchilaridan foydalanishimiz mumkin, masalan, tezlik o'zgaruvchisi. Statik bo'lmagan o'zgaruvchilarni statik funktsiyalarda ishlatib bo'lmaydi.

Bundan tashqari, siz ushbu ko'rsatgichni statik funktsiyalarda ishlata olmaysiz, bu printsipial jihatdan aniq, chunki bu joriy ob'ektga ishora qiladi va statik funktsiyalar butun sinfga tegishli.

Bundan tashqari, agar sinfda statik o'zgaruvchilar bo'lsa, ular sinfdan tashqarida qo'shimcha ravishda aniqlanishi kerak:

Int Account::stavka = 8;

O'zgaruvchiga boshlang'ich qiymat berish shart emas.

Shuni ham ta'kidlash joizki, statik a'zolar butun sinfga tegishli bo'lganligi sababli, statik a'zolar sinf nomidan keyin :: operatoridan foydalanish uchun ishlatiladi. Yoki biz ushbu sinfning o'zgaruvchilari orqali sinfning umumiy a'zolariga kirishimiz mumkin:

Hisob ::getRate() account1.getRate()

Dasturning konsol chiqishi:

Daromad: 5 Daromad: 5 Daromad: 21000 Daromad: 5 Daromad: 52500

Bundan tashqari, statik konstantalar ko'pincha sinflarda qo'llaniladi. Masalan, Hisob sinfida o'zgaruvchan stavkani doimiyga aylantiramiz:

#o'z ichiga oladi sinf Hisob ( ommaviy: const static int rate = 8; Account(ikki marta) ( this->sum = sum; ) double getIncome() ( qaytish summasi + sum * stavka / 100; ) xususiy: ikki barobar summa; ); int main() (Hisob hisobi 1(20000); Hisob qaydnomasi 2(50000); std::cout<< "Rate: " << account1.rate << "\tIncome: " << account1.getIncome() << std::endl; std::cout << "Rate: " << account2.rate << "\tIncome: " << account2.getIncome() << std::endl; return 0; }

Statik o'zgaruvchilardan farqli o'laroq, statik konstantalarni sinfdan tashqarida qo'shimcha aniqlash kerak emas.

25-dars

Hozirgacha siz yaratgan har bir ob'ekt o'z ma'lumotlar elementlari to'plamiga ega. Ilovangiz maqsadiga qarab, bir xil sinf ob'ektlari bir yoki bir nechta ma'lumotlar a'zolarini almashishi kerak bo'lgan holatlar bo'lishi mumkin. Misol uchun, siz 1000 nafar xodimning ish vaqtini kuzatib boradigan to'lov dasturini yozyapsiz deylik. Soliq stavkasini aniqlash uchun dastur har bir xodim ishlaydigan sharoitlarni bilishi kerak. Buning uchun sinf o'zgaruvchisidan foydalanamiz ish_holati. Biroq, agar barcha xodimlar bir xil sharoitlarda ishlasa, dasturingiz ushbu ma'lumotlar elementini barcha turdagi ob'ektlar uchun baham ko'rishi mumkin xodim. Shunday qilib, dasturingiz bir xil ma'lumotning 999 nusxasini tashlab, kerakli xotira hajmini kamaytiradi. Sinf elementini almashish uchun siz ushbu elementni shunday deb e'lon qilishingiz kerak statik (statik). Ushbu dars sinf elementini bir nechta ob'ektlar o'rtasida almashish uchun bajarishingiz kerak bo'lgan qadamlarni o'z ichiga oladi. Ushbu dars oxirida siz quyidagi asosiy tushunchalarni o'zlashtirasiz:

    C++ sizga sinfning bir yoki bir nechta a'zolarini birlashtiradigan bir xil turdagi ob'ektlarga ega bo'lish imkonini beradi.

    Agar sizning dasturingiz umumiy elementga qiymat belgilasa, u holda ushbu sinfning barcha ob'ektlari darhol ushbu yangi qiymatga kirish huquqiga ega bo'ladi.

    Umumiy sinf maʼlumotlari aʼzosini yaratish uchun siz sinf aʼzosi nomini kalit soʻz bilan oldindan belgilashingiz kerak statik.

    Dastur sinf a'zosini e'lon qilgandan so'ng statik, u umumiy sinf a'zosiga mos keladigan global o'zgaruvchini (sinf ta'rifidan tashqarida) e'lon qilishi kerak.

    Sizning dasturlaringiz kalit so'zdan foydalanishi mumkin statik, Dastur hali o'sha sinfning ob'ektlarini e'lon qilmagan bo'lsa-da, sinf usulini chaqirish mumkin qilish.

UMUSHLANGAN BUYUMLAR

Odatda, ma'lum bir sinf ob'ektlarini yaratganingizda, har bir ob'ekt o'z ma'lumotlar a'zolari to'plamini oladi. Biroq, bir xil sinf ob'ektlari bir yoki bir nechta ma'lumotlar elementlarini almashishi kerak bo'lgan holatlar bo'lishi mumkin. (statik e ma'lumotlar elementlari). Bunday hollarda ma'lumotlar a'zolarini deb e'lon qiling umumiy loy va shaxsiy, va keyin kalit so'z bilan turni oldinga qo'ying statik, quyidagi kabi:

xususiy: statik int shared_value;

Sinfni e'lon qilgandan so'ng, quyida ko'rsatilganidek, elementni sinfdan tashqari global o'zgaruvchi sifatida e'lon qilishingiz kerak:

int class_name::shared_value;

Quyidagi dastur SHARE_IT.CPP sinfni belgilaydi kitoblar seriyasi, almashish elementi sahifalar soni, bu sinfning (seriyaning) barcha ob'ektlari (kitoblari) uchun bir xil. Agar dastur ushbu elementning qiymatini o'zgartirsa, o'zgarish darhol sinfning barcha ob'ektlarida aks etadi:

#o'z ichiga oladi

#o'z ichiga oladi

sinf kitoblari_seriyasi

( public: book_series(char *, char *, float); void show_book(void); void set_pages(int) ; private: static int page_count; char title; char author[ 64 ]; float price; );

int book_series::page__count;

void book_series::set_pages(int sahifalar)

(page_count = sahifalar; )

book_series::book_series(char *nom, belgi *muallif, float narxi)

( strcpy (book_series::title, title); strcpy (book_series::muallif, muallif); book_series::narx = narx; )

void book_series::show_book(void)

(kout<< "Заголовок: " << title << endl; cout << "Автор: " << author << endl; cout << "Цена: " << price << endl; cout << "Страницы: " << page_count << endl; }

( book_series programming("C++ da dasturlashni o'rganish", "Jamsa", 22.95); book_series word("Word-dan Windows uchun foydalanishni o'rganish", "Wyatt", 19.95); word.set_pages(256); programming.show_book () ; word.show_book() ; cout<< endl << "Изменение page_count " << endl; programming.set_pages(512); programming.show_book(); word.show_book(); }

Ko'rib turganingizdek, sinf e'lon qiladi sahifalar soni Qanaqasiga statik int. Sinf ta'rifidan so'ng dastur elementni e'lon qiladi sahifalar soni global o'zgaruvchi sifatida. Dastur elementni o'zgartirganda sahifalar soni, o'zgarish darhol sinfning barcha ob'ektlarida aks etadi kitoblar seriyasi.

Sinf a'zolarini baham ko'rish

Dasturingizga qarab, ob'ektning bir nechta nusxalari o'rtasida ma'lum ma'lumotlarni almashish kerak bo'lgan holatlar bo'lishi mumkin. Buning uchun bunday elementni statik deb e'lon qiling. Keyin ushbu elementni sinfdan tashqari global o'zgaruvchi sifatida e'lon qiling. Dasturingiz ushbu elementga kiritgan har qanday o'zgarishlar darhol ushbu sinf ob'ektlarida aks etadi.

Atributlarga ega elementlardan foydalanishumumiy statik agar ob'ektlar mavjud emas

Siz hozirgina bilib olganingizdek, sinf a'zosini deb e'lon qilganda statik bu element berilgan sinfning barcha ob'ektlari tomonidan taqsimlanadi. Biroq, dastur hali ob'ektni yaratmagan holatlar bo'lishi mumkin, lekin u elementdan foydalanishi kerak. Elementdan foydalanish uchun dasturingiz uni shunday deb e'lon qilishi kerak ommaviy va statik. Masalan, quyidagi USE_MBR.CPP dasturi elementdan foydalanadi sahifalar soni sinfdan kitoblar seriyasi, ushbu sinf ob'ektlari mavjud bo'lmasa ham:

#o'z ichiga oladi

#o'z ichiga oladi

sinf kitoblari_seriyasi

(ommaviy: static int page_count; private: char title; char muallifi; float price; );

int book_series::page_count;

void main(void) (book_series::page_count = 256; cout<< "Текущее значение page_count равно " << book_series::page_count << endl; }

Bunday holda, sinf sinfning elementini belgilaydi sahifalar soni Qanaqasiga ommaviy, dastur sinfning ob'ektlari bo'lsa ham, sinfning ushbu elementiga murojaat qilishi mumkin kitoblar seriyasi mavjud emas.

STATIK A'ZO FUNKSIYALARDAN FOYDALANISH

Oldingi dastur foydalanishni tasvirlab berdi statik ma'lumotlar elementlari. Xuddi shunday, C++ ham aniqlash imkonini beradi statik a'zo funktsiyalari (usullari). Agar siz yaratayotgan bo'lsangiz statik usuli bo'lsa, dasturingiz hech qanday ob'ekt yaratilmagan bo'lsa ham ushbu usulni chaqirishi mumkin. Misol uchun, agar sinf sinfdan tashqari ma'lumotlarda ishlatilishi mumkin bo'lgan usulni o'z ichiga olsa, siz ushbu usulni yaratishingiz mumkin statik. Quyida sinf mavjud menyu, displey ekranini tozalash uchun ANSI drayverining esc ketma-ketligidan foydalanadi. Agar tizimingizda ANSI.SYS drayveri o'rnatilgan bo'lsa, usuldan foydalanishingiz mumkin toza_ekran ekranni tozalash uchun. Chunki bu usul deb e'lon qilinadi statik, turdagi ob'ektlar bo'lsa ham dastur undan foydalanishi mumkin menyu mavjud emas. Quyidagi CLR_SCR.CPP dasturi usuldan foydalanadi toza_ekran displey ekranini tozalash uchun:

#o'z ichiga oladi

( public: static void clear_screen(void); // Boshqa usullar bu erda shaxsiy bo'lishi kerak: int_menyu_opsiyalari soni; );

bekor menyusi::clear_screen(void)

(kout<< "\033" << "}