7-MA’RUZA
MAVZU: Funksiyalarni qayta yuklash, funksiya argumentlariga boshlang‘ich qiymatlar berish, Inline – joylashtirilgan funksiyalar
Reja:
Funksiyalarni qayta yuklash;
Funksiyaning prototiplari;
Jimlik qoidasi argumentlari;
Inline – joylashtirilgan funksiyalar.
Kalit so‘zlar:
actual parameter
ambiguous invocation
argument
automatic variable
bottom-up implementation
divide and conquer
formal parameter (i.e., parameter)
function abstraction
function declaration
function header
function overloading
function prototype
function signature
global variable
information hiding
inline function
local variable
parameter list
pass-by-reference
pass-by-value
reference variable
scope of variable
static local variable
stepwise refinement
stub
top-down implementation
11.1. Funksiyalarni qayta yuklash
Key Point.Funksiyalarniqayta yuklash funksiyalarni bir xil nom, turlicha bosh qismibilan e’lon qilinishini ta’minlaydi.
Avvalroq o`rganganimiz, max funksiyasi faqat int ma’lumot turi bilan ishlaydi. Agar biz ikki haqiqiy sonlardan kattasini topishimiz kerak bo`lib qolsachi? Bu masalani hal etish uchun, quyidagi kodda keltirilgani kabi, bir xil nom bilan, biroq parametrlari turlicha bo`lgan boshqa bir funksiyani hosil qilish lozim:
doublemax(doubleson1, doubleson2)
{
if(son1>son2)
returnson1;
else
returnson2;
}
Agar max funksiyasi int turdagi parametrlar bilan chaqirilsa, max funksiyasi chaqiruvchi nuqtaga int turdagi parametrlarni hisoblab yuboradi; agar max funksiyasi double turdagi parametrlar bilan chaqirilsa, max funksiyasi chaqiruvchi nuqtaga double turdagi parametrlarni hisoblab yuboradi. Bir faylda joylashgan, bir xil nomdagi va turlicha parametrlarga ega bo`lgan funksiyalarni chaqirish, dasturlashda funksiyalarni qayta yuklash - deb talqin qilinadi. Bunda C++ kompilyatori qaysi funksiyani chaqirishni uning bosh qismiga qarab tanlab oladi.
11.1-kodli ro`yxatda uchta funksiyani hosil qilish keltirilgan. Birinchisi, int turidagi sonlardan kattasini topadi, ikkinchisi, double turidagi sonlardan kattasini topadi, uchinchisi esa, uchta double turidagi sonlardan kattasini topadi. Bunda uchala funksiya ham maxdeb nomlangan.
11.1-kodli ro`yxat. TestFunksiyaniQaytaYuklash.cpp
1 #include
2 using namespacestd;
3
4 // int turidagi ikki sondan kattasini topish
5 intmax(int son1, int son2)
6 {
7 if(son1>son2)
8 return son1;
9 else
10 return son2;
11 }
12
13 // double turidagi ikki sondan kattasini topish
14 doublemax(double son1, double son2)
15 {
16 if(son1>son2)
17 return son1;
18 else
19 return son2;
20 }
21
22 // double turidagi uchta sondan kattasini topish
23 doublemax(double son1, double son2, double son3)
24 {
25 returnmax(max(son1, son2), son3);
26 }
27
28 intmain()
29 {
30 // max funksiyasini int turida argument berib chaqirish
31 cout << "3 va 4 orasidagi katta son: "<< max(3, 4) << endl;
32
33 // max funksiyasini double turida argument berib chaqirish
34 cout << "3.0 va 5.4 orasidagi katta son: "
35 << max(3.0, 5.4) << endl;
36
37 // max funksiyasini uchta double turidagi argumentlarni berib chaqirish
38 cout<<3.0, 5.4 va 10.14 orasidagi katta son: "
39 << max(3.0, 5.4, 10.14) << endl;
40
41 return 0;
42 }
Bu yerda, max funksiyasining max(3, 4) ko`rinishda chaqirilishi (31-satr) natijasida ikkita butun sondan kattasi aniqlanadi. max funksiyasining max(3.0, 5.4) ko`rinishda chaqirilishi (35-satr) natijasida ikkita haqiqiy sondan kattasi aniqlanadi. max funksiyasining max(3.0, 5.4, 10.14) ko`rinishda chaqirilishi (39-satr) natijasida uchta haqiqiy sonlardan kattasi aniqlanadi.
Xo`sh, max funksiyasini bir vaqtning o`zida,max(2,2.5) kabi, bitta int argument va bitta double argument bilan chaqira olamizmi? Agar buning imkoni bo`lsa, unda qaysi max funksiyasi chaqirilgan bo`ladi? Birinchi savolga javob – ha. Ikkinchi savolga javob – bunda ikki double turidagi sondan kattasini qaytaruvchimax funksiyasi chaqirilgan bo`ladi. Bunda2 argumenti avtomatik tarzda double turiga o`giriladi va funksiyaga yuboriladi. “Nima uchun bunday vaziyatda max(double, double) funksiyasi chaqirilmagan, axir u har ikkala tur uchun ham o`rinliku” - deb xayron bo`lishingiz mumkin. C++ kompilyatori bunday vaziyatda aynan mos funksiyani chaqiradi. Ikkita butun sondan kattasini aniqlash uchun, max(int, int) funksiyasi ko`proq mos keladi. Ba’zida, funksiyani chaqirishda ikki yoki undan ko`proq moslik holatlari uchrab turadi. Bunda kompilyator qaysi birini tanlash kerakligini aniqlay olmaydi va kompilyatsion xatolik beradi. Bu dasturlashda tushunarsiz chaqiruv deb talqin qilinadi. Tushunarsiz chaqiruv kompilyatsion xatolik sodir bo`lishiga sababchi bo`ladi. Quyidagi kodni ko`rib chiqamiz:
#include
using namespacestd;
intmaxNumber(intnum1, doublenum2)
{
if(num1 > num2)
returnnum1;
else
returnnum2;
}
doublemaxNumber(doublenum1, intnum2)
{
if(num1 > num2)
returnnum1;
else
returnnum2;
}
intmain()
{
cout << maxNumber(1, 2) << endl;
return 0;
}
Bu yerda maxNumber(int, double) vamaxNumber(double, int) larning har ikkalasi ham maxNumber(1, 2) ni hisoblashga bir xil darajada mos tushadi. Natijada kompilyatsion xatolik yuz beradi.
Do'stlaringiz bilan baham: |