Ba'zi bir funksiyalar ko'pincha bir hil qiymatli argumentlar bilan chaqirilishi mumkin. Bu
holda, agar biz funksiya argumentlariga ushbu ko'p qo'llaniladigan qiymatlarni bersak,
funksiya argumentsiz chaqirilganda bu qiymatlar kompilyator tomonidan chaqiriqqa
kiritiladi. Berilgan qiymatlar funksiya prototipida berilsa kifoyadir.
Berilgan qiymatli argumentlar parametrlar ro'hatida eng o'ng tomonda yozilishi kerak.
Buning sababi shuki, agar argument qiymati tashlanib o'tilgan bo'lsa, va u o'ng tomonda
joylashmagan bo'lsa, biz bo'sh vergullani qo'yishimizga to'g'ri keladi, bu esa mumkin
emas. Agar bir necha berilgan qiymatli argumentlar bor bo'lsa, va eng o'ngda
joylashmagan argument tushurilib qoldirilsa, undan keyingi argumentlar ham
yozilmasligi kerak.
Bir misol keltiraylik.
//Berilgan qiymatli parametrlar bilan ishlash
# include int square(int = 1, int = 1); // ...(int a=1, int b=1)...
// yuqoridagi kabi o'zgaruvchilar otini ham
// berishimiz mumkin
int main()
{
int s = 3, t = 7;
cout << "Paremetrsiz: " << square()<< endl;
cout << "Bitta parametr (ikkinchisi) bilan:" << square(t) << endl;
cout << "Ikkita parametr bilan:" << square(s,t) << endl;
return (0);
}
int square(int k, int g){
return ( k * g );
}
Ekranda:
Parametrsiz: 1
Bitta parametr (ikkinchisi) bilan: 7
Ikkita parametr bilan: 21
Bir hil ismli bir necha funksiya e'lon qilinishi mumkin. Bu C++ dagi juda kuchli
tushunchalardandir. Yuklatilgan funksiyalarning faqat kirish parametrlari farqli bo'lishi
yetarlidir. Qaytish parametri yuklatilishda ahamiyati yo'qdir. Yuklangan funksiyalar
chaqirilganda, qaysi funksiyani chaqirish kirish parametrlarining soniga, ularning tipiga
va navbatiga bog'liqdir. Yani ism yuklanishida funksiyaning imzosi rol o'ynidi. Agar kirish
parametrlari va ismlari ayni funksiyalarning farqi faqat ularning qaytish qiymatlarida
bo'lsa, bu yuklanish bo'lmaydi, kompilyator buni hato deb e'lon qiladi. Funksiya
yuklanishi asosan ayni ishni yoki amalni farqli usul bilan farqli ma'lumot tiplari ustida
bajarish uchun qo'llaniladi. Masalan bir fazoviy jismning hajmini hisoblash kerak bo'lsin.
Har bir jismning hajmi farqli formula yordamida, yani farqli usulda topiladi, bir jismda
radius tushunchasi bor bo'lsa, boshqasida asos yoki tomon tushunchasi bor bo'ladi, bu
esa farqli ma'lumot tiplariga kiradi. Lekin amal ayni - hajmni hisoblash. Demak, biz
funksiya yuklanishi mehanizmini qo'llasak bo'ladi. Bir hil amalni bajaruvchi funksiyalarni
ayni nom bilan atashimiz esa, dasturni o'qib tushunishni osonlashtiradi. Kompilaytor biz
bergan funksiya imzosidan (imzoga funksiya ismi va kirish parametrlari kiradi,
funksiyaning qaytish qiymati esa imzoga kirmaydi) yagona ism tuzadi, dastur ijrosi
davruda esa funksiya chaqirig'idagi argumentlarga qarab, kerakli funksiyani chaqiradi.Yangi ismni tuzish operatsiyasi ismlar dekoratsiyasi deb ataladi. Bu tushunchalarni
misolda ko'rib chiqaylik. // Yuklatilgan funksiyalarni qo'llash
# include # include // Yangi ismlar sohasini aniqladik
namespace
mathematics {
const double Pi = 3.14159265358979;
double hajm(double radius); // sharning hajmi uchun - 4/3 * Pi * r^3
double hajm(double a, double b, double s) // kubning hajmi uchun - abc
}
using namespace mathematics;
int main()
{
double d = 5.99; // sharning radiusi
int x = 7, y = 18, z = 43;
cout << "Sharninig hajmi: " << hajm(d) << endl;
cout << "Kubning hajmi: " << hajm(x,y,z) << endl;
return (0);
}
double mathematics::hajm(double radius) {
return ( (Pi * pow(radius,3) * 4.0) / 3.0 );
}
double mathematics::hajm(double a, double b, double c) {
return ( a * b * c );
}
Ekranda:
Sharning hajmi: 900.2623
Kubning hajmi: 5418
Yuqoridagi dasturda yangi ismlar sohasini aniqladik, unda Pi konstantasini
e'lon qildik. shaqning hajmini hisoblashda standart kutubhonadagi pow()
funksiyasini ishlatdik, shu sababli e'lon faylini # include ifodasi
bilan kiritdik. Ismlar sohasida joylashgan funksiyalarni aniqlash uchun, yani
ularning tanasini yozish uchun biz ilarning to'liq ismini berishimiz kerak.
Albatta, agar funksiya ismlar sohasining ichida aniqlangan bo'lsa, tashqarida
boshqattan yozib o'tirishning hojati yo'q. hajm() funksiyalarining to'liq
ismi mathematics::hajm(...) dir. :: operatori sohalarni bog'lovchi
operatordir. Yangi ismlar sohasini faqatgina misol tariqasida berdik, uni
funksiya yuklanishlari bilan hech qanday aloqasi yo'qdir. Funksiya ismlari
yuklanishi, ko'rib turganimizdek, juda qulay narsadir.
Funksiya yuklanishini qo'llaganimizda, funksiyalar argumentlarining berilgan
qiymatlarini ehtiyotkorlik bilan qo'llashimiz lozim. Masalan bizda ikkita
funksiyamiz bor bo'lsin.
foo(int k = 0); // berilgan qiymati 0
foo();Bu ikki funksiya yuklatilgan. Lekin agar biz birinchi funksiyani dasturda
argumentsiz chaqirsak, kompilyator qaysi funksiyani chaqirishni bilmaydi, va
shu sababli hato beradi. Biroq bu deganimiz funksiya yuklanishi bilan berilgan
qiymatlar qo'llanilishi mumkin emas deganimiz emas, eng muhimi funksiya
chaqirig'ini ikki hil tushunish bo'lmasligi kerak.