6. Joylashtiriladigan (inline) funksiyalar
Kompilyator ishlashi natijasida har bir funksiya mashina kodi ko‘rinishida bo‘ladi.
Agar dasturda funksiyani chaqirish ko‘rsatmasi bo‘lsa, shu joyda funksiyani adresi
bo‘yicha chaqirishning mashina kodi shakllanadi. Odatda funksiyani chaqirish
protsessor tomonidan qo‘shimcha vaqt va xotira resurslarini talab qiladi. Shu
sababli, agar chaqiriladigan funksiya hajmi unchalik katta bo‘lmagan hollarda,
kompilyatorga funksiyani chaqirish kodi o‘rniga funksiya tanasini o‘zini
joylashtirishga ko‘rsatma berish mumkin. Bu ish funksiya prototipini inline kalit
so‘zi bilan e’lon qilish orqali amalga oshiriladi. Natijada hajmi oshgan, lekin
nisbatan tez baja-riladigan dastur kodi yuzaga keladi.
Funksiya kodi joylashtiriladigan dasturga misol.
#include
using namespace std;
inline int Summa(int, int);
int main()
{
int a=2,b=6,c=3;
char yangi_qator = ‘\n’;
cout << Summa(a,b) << yangi_qator;
cout << Summa(a,c) << yangi_qator;
cout << Summa(b,c) << yangi_qator;
return 0;
}
int Summa(int x, int y)
{
return x+y;
}
Keltirilgan dastur kodini hosil qilishda Summa() funksiyasi chaqirilgan joylarga
uning tanasidagi buyruqlar joylashtiriladi.
7. Qayta yuklanuvchi funksiyalar
Ayrim algoritmlar berilganlarning har xil turdagi qiymatlari uchun qo‘llanishi
mumkin. Masalan, ikkita sonning maksimumini topish algoritmida bu sonlar butun
yoki haqiqiy turda bo‘lishi mumkin. Bunday hollarda bu algoritmlar amalga
oshirilgan funksiyalar nomlari bir xil bo‘lgani ma’qul. Bir nechta funksiyani bir xil
nomlash, lekin har xil turdagi parametrlar bilan ishlatish
funksiyani qayta yuklash
deyiladi.
Kompilyator parametrlar turiga va soniga qarab mos funksiyani chaqiradi. Bunday
amalni «
hal qilish amali
» deyiladi va uning maqsadi parametrlarga ko‘ra aynan
(nisbatan) to‘g‘ri keladigan funksiyani chaqirishdir. Agar bunday funksiya
topilmasa kompilyator xatolik haqida xabar beradi. Funksiyani aniqlashda funksiya
qaytaruvchi qiymat turining ahamiyati yo‘q. Misol:
#include
using namespace std;
int max(int,int);
char max(char,char);
float max(float,float)
int max(int,int,int);
void main()
{
int a,int b,char c,char d,int k,float x,y;
cin>>a>>b>>k>>c>>d>>x>>y;
cout<}
int max(int i,int j){return (i>j)?i:j;}
char max(char s1,char s2){return (s1>s2)?s1:s2;}
float max(float x,float y){return (x>y)?x:y;}
int max(int i,int j,int k)
{
return (i>j)?(i>k? i:k;):((j>k)?j:k;);
}
Agar funksiya chaqirilishida argument turi uning prototipidagi xuddi shu o‘rindagi
parametr turiga mos kelmasa, kompilyator uni parametr turiga keltirilishga harakat
qiladi - bool va char turlarini int turiga, float turini double turiga va int turini
double turiga o‘tkazishga.
Qayta yuklanuvchi funksiyalardan foydalanishda quyidagi qoidalarga rioya qilish
kerak:
- qayta yuklanuvchi funksiyalar bitta ko‘rinish sohasida bo‘lishi kerak;
qayta yuklanuvchi funksiyalarda kelishuv bo‘yicha parametrlar ishlatilsa, bunday
parametrlar barcha qayta yuklanuvchi funksiyalarda ham ishlatilishi va ular bir xil
qiymatga ega bo‘lish kerak;
- agar funksiyalar parametrlarining turi faqat «const» va ‘&’ belgilari bilan farq
qiladigan bo‘lsa, bu funksiyalar qayta yuklanmaydi.
Do'stlaringiz bilan baham: |