turi2>
);
Bu yerda funksiya parametrlarining kamida bittasi operator qayta yuklanayotgan sinf turida bo‘lishi kerak. Garchi operator funksiya qaytaradigan qiymat turiga hech qanday cheklov bo‘lmasa ham, u sinf turida yoki sinfga ko‘rsatkich bo‘ladi. Operator funksiyalarni yozishning bir nechta misollarini keltiramiz. Bu misollar operatorlarni qayta yuklashning to‘liq imko-niyatlarini ochib bermasa ham, uning muhim qirralarini ko‘rsatadi. Birinchi navbatda operator funksiyaning sinfning funksiya-a’zosi ko‘rinishida aniqlashni ko‘ramiz.
Quyidagi programmada Nuqta sinfi uchun qo‘shish va ayirish operatorlarini
qayta yuklash amalga oshirilgan.
class Nuqta
{
int x,y;
public:
Nuqta(){x=0; y=0;}
Nuqta(int _x,int _y){x=_x; y=_y;}
void Nuqta_Qiymati(int & _x,int & _y){_x=x; _y=y;}
Nuqta operator+(Nuqta& ob);
Nuqta operator-(Nuqta& ob);
};
Nuqta Nuqta::operator+(Nuqta& ob)
{
Nuqta OraliqOb;
OraliqOb.x=x+ob.x;
OraliqOb.y=y+ob.y;
return OraliqOb;
}
Nuqta Nuqta::operator-(Nuqta& ob)
{
Nuqta OraliqOb;
OraliqOb.x=x-ob.x;
OraliqOb.y=y-ob.y;
return OraliqOb;
}
void main()
{
int x,y;
Nuqta A(100,200), B(50,100),C;
C=A+B; // qayta yuklangan qo‘shish operatori amal qiladi
C.Nuqta_Qiymati(x,y);
Console.Write(" C=A+B: "<<"C.x="<olganda argument sifatida
obyektni o‘zini ham chaqirish mumkin, lekin funksiyadan chiqishda bu obyekt
destruktor yordamida yo‘qotiladi. Funksiya parametri sinf obyektga murojaat
ko‘rinishida bo‘lishining afzalligi shundaki, funksiya chaqirilganda unga obyekt
emas, balki obyektga ko‘rsatkich uzatiladi va sinf nusxasi uchun chaqiriladigan
destruktorni ishlatilmaydi. Operator funksiyalarning qaytaruvchi qiymati ayni shu
sinf turida va hol obyektlarni nisbatan murakkab ifodalarda qo‘llash imkonini beradi.
Masalan, quyidagi amallar programma uchun ruxsat etilgan til ko‘rsatmasi
hisoblanadi:
C=A+B-C;
Ikkinchi tomondan, quyidagi ifoda ham o‘rinli:
(A+B).Nuqta_Qiymati(x,y);
Bu ifodada qo‘shish operatoring operator funksiyasidagi vaqtincha (OraliqOb)
obyektning Nuqta_Qiymati() funksiyasi ishlatiladi.
Keyingi misol operator funksiya parametri sifatida sanab o‘tiladigan turdagi
berilgan kelgan holatini namoyon qiladi. Bu berilgan operatorning o‘ng tomonida
kelishiga e’tibor berish kerak.
class Nuqta
{
int x,y;
public:
Nuqta(){x=0; y=0;} 168
Nuqta(int _x,int _y){x=_x; y=_y;}
void Nuqta_Qiymati(int & _x,int & _y){_x=x; _y=y;}
Nuqta operator+(Nuqta& ob);
Nuqta operator+(int n);
};
Nuqta Nuqta::operator+(Nuqta& ob)
{
Nuqta OraliqOb;
OraliqOb.x=x+ob.x;
OraliqOb.y=y+ob.y;
return OraliqOb;
}
Nuqta Nuqta::operator+(int n)
{
Nuqta OraliqOb;
OraliqOb.x=x+n;
OraliqOb.y=y+n;
return OraliqOb;
}
void main()
{
int x,y;
Nuqta A(100,200), B(50,100),C;
C=A+B; // parametri sinf turidagi obyekt bo‘lgan
// qayta yuklangan qo‘shish operatori amal
qiladi
C.Nuqta_Qiymati(x,y);
Console.Write(" C=A+B: "<<"C.x="<kompilyator
C=30+A;
ko‘rsatmasini qabul qilmaydi.
Bu muammoni operator funksiyaning «ichki» imkoniyatlari bilan hal qilib
bo‘lmaydi. Muammoni do‘st operator funksiyalardan foydalanish orqali yechish
mumkin. Ma’lumki, do‘st funksiyalarga yashiringan this ko‘rsatkichi uzatilmaydi.
Shuning uchun binar operator funksiyasi ikkita argumentga ega bo‘lishi kerak -
birinchisi chap operand uchun, ikkinchisi o‘ng operand uchun.
class Nuqta
{
int x,y;
public:
Nuqta(){x=0; y=0;}
Nuqta(int _x,int _y){x=_x; y=_y;}
void Nuqta_Qiymati(int & _x,int & _y){_x=x; _y=y;}
friend class Nuqta operator+(Nuqta& ob1, Nuqta& ob2);
friend class Nuqta operator+(Nuqta& ob,int n);
friend class Nuqta operator+(int n, Nuqta& ob);
};
Nuqta operator+(Nuqta& ob1,Nuqta& ob2)
{
Nuqta OraliqOb;
OraliqOb.x=ob1.x+ob2.x;
OraliqOb.y=ob1.y+ob2.y;
return OraliqOb;
}
Nuqta operator+(Nuqta& ob,int n)
{
Nuqta OraliqOb;
OraliqOb.x=ob.x+n;
OraliqOb.y=ob.y+n;
return OraliqOb;
}
Nuqta operator+(int n, Nuqta& ob)
{
Nuqta OraliqOb;
OraliqOb.x=ob.x+n;
OraliqOb.y=ob.y+n;
return OraliqOb;
}
void main()
{ 170
int x,y;
Nuqta A(100,200),B(50,100),C;
C=A+B;
C.Nuqta_Qiymati(x,y);
Console.Write(" C=A+B: "<<"C.x="<qayta yuklash hisobiga
C=A+30;
C=30+A;
til ko‘rsatmalarini bajarish imkoniyati yuzaga keldi. Qiymat berish operatori ham binar operator hisoblanadi, lekin uni qayta yuklash bir qator o‘ziga xosliklarga ega: qiymat berish operatorining operator funksiyasi global ravishda e’lon qilinishi mumkin emas, ya’ni u faqat sinfning funksiya-a’zosi bo‘lishi kerak; qiymat berish operatorining operator funksiyasi hosilaviy sinfga vorislik bilan o‘tmaydi; kompilyator qiymat berish operatorining operator funksiyasi hosil qilishi mumkin, agar u sinfda aniqlanmagan bo‘lsa. Kompilyator tomonidan kelishuv bo‘yicha hosil qilingan qiymat berish operatori sinfning har bir statik bo‘lmagan a’zolariga qiymat berish amalini bajaradi. Lekin, agar sinfda ko‘rsatkichlar bo‘ladigan bo‘lsa, bunday qiymat berish operatori ishlamaydi.