O`ZBEKISTON RESPUBLIKASI OLIY VA
O’RTA MAXSUS TA`LIM VAZIRLIGI SAMARQAND DAVLAT
UNIVERSITETI RAQAMLI TEXNOLOGIYALAR
FAKULTETI DASTURIY INJINIRING YO’NALISHI
209-GURUH TALABASI TINCHLIKOV ELDORNING
DASTURLASH ASOSLARI FANIDAN
MUSTAQIL ISH
MAVZU : ENUM SINFLARI.
BAJARDI : TINCHLIKOV E.
TEKSHIRDI : ESHONQULOV E.
SAMARQAND 2022
22. Enum sinflari.
Enumlar C++ tilida alohida ma’lumotlar turlari hisoblansa-da, ular birinchi qarashda ko‘rinadigan darajada xavfsiz emas va ba’zi hollarda mantiqiy bo‘lmagan ishlarni bajarishga imkon beradi. Misol uchun:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#include
int main()
{
enum Fruits
{
LEMON, // LEMON bilan bir xil doirada MEVALAR
KIWI
};
enum Colors
{
PINK, // PUSHTI bilan bir xil doirada RANG
KULRANG
};
Fruits fruit = LEMON; // MEVA va LEMON bir xil miqyosda mavjud (prefiks qo'shish shart emas)
Colors color = PINK; // RANG va PINK bir xil miqyosda mavjud (prefiks qo'shish shart emas)
if (fruit == color) // kompilyator bu o'zgaruvchilarni butun sonlar sifatida tasniflanadi
std::cout << " meva va rang teng \n"; // va ular teng ekanligini toping!
else
std::cout << " meva va rang bir xil emas \n";
return 0;
}
|
C++ meva va rang o'zgaruvchilarni solishtirganda, ularni bilvosita butun son qiymatlariga aylantiradi va bu butun sonlarni taqqoslaydi. Ushbu ikki o'zgaruvchining qiymatlari 0 qiymatiga ega bo'lgan hisoblagichlar bo'lganligi sababli, bu yuqoridagi misolda meva = rang ekanligini anglatadi. Va bu unchalik bo'lmasligi kerak, chunki meva va rang turli xil ro'yxatga olingan va ularni umuman taqqoslab bo'lmaydi (meva va rang!). Muntazam hisoblagichlar bilan bunday taqqoslashlarning oldini olishning iloji yo'q.
Ushbu muammoni hal qilish uchun C ++ 11 enum sinflarini (yoki "ko'lamli enumlar") qo'shdi, ular siz allaqachon tushunganingizdek, barcha qoidalari bilan mahalliy qamrovni qo'shadi. Bunday sinfni yaratish uchun sanab o'tilgandan keyin darhol class kalit so'zini qo'shish kifoya. Misol uchun:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#include
int main()
{
enum class Fruits // enumga "sinf" qo'shilishi standart "global" enum o'rniga ko'lamli enumni belgilaydi
{
LEMON, // LEMON bilan bir xil doirada Fruits
KIWI
};
enum class Colors
{
PINK, // PINK bilan bir xil doirada Colors
GRAY
};
Fruits fruit = Fruits::LEMON; // Eslatma: LEMON bevosita mavjud emas, biz foydalanishimiz kerak Fruits::LEMON
Colors color = Colors::PINK; //Eslatma: PINK bevosita mavjud emas, biz foydalanishimiz kerak Colors::PINK
if (fruit == color) // kompilyatsiya xatosi, chunki kompilyator turli turlarni solishtirishni bilmaydi:Fruits и Colors
std::cout << " meva va rang teng \n";
else
std::cout << " meva va rang bir xil emas \n";
return 0;
}
|
Standart hisoblagichlar raqamning o'zi (global miqyosda) bilan bir xil doirada, shuning uchun siz ularga to'g'ridan-to'g'ri kirishingiz mumkin (masalan, PINK). Biroq, har bir sanab o'tuvchining ko'lamini uning ro'yxati doirasiga cheklaydigan sinf qo'shilishi bilan unga kirish uchun qamrovni aniqlash operatori kerak bo'ladi (masalan, Colors::PINK). Bu nomlarning to'qnashuvi xavfini sezilarli darajada kamaytiradi.
Hisoblagichlar enum sinfining bir qismi bo'lganligi sababli, identifikatorlarni prefikslashning hojati yo'q (masalan, siz COLOR_PINK o'rniga PINK dan foydalanishingiz mumkin, chunki Colors::COLOR_PINK allaqachon ortiqcha bo'lar edi).
Enum sinflarining qat'iy turdagi qoidalari har bir enum sinfining o'ziga xos tip deb hisoblanishini anglatadi. Bu shuni anglatadiki, kompilyator turli xil raqamlardagi raqamlarni taqqoslay olmaydi. Agar siz buni qilishga harakat qilsangiz, kompilyator xatoga yo'l qo'yadi (yuqoridagi misolda bo'lgani kabi). Shu bilan birga, siz bir xil enum sinfidagi hisoblagichlarni solishtirishingiz mumkinligiga e'tibor bering (chunki bu hisoblagichlar bir xil turdagi):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include
int main()
{
enum class Colors
{
PINK,
GRAY
};
Colors color = Colors::PINK;
if (color == Colors::PINK) // bu odatiy
std::cout << "The color is pink!\n";
else if (color == Colors::GRAY)
std::cout << " Rangi kulrang!\n";
return 0;
}
|
Enum sinflari bilan kompilyator endi enum qiymatlarini bilvosita butun sonlarga aylantira olmaydi. Bu yaxshi! Ammo ba'zida siz ushbu xususiyatni qaytarishingiz kerak bo'lgan holatlar bo'lishi mumkin. Bunday hollarda, static_cast operatoridan foydalanib, aniq sanab o'tuvchini int ga yuborishingiz mumkin:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include
int main()
{
enum class Colors
{
PINK,
GRAY
};
Colors color = Colors::GRAY;
std::cout << color; // ishlamaydi, chunki turga aniq konvertatsiya yo'q int
std::cout << static_cast(color); // natija bo'ladi 1
return 0;
}
|
Agar siz C++ 11 ni qo'llab-quvvatlaydigan kompilyatordan foydalanayotgan bo'lsangiz, u holda enum sinflari o'rniga oddiy enumlardan foydalanishning ma'nosi yo'q.
E'tibor bering, sinf kalit so'zi, statik kalit so'z bilan bir qatorda, C++ tilida eng chalkash so'zlar qatoriga kiradi, chunki natija foydalanish holatiga (kontekst) juda bog'liq. Enum sinflari class kalit so'zidan foydalanishiga qaramasdan, ular C++ tilida an'anaviy "sinflar" hisoblanmaydi. An'anaviy darslar haqida biroz keyinroq gaplashamiz.
ELDOR TINCHLIKOV
Do'stlaringiz bilan baham: |