Mavzu: Sinflarni yaratishda funksiyalarni qayta yuklash mexanizimidan unumli foydalanish. Reja: Kirish


Funktsiyalarning haddan tashqari yuklanishidagi turdagi taxalluslar



Yüklə 155,87 Kb.
səhifə6/8
tarix24.12.2023
ölçüsü155,87 Kb.
#158242
1   2   3   4   5   6   7   8
Sinflarni yaratishda funksiyalarni qayta yuklash mexanizimidan unumli foydalanish.

Funktsiyalarning haddan tashqari yuklanishidagi turdagi taxalluslar


Typedef deklaratsiyasi (turdagi taxallus) yangi ma'lumotlar turini yaratmaganligi sababli, print () funktsiyasining quyidagi ikkita deklaratsiyasi bir xil deb hisoblanadi:

1
2
3

typedef char *string;
void print(string value);
void print(char *value);

4.2. Funktsiya qo'ng'iroqlari



Haddan tashqari Yuklangan funktsiyani chaqirish uchta mumkin bo'lgan natijalardan biriga olib keladi:
Tasodif topildi. Tegishli ortiqcha Yuklangan funktsiya uchun qo'ng'iroq qilishga ruxsat beriladi.
Tasodif topilmadi. Argumentlar ortiqcha Yuklangan funktsiyalarning birortasiga mos kelmaydi.
Bir nechta tasodiflar topildi. Argumentlar bir nechta ortiqcha Yuklangan funktsiyaga mos keladi.
Haddan tashqari Yuklangan funktsiyani kompilyatsiya qilishda C++ funktsiyaning qaysi versiyasini chaqirish kerakligini aniqlash uchun quyidagi amallarni bajaradi:
1-qadam: C++ aniq moslikni topishga harakat qiladi. Bu haqiqiy argument haddan tashqari Yuklangan funktsiyalardan birining parametr turiga to'liq mos keladigan holat. Masalan,:

1
2
3
4

void print(char *value);
void print(int value);
chop(0); // chop etish(int)bilan aniq moslik

0Texnik jihatdan mos kelishi mumkin va print(char *)(nol ko'rsatkich sifatida), lekin u to'liq mos print(int)keladi . Shunday qilib, print(int)bu eng yaxshi (aniq) tasodif.
Agar aniq moslik topilmasa, C++ keyingi yashirin turdagi konvertatsiya qilish orqali moslikni topishga harakat qiladi 2-qadam:55-darsda biz ba'zi ma'lumotlar turlari avtomatik ravishda boshqa ma'lumotlar turlariga aylanishi mumkinligi haqida gaplashdik. Qisqasi, keyin:
 char, unsigned char va short int ga aylantiriladi;
 unsigned short int yoki unsigned int ga aylantirilishi mumkin (int hajmiga qarab);
 float double ga aylantiriladi;
enum int ga aylantiriladi.
Masalan,:

1
2
3
4

void print(char *value);
void print(int value);
chop etish('b'); // yashirin konvertatsiya qilinganidan keyin chop etish(int) bilan mos kelish

Bunday holda, yo'q print(char)bo'lgani uchun, belgi bint turiga aylantiriladi, keyin u allaqachon mos print(int)keladi .
C++ standart konvertatsiya orqali moslikni topishga harakat qiladi 3-qadam: agar yashirin konvertatsiya qilish mumkin bo'lmasa, unda. Standart transformatsiyada:
 Har qanday raqamli tur boshqa har qanday raqamli turga mos keladi, shu jumladan imzolanmagan (masalan, int floatga teng).
 enum raqamli ma'lumotlar turining rasmiy turiga mos keladi (masalan, enum floatga teng).
 Nol ko'rsatkich turiga va raqamli turga mos keladi (masalan, 0qanday char *yoki 0qanday float).
 Ko'rsatgich void tipidagi ko'rsatgichga mos keladi.
Masalan,:

1
2
3
4
5

struct Employee; / / ta'rifni o'tkazib yuboring
void print(float value);
void print(Employee value);
print('b'); // 'b' print(float)versiyasiga mos keladi

Bunday holda, yo'q print(char)(aniq mos keladigan) va yo'q print(int)(yashirin konvertatsiya bilan mos keladigan) bo'lgani uchun, belgi bfloat turiga aylantiriladi va mos keladi print(float).
E'tibor bering, barcha standart transformatsiyalar teng deb hisoblanadi. Ularning hech biri ustuvorlikda boshqalardan ustun deb hisoblanmaydi.
4-qadam: C++ maxsus konvertatsiya qilish orqali moslikni topishga harakat qiladi. Biz hali sinflarni ko'rib chiqmagan bo'lsak-da, ular ushbu sinflarning ob'ektlariga bevosita qo'llanilishi mumkin bo'lgan boshqa ma'lumotlar turlariga konversiyalarni belgilashi mumkin. Masalan, biz sinf yaratishimiz Wva unda int turiga maxsus konversiyani aniqlashimiz mumkin:

1
2
3
4
5
6
7

class W; / / maxsus int turiga aylantirish bilan
void print(float value);
void print(int value);
W qiymati; / / v sinf turidagi qiymat o'zgaruvchisini e'lon qilish
chop etish (qiymat); / / qiymat int ga aylantiriladi va shuning uchun chop etish(int)ga mos keladi

valueSinf turiga tegishli bo'lsa-daW, lekin int turiga maxsus konvertatsiya qilinganligi sababli, qo'ng'iroq print(value)versiyaga mos print(int)keladi .
Sinflarda maxsus konversiyalarni qanday qilishni tegishli darslarda ko'rib chiqamiz.



Yüklə 155,87 Kb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə