1.3. unar operatorlarni yuklash
Qayd etish kerakki, qiymat berish operatori bajarilgandan keyin chap tomondagi operand o‘zgaradi, chunki unga yangi qiymat beriladi. Shuning uchun qiymat berish operatorining operator funksiyasi uni chaqirilgan obyektga ko‘rsatkichni qaytarishi shart. Buning uchun funksiya nooshkor ravishda sinf funksiyalariga birinchi parametr sifatida uzatiladigan this ko‘rsatkichini qaytarishi yetarli. O‘z navba-tida funksiyaning this ko‘rsatkichini qaytarishi quyidagi ko‘rinishdagi qiymat berish amallarini «tushunish» imkonini beradi:
nuqta1=nuqta2=nuqta3;
Quyidagi misol qiymat berish operatorini qayta yuklashni namoyon qiladi:
class Nuqta
{
int x,y; 171
public:
Nuqta(int _x,int _y){x=_x; y=_y;}
Nuqta(){x=0; y=0;}
Qiymat_xy(int & _x,int & _y){_x=x; _y=y;}
bool operator==(Nuqta ob);
Nuqta & operator=(Nuqta & ob);
};
bool Nuqta::operator==(Nuqta ob)
{ return (x==ob.x && y==ob.y);}
Nuqta & Nuqta::operator=(Nuqta & ob)
{
if (this==&ob) return *this;
x=ob.x;
y=ob.y;
return *this;
}
void main()
{
int a,b;
Nuqta nuqta1(10,20),nuqta2(20,25),nuqta3;
nuqta3=nuqta2;
if(nuqta2==nuqta3)
Console.Write("nuqta2 va nuqta3 o'zaro teng.\n";
else Console.Write("nuqta2 va nuqta3 o'zaro teng emas.\n";
nuqta3=nuqta2=nuqta1;
if(nuqta1==nuqta3)
Console.Write("nuqta1 va nuqta3 o'zaro teng.\n";
else Console.Write("nuqta1 va nuqta3 o'zaro teng emas.\n";
nuqta3.Qiymat_xy(a,b);
Console.Write("nuqta3.x="<
n1=-n1; //qayta yuklangan minus operatorini chaqirish
n1.Qiymat_xy(a,b);
Console.Write("n1.x=”<
}
Programma ishlashi natijasida ekranda
n1.x=-10 n1.y=20
n1.x=10 n1.y=-20
satrlari paydo bo‘ladi.
Xuddi shu natijalarga global operator funksiyalarni sinfning do‘st funksiyalari
ko‘rinishida e’lon qilish orqali erishish mumkin:
friend Nuqta operator+(Nuqta & ob);
friend Nuqta operator-(Nuqta & ob);
Bu funksiyalar aniqlanishi
friend Nuqta operator+(Nuqta & ob)
{
ob.x=+ob.x;
ob.y=+ob.y;
return ob;
}
friend Nuqta operator-(Nuqta & ob)
{
ob.x=-ob.x;
ob.y=-ob.y;
return ob;
}
Ushbu funksiyalarni chaqirish natijalari yuqoridagi funksiyalar bilan bir xil
bo‘ladi. Inkrement va dekrement operatorlari, ularning prefiks va postfiks ko‘rinishlari bo‘lishi hisobiga qayta yuklash nuqtai-nazaridan alohida kategoriyaga tushadi. Prefiks va postfiks ko‘rinish-larni farqlash uchun quyidagi qoidalarga amal qilinadi: prefiks ko‘rinishni qayta yuklash, odatdagi unar operatorni qayta yuklash bilan bir xil; postfiks ko‘rinish uchun operator funksiya qo‘shimcha int turidagi parametrga ega bo‘ladi. Amalda bu parametr ishlatilmaydi va funksiyani chaqirishda uning qiymati 0 bo‘ladi (zarurat bo‘lganda ishlatilishi mumkin). Bu parametrning vazifasi - kompilyatorga operatorning postfiks ko‘rinishi ishlatilayotganligini bildirishdir. Quyidagi misolda Nuqta sinfi uchun inkrement va dekrement operator-larini qayta yuklash ko‘rsatilgan:
class Nuqta
{
int x,y;
public:
Nuqta(int _x,int _y){x=_x; y=_y;}
Nuqta(){x=0; y=0;}
Qiymat_xy(int & _x,int & _y){_x=x; _y=y;}
Nuqta & operator++(); // prefiks inkrement uchun
Nuqta operator++(int); // postfiks inkrement uchun
Nuqta & operator––(); // prefiks dekrement uchun
Nuqta operator––(int); // postfiks dekrement uchun
};
Nuqta & Nuqta::operator++()
{
x++;
y++;
return *this;
}
Nuqta Nuqta::operator++(int)
{
Nuqta Oraliq=*this;
++*this;
return Oraliq;
}
Nuqta & Nuqta::operator--()
{
x--;
y--;
return *this;
}
Nuqta Nuqta::operator--(int)
{
Nuqta Oraliq=*this; 175
--*this;
return Oraliq;
}
void main()
{
int a,b;
Nuqta n1(-10,20);n2(15,25),n3;
++n1; //prefiks inkrement operatorini chaqirish
n1.Qiymat_xy(a,b);
Console.Write("(++n1).x=”<
n1++; //postfiks inkrement operatorini chaqirish
n1.Qiymat_xy(a,b);
Console.Write("(n1++).x=”<
n3=--n2; //prefiks dekrement operatorini chaqirish
n3.Qiymat_xy(a,b);
Console.Write("n3=--n2; => n3.x="<
n1.Qiymat_xy(a,b);
Console.Write("n1.x="<
n1++; //postfiks inkrement operatorini chaqirish
n1.Qiymat_xy(a,b);
Console.Write("(n1++).x=”<
n3=--n2; //prefiks dekrement operatorini chaqirish
n3.Qiymat_xy(a,b);
Console.Write("n3=--n2; => n3.x="<
n1.Qiymat_xy(a,b);
Console.Write("n1.x="<Download 213,04 Kb. Do'stlaringiz bilan baham: |