Tashqi funksiyalar bilan qayta yuklash amallari. Tashqi mustaqil funksiya sifatida qayta yuklangan binar operatsiya prototipi quyidagicha koʻrinishga ega boʻladi:
tip operator@ (parametr_1, parametr_2);
Binar amalni har xil turdagi parametrlar bilan almashtirishni ta’minlash uchun, qoida tariqasida, ikkita funksiya amalni realizatsiya qilish kerak:
tip operator@ (parametr_1, parametr_2);
tip operator@ (parametr_2, parametr_1);
Parametrlardan kamida bittasi yangi turda boʻlishi kerak. Parametrlar har qanday toʻgʻri yoʻl bilan uzatilishi mumkin. Amal ikki yoʻl bilan amalga oshiriladi:
– infiks forma parametr_1 @ parametr_2;
– funksional shakl operator @ (parametr_1, parametr_2).
Mustaqil tashqi funksiya tomonidan qayta yuklangan unar amal prototipi faqat parametrlar sonida farq qiladi:
tip operator@ (parametr);
Parametr yangi turda boʻlishi kerak. Quyidagi kabi qayta yuklangan amalga murojaat qilishingiz kerak:
- infiks formasi @parametr;
- funksional shakl operator@(parametr).
Inkrement ++ va dekrement -- amallari ikkita shaklga ega: prefiks va postfiks. Amalning postfiks shaklining ta’rifida int tipidagi qoʻshimcha parametr e'lon qilinishi kerak.
tip operator@ (parametr, int);
Ushbu parametr funksiyaning tanasida ishlatilmasligi kerak. Bunday amalga murojaat qilishning infiks shakli – parametr@; funksional shakli uchun, masalan, ikkinchi fiksirlangan argumentni koʻrsatishingiz kerak:
operator@(parametr, 0);
Quyidagi misol(1-listing) enum turi uchun operatorni qayta yuklashni koʻrsatadi.
1-listing #include using namespace std;
enum Week { du = 1, se, chor, pay, ju, shan, yak = 0};
Week operator+ (const Week &m, const int &b)
{
Week t = Week (b+m);
return (t = Week(t%7));
}
//Qoʻshimcha kommutativlik uchun ikkinchi funskiya
Week operator+(const &b, const Week &m)
{
return m+b;
}
Week operator++(Week &m)
{
return (m=Week(m+1));
}
Week operator++(Week &m, int)
{
Week t = m;
m = Week(m+1);
return t;
}
void chop_etish(const Week &d)
{
string Days[7] = {"Yakshanba", "Dushanba", "Seshanba",
"Chorshanba", "Payshanba", "Juma", "Shanba" };
cout<};
int main()
{
Week m = shan;
chop_etish(m+1);
chop_etish(2+m);
chop_etish(operator+(m,1));
chop_etish(operator+(2,m));
m++;
chop_etish(m);
chop_etish(++m);
chop_etish(operator++(m));
chop_etish(operator++(m,0));
chop_etish(m);
return 0;
}
2. Funksiya shablonlari va ulardan foydalanish
C++ tilida funksiya shablonlarini yaratish murakkab jarayon emas. max1 funksiyasining butun son variantini yana bir bor koʻrib chiqaylik:
int max(int a, int b)
{
return (a > b) ? a : b;
}
Bu holatda ma’lumotlar turi uch marta aniqlandi: a, b parametrlarida va funksiyaning qaytish turida. Bu funksiya uchun shablon yaratishda int turini funksiya shablon parametri turiga almashtirish kerak. Bu holda faqat bitta ma’lumot turi (int) ishlatilganligi sababli, shablon parametrining faqat bitta turini koʻrsatish kerak.
Bu turni istagancha nomlash mumkin (faqat zaxiralangan kalit soʻz boʻlmasligi kerak). C++ tilida shablon parametrlarining turlarini bosh T harfi bilan nomlash odat tusiga kirgan (“Type” soʻzidan qisqartirilgan).
Quyida qayta ishlangan max() funksiyasi:
T max1(T a, T b)
{
return (a > b) ? a : b;
}
Lekin bu hammasi emas. Dastur kompilyatsiyadan oʻtmaydi, chunki kompilyator T nima ekanligini bilmaydi.
Buning ishlashi uchun kompilyatorga ikkita narsani koʻrsatish lozim:
Funksiya shablonini aniqlash;
T funksiya shablon parametri turi ekanligini koʻrsatish.
Shablon e‘lonini (aniqrogʻi shablon parametrlari e‘lonini) bajarish orqali buni bitta kod qatorida qilish mumkin (3-listing)