Tipga keltirish amalini qayta yuklash
Sinf obyektini boshqa tipga almashtirishni bajargan funksiya-amallarni aniqlash mumkin. Format:
operator yangi_tipdagi_nom ();
Qaytaruvchi qiymat tipi va parametrlarni ko’rsatish talab qilinmaydi. Tipni almashtirishning virtual funksiyalarini aniqlash mumkin.
Misol:
monstr::operator int(){return health;}
…
monstr Vasia; cout << int(Vasia);
Funksiya chaqirish amalini qayta yuklash
Funksiyani chaqirish amali aniqlangan oshkor funksional sinf deb ataladi. Bunday sinfdan boshqa maydonlar va usullar bo’lishi talab etilmaydi:
class if_greater{
public:
int operator () (int a, int b) const {
return a > b;
}
};
Bunday sinfdan foydalanish o’ziga xos sintaksisga ega. Misol qaraymiz:
if_greater х;
cout << х(1, 5) << endl; // Natija - 0
cout << if_greater() (5, 1) << endl; // Natija - 1
if_greater sinfida ikki parametrli funksiyani chaqirish amali aniqlangani uchun x(1, 5) ifodasi mumkin (uni x.operater()(5, 1) ko’rinishda ham yozish mumkin). Misoldan ko’rinadiki, funksional sinf obyekti, agar u funksiya bo’lgandagi kabi foydalaniladi.
Ikkinchi chiqarish operatorida if_greater() ifoda if_greater sinfning jimlik bo’yicha konstruktorini chaqirish uchun qo’llaniladi. Bu ifodaning bajarish natijasi if_greater sinfi obyekti hisoblanadi. Keyin oldingi holdagi kabi bu obyekt uchun doiraviy qavslarda yozilgan ikki argumentli funksiya chaqiriladi.
( ) operatsiyani faqat sinf usuli kabi aniqlash mumkin.Turli sondagi argumentni qayta yuklangan chaqirish funksiyasi amallarini aniqlash mumkin. Funksional obyektlar C++ standart kutubxonasida keng qo’llaniladi.
Indekslashtirish amalini qayta yuklash
[ ] indekslashtirish amali odatda sinf tipi indekslash ma’noga ega qiymatlar to’plamidan iborat bo’lganda qayta yuklanadi. Indekslash amali to’plamdagi elementga murojaatni qaytarishi lozim. Buni butun sonlar massivini saqlash va ular bilan xavfsiz ishlash uchun mo’ljallangan Vect sinfi misolida ko’rsatamiz:
#inclucle
#include
class Vect{
public:
explicit Vect(int n = 10);
Vect(const int a[], int n); // massiv bilan initsializatsiyalash
~Vect() { delete [] p; }
int& operator [] (int i);
void Print()
…
private:
int* p;
int size;
};
Vect::Vect(int n) : size(n){
p = new int[size];
}
Vect::Vect(const int a[], int n) : size(n){
p = new int[size];
for (int i = 0; i < size; i++) p[i] = a[i];
}
// Indekslash amalini qayta yuklash:
int& Vect::operator [] (int i){
if (i < 0 || i >= size){
cout << “Noto’g’ri indeks (i = ” << i << “)” << endl;
cout << “Dasturning tugashi” << endl;
exit(0):
}
return p[i];
}
void Vect::Print(){
for (int i = 0; i < size; i++)
cout << p[i] << " ";
cout << endl;
}
int ma1n(){
int аrr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Vect а(аrr, 10);
a.Print();
cout << a[5] << endl;
cout << a[12] << endl;
return 0;
}
Dastur ishi natijasi:
1 2 3 4 5 6 7 8 9 10
6
Noto’g’ri indeks (1 = 12)
Dasturning tugashi
Indekslash qayta yuklangan amali butun argument oladi va uning qiymati massiv diapazoni chegaralariga tegishli bo’lishini tekshiradi. Agar ha bo’lsa, u holda element manzili qaytariladi, bu indekslash standart operatsiyasi semantikasiga mos keladi.
Bu misolda jimlik bo’yicha parametrli konstruktor explicit kabi e’lon qilingan, u oshkora chaqirilmaydigan tipni almashtirish konstruktori hisoblanmasligi uchun shunday qilingan. explicit tayanch so’zi bu konstruktor faqat oshkora chaqirilishini ko’rsatadi.
[ ] amalni faqat sinf usuli kabi aniqlash mumkin.
Do'stlaringiz bilan baham: |