Funksiyalarning ortiqcha yuklanishi
Ma'lumotlar turli tiplari uchun bir algoritmni amalga oshiruvchi funksiyalarni ko'pincha bitta nom bilan atash qulay. Agar bu nom mnemonik bo'lsa, u holda zarur axborotni tashiydi, bu dastur tushunarli qiladi, chunki har bir amal uchun faqat bitta nomni eslab qolish talab etiladi. Bitta nomdagi, lekin turli tipli parametrlarga ega bir nechta funksiyalardan foydalanish funksiyalarni ortiqcha yuklash deb ataladi.
Kompilyator haqiqiy parametrlar tipi bo'yicha qanday funksiyalarni chaqirish lozimligini aniqlaydi. Bu jarayon ortiqcha yuklanishni hal qilish deb ataladi. Funksiya qaytaradigan qiymat tipi hal qilishda ishtirok etmaydi. Hal qilish mexanizmi qoidalarini yetarlicha qiyin jamlanmasiga asoslangan, ma'nosi eng muvofiq argumentlarga ega funksiyadan foydalanish va agar bunday bo'lmasa xabar berishga olib kelinadi. Faraz qilaylik, eng kata qiymatni aniqlovchi funksiyaning to'rtta variant mavjud bo'lsin:\
// ikkita butundan eng kattasini qaytaradi
int max(int, int);
// eng katta uzunlikdagi qism satrni qaytaradi
char* max(char*, char*);
// birinchi parametr va ikkinchi uzunlikdan eng kattasini qaytaradi
int max (int, char*);
// ikkinchi parametr va birinchi uzunlikdan eng kattasini qaytaradi
int max (char*, int);
void f(int a, int b, char* c, char* d){
cout << max (a,b) << max(c, d) << max(a, c) << max(c,b);
}
max funksiyasini chaqirishda kompilyator haqiqiy parametrlar tipiga mos keluvchi funksiya variantini tanlaydi (keltirilgan misolda ketma-ket funksiyaning to'rtta varianti chaqiriladi).
Agar aniqmaslik topilmasa, umumiy qoidalarga mos tartib tiplarida harakat bajariladi, masalan, int ga bool va char, double ga float va h.k. Keyin tiplarning standart almashtirishlari bajariladi. Masalan, double ga int yoki void* ga ko'rsatgichlarni. Keyingi qadam foydalanuvchi barcha tip almashtirishlari bajariladi hamda funksiyaning argumentlari o'zgaruvchan soni hisobiga mosliklarni izlash bajariladi. Agar bitta bosqichda moslik bittadan ko'p usul bilan olingan bo'lsa, chaqirish bir qiymatli deb hisoblanadi va xato haqida xabar chiqariladi.
Bir qiymatli moslik bo'lmaslik:
Tipni almashtirishdagi bir qiymatli bo'lmaslikka misol
#include
float f(float i){
cout << "function float f(float i)" << endl;
return i;
}
double f(double i){
cout << "function double f(double i)" << endl;
return i*2;
}
int main(){
float x = 10.09;
double y = 10.09;
cout << f(x) << endl; // f(float) chaqiriladi
cout << f(y) << endl; // f(double) chaqiriladi
/* cout << f(10) << endl; Bir qiymatli bo'lmaslik – как преобразовать 10: во float yoki double? */
return 0;
}
Bu kamchilikni bartaraf etish uchun 10 konstanta uchun tipi oshkor keltirish talab etiladi.
Murojaat – parametrlardan foydalanganda bir qiymatli bo'lmaslik misoli: agar ortiqcha yuklanuvchi funksiyalardan biri int f(int a, int b), ikkinchisi int f(int a, int &b) kabi e’lon qilinsa, u holda kompilyator bu funksiyalardan qaysi biri qaysi birini chaqirayotganini bilmaydi, chunki qiymat bo'yicha parametr oladigan funksiyani chaqirish bilan murojaat bo'yicha parametr oladigan funksiyani chaqirish orasida sintaktik farqlar yo'q.
Jimlik bo'yicha argumentlardan foydalanishda bir qiymatli bo'lmaslik misoli:
#include
int f(int a){return a;}
int f(int a, int b = 1) {return a * b;}
int main(){
cout << f(10, 2); // f(int, int) chaqiriladi
/* cout << f(10); Bir qiymatli bo'lmaslik – nima chaqiriladi: f(int, int) yoki f(int) ? */
return 0;
}
Quyida ortiqcha yuklangan funksiyalarni tavsiflash qoidalari keltirilgan.
Ortiqcha yuklangan funksiyalar bitta ko'rinish sohasida joylashishi lozim, aks holda ichma-ich joylashgan bloklarda o'zgaruvchilar bir xil nomlarga o'xshash yashirinish ro'y beradi.
Ortiqcha yuklangan funksiyalar jimlik bo'yicha parametrlarga ega bo'lishi mumkin, bunda turli funksiyalardan bitta parametr qiymatlari ustma-ust tushish lozim.
Функции не могут быть перегружены, если описание их параметров отличается только модификатором const или использованием ссылки (например, int и const int или int и int&).
Do'stlaringiz bilan baham: |