FUNKSIYALAR
Funksiyalarni e'lon qilish va tavsiflash
Funksiya – bu qandaydir tugallangan amalni bajaruvchi nomlangan tavsiflar va operatorlar ketma-ketligi. Funksiya parametrlarni qabul qilishi va qiymatni qaytarishi mumkin.
C++ dagi ixtiyoriy dastur ulardan bittasi main degan nomga ega bo'lishi lozim bo'lgan (undan dasturni bajarish boshlanadi) funksiyalardan iborat. Funksiya chaqirish momentida bajarila boshlaydi. Ixtiyoriy funksiya e'lon qilinishi va ta'riflanishi lozim. Boshqa miqdorlar kabi e'lon bir nechta, ta'riflash esa bitta bo'ladi. Funksiyaning e'loni kompilyator chaqirish to'g'riligini tekshirishni amalga oshirishi uchun matnda uni chaqirishdan oldin joylashishi lozim.
Funksiyani e'lon qilish (prototip, sarlavha, signatura) uning nomini, qaytariladigan qiymat tipini beradi. Funksiya ta'rifi, e'londan tashqari o'rta qavslarda operator va tavsiflar ketma-ketligidan iborat funksiya jismidan iborat:
[ sinf ] tip nomi ([ parametrlar ro'yxati ]) [throw ( yo'qotishlar )]
{ funksiya jismi }
Ta'rifning tarkibiy qismlarini qaraymiz.
Majburiy bo'lmagan modifikator yordamida sinfni extern va static tayanch so'zlaridan foydalanib funksiyaning ko'rinish sohasini oshkora berish mumkin:
extern – dasturning barcha modullarida global ko'rinishi (jimlik bo'yicha);
static – funksiya aniqlangan faqat chegaralardagi ko'rinishi;
Funksiya bilan qaytariluvchi qiymat tipi massiv va funksiyadan tashqari ixtiyoriy bo'lishi mumkin (massiv yoki funksiyaga ko'rsatgich bo'lishi mumkin). Agar funksiya qiymatni qaytarmasligi lozim bo'lsa, void tipi ko'rsatiladi.
Parametrlar ro'yxati funksiyaga uni chaqirishda talab etiladigan miqdorlarni aniqlaydi. Parametrlar ro'yxati elementlari vergullar bilan ajratiladi. Funksiyaga uzatiluvchi har bir parametr uchun uning tipi va nomi (e'londa nomlar tashlab yuborish mumkin) ko'rsatiladi.
Ta'rifda va e'londa va bitta funksiyani chaqirishda parametrlar tiplari va joylashish tartibi ustma-ust tushishi mumkin. Moslik bo'yicha parametrlar nomlariga cheklovlar qo'yilmaydi, chunki funksiyani turli argumentlar bilan chaqirish mumkin, prototiplarda nomlar kompilyator tomonidan inkor etiladi (ular faqat dasturning o'qilishini yaxshilash uchun xizmat qiladi).
Funksyani inline modifikator yordamida ichga qurilgan kabi aniqlash mumkin, u kompilyatorga funksiyaga murojaat qilish o'rniga uni bevosita har bir chaqirish nuqtasiga joylashtirishni tavsiya qiladi. inline modifikator funksiya tipi oldiga qo'yiladi. U chaqirishga qo'shimcha sarflarni (registrlarni saqlash va tiklash, boshqaruvni uzatish) pasaytirish maqsadida qisqa funksiyalar uchun qo'llaniladi. inline direktiva tavsiya xarakterga ega va kompilyator yomonidan imkoniyat darajasida bajaradi. inline – funksiyalardan foydalanish bajariluvchi dastur hajmini oshiradi. Funksiya ta'rifi uni chaqirishlardan oldin kelishi lozim, aks holda inline – kengaytma o'rniga kompilyator odatdagi chaqiriqni hosil qiladi.
Qaytariluvchi qiymat tipi va parametr tiplarga birgalikda funksiya tipini aniqlaydi.
Oddiy holda funksiyani chaqirish uchun uning nomini ko'rsatish lozim, undan keyin qavslarda vergullardan foydalanib, uzatilayotgan argumentlar nomlari sanab o'tiladi. Funksiyani chaqirish dasturning ixtiyoriy joyida joylashishi mumkin, bu yerda funksiya shakllantiradigan sintaksis bo'yicha yo'l qo'yiladigan o'sha tip ifodalanadi. Agar funksiya bilan qaytariladgan qiymat tipi void bo'lmasa, u ifodalar tarkibiga kirishi mumkin yoki xususiy holda, qiymat berish operatori o'ng qismida joylashishi mumkin.
Ikkita butun miqdor yig'indisini qaytaruvchi funksiyaga misol:
#include
int sum(int a, int b); // funksiyani e’lon qilish
int main () {
int a = 2, b = 3, c, d;
c = sum(a, b); // funksiyani chaqirish
cin >> d;
cout << sum (c, d); // funksiyani chaqirish
return 0;
}
int sum(int a, int b) { // funksiya ta'rifi
return (a + b);
}
Ekranga unga berilgan struktura maydonini chiqaruvchi funksiyaga misol:
#include
struct Worker{
char fio[30];
int date, code;
double salary;
};
void print_worker(Worker); // funksiya e'loni
int main (){
Worker staff[100];
_ /* staff massivni shakllantirish */
for (int i = 0; i<100; i++)print_worker(staff[i]); // funksiyani chaqirish
return 0;
}
void print_worker(Worker w){ // funksiya ta'rifi
cout << w.fio <<‘ ‘<}
Funksiya ichida tavsiflangan barcha miqdorlar hamda uning parametrlari lokal deb hisoblanadi. Ularning amal qilish sohasi funksiyadan iborat, funksiyani chaqirishda ixtiyoriy blokka kirishdagi kabi stekda lokal avtomatik o'zgaruvchilarga xotira ajratiladi. Bundan tashqari, srekda funksiyani chaqirishdan oldin momentda prossessor registrlar ichidagilar va funksiyadan qaytish adresi saqlanadi, chunki undan chiqishda chaqiriluvchi funksiyani bajarilishini davom ettirish imkoniyati bo'lishi lozim.
Funksiyadan chiqishda stekning mos qismi tozalanadi, shuning uchun bir funksiyani chaqirishlari orasida lokal o’zgaruvchilar qiymatlari saqlanmaydi. Agar bundan qutilish talab etilsa, lokal o'zgaruvchilarni e'lon qilishda static modifikatordan foydalaniladi:
#include
void f(int a){
int m = 0;
cout << “n m p\n”;
while (a--){
static int n = 0;
int p = 0;
cout << n++ << ' ' << m++ << ' ' << p++ << '\n';
}
}
int main(){ f(3); f(2); return 0; }
n statik o'zgaruvchi ma'lumotlar segmentida joylashtiriladi va uning ta'rifida joylashgan operatorni birinchi bajarishda bir marta initsializatsiyalanadi. Avtomatik n o'zgaruvchi funksiyaga har bir kirishda initsializatsiyalanadi. Avtomatik p o'zgaruvchi sikl blokiga har bir kirishda initsializatsiyalanadi. Dastur ekranga quyidagicha chiqaradi:
n m p
0 0 0
1 1 0
2 2 0
n m p
3 0 0
4 1 0
Funksiyaning birgalikdagi ishida axborot almashinishi lozim. Buni global o'zgaruvchilar yordamida parametrlar orqali va funksiyalar orqali amalga oshirish mumkin.
Do'stlaringiz bilan baham: |