C++ operatorlarni qayta yuklash
C++ da biz operatorlar class va structures kabi foydalanuvchi tomonidan belgilangan turlar uchun qanday harakat qilishini aniqlashimiz mumkin. Masalan,
+ operatori int tipidagi qiymatlar bilan foydalanilganda ularning summasini qaytaradi. Biroq, foydalanuvchi tomonidan belgilangan turdagi ob'ektlar bilan foydalanilganda, bu xato.
Bunday holda, biz + operatorining ob'ektlar bilan ishlash xatti-harakatlarini ham aniqlashimiz mumkin.
Ob'ektlar va tuzilma o'zgaruvchilari bilan ishlash uchun operatorlarni aniqlashning ushbu kontseptsiyasi operatorning haddan tashqari yuklanishi deb nomlanadi.
Operatorni haddan tashqari yuklash sintaksisi function sintaksisiga o'xshash, operator kalit so'zidan keyin operator belgisi qo'shiladi.
returnType operator symbol (arguments) {
... .. ...
}
Bu yerga,
-returnType - funksiyaning qaytish turi
operator - a special keyword
-symbol - biz ortiqcha yuklamoqchi bo'lgan operator ( + , < , - , ++ va boshqalar)Quyida Complex sinfi uchun + operatorining haddan tashqari yuklanishini ko'rsatadigan dastur mavjud.
// Ikkilik operator + ni ortiqcha yuklash uchun C++ dasturi
// Ushbu dastur ikkita murakkab sonni qo'shadi
#include <iostream>
using namespace std;
class Complex {
private:
float real;
float img;
public:
// real va img ni 0 ga ishga tushirish uchun konstruktor
Complex() : real(0), img(0) {}
Complex(float real, float img) : real(real), img(img){}
// + operatorini ortiqcha yuklang
friend Complex operator + (const Complex& obj1, const Complex& obj2) {
Complex temp;
temp.real = obj1.real + obj2.real;
temp.img = obj1.img + obj2.img;
return temp;
}
void display() {
if (img < 0)
cout << "Output Complex number: " << real << img << "i";
else
cout << "Output Complex number: " << real << "+" << img << "i";
}
};
int main() {
Complex c1(1.0f, 2.0f);
Complex c2(1.0f, 3.0f);
// haddan tashqari yuklangan + operatorini chaqiradi
Complex result = c1 + c2;
result.display();
return 0;
}
Chiqish
Output Complex number: 2+5i
Bu erda biz birinchi navbatda Complex qaytish turi bilan do'st funksiyasini yaratdik.
friend Complex operator + () {
...
}
+ dan keyin operator kalit so'zi + operatorini ortiqcha yuklayotganimizni bildiradi.
Funksiya ikkita argumentni oladi:
friend Complex operator + (const Complex& obj1, const Complex& obj2) {...}
Bu yerga,
-Complex& biz mos yozuvlar bo'yicha ob'ektlarni uzatayotganimizni bildiradi va obj1 va obj2 Complex ob'ektlariga havolalardir. Bu samarali yondashuv, chunki u keraksiz nusxa ko'chirishdan qochadi, ayniqsa katta ob'ektlar uchun. Qo'shimcha ma'lumot olish uchun C++ References ga tashrif buyuring.
-const havola qilingan ob'ektlar doimiy ekanligini bildiradi, ya'ni biz obj1 va obj2 ni funksiya ichida o'zgartira olmaymiz.
Funksiya ichida biz qo'shish natijasini saqlash uchun temp bo'lgan boshqa Complex ob'ektini yaratdik.
Complex temp;
Keyin ikkita ob'ektning haqiqiy qismlarini qo'shamiz va uni vaqtinchalik ob'ektning real atributiga saqlaymiz.
temp.real = obj1.real + obj2.real;
Xuddi shunday, biz ikkita ob'ektning xayoliy qismlarini qo'shamiz va ularni vaqtinchalik ob'ektning img atributiga saqlaymiz.
temp.img = obj1.img + obj2.img;
Nihoyat, funksiyadan temp ob'ektini qaytaramiz.
return temp;
Shuningdek, biz operatorlarni do'st funksiyasi o'rniga a'zo funksiyasidan foydalanib ortiqcha yuklashimiz mumkin. Masalan, class Complex{ ….. public: Complex operator + (const Complex& obj){ Complex temp; temp.real = real + obj.real; temp.img = img + obj.img; return temp; } ……. }; Bu holda operator birinchi operand tomonidan chaqiriladi. Ya'ni, Complex c3 = c1 + c2; qatori c1.operator+(c2); ga tarjima qilinadi Bu erda operator funksiyasiga argumentlar soni bittaga kamayadi, chunki birinchi argument funksiyani chaqirish uchun ishlatiladi. Ushbu yondashuv bilan bog'liq muammo shundaki, birinchi operand har doim ham foydalanuvchi tomonidan belgilangan turdagi ob'ekt bo'lmaydi. Masalan: c2 = 1 + c1; Shuning uchun operator funksiyalarini a'zo bo'lmagan funksiya sifatida haddan tashqari yuklash tavsiya etiladi, odatda do'st funksiyasi sifatida aniqlanadi.
Quyida Count sinfi uchun ++ operatorining haddan tashqari yuklanishini ko'rsatadigan dastur mavjud.
// Prefiks operatori sifatida foydalanilganda ortiqcha yuk ++
#include <iostream>
using namespace std;
class Count {
private:
int value;
public:
// 5 gacha hisoblashni ishga tushirish uchun konstruktor
Count() : value(5) {}
// prefiks sifatida ishlatilganda ortiqcha yuk ++
void operator ++ () {
++value;
}
void display() {
cout << "Count: " << value << endl;
}
};
int main() {
Count count1;
// "void operator ++ ()" funksiyasini chaqiring
++count1;
count1.display();
return 0;
}
Chiqish
Count: 6
Bu erda, biz ++count1; dan foydalanganda, void operator ++ () chaqiriladi. Bu count1 ob'ektining qiymat atributini 1 ga oshiradi.
[!NOTE] Operatorlarni haddan tashqari yuklaganimizda, biz undan o'zimizga yoqadigan tarzda ishlash uchun foydalanishimiz mumkin. Misol uchun, biz qiymatni 100 ga oshirish uchun ++ dan foydalanishimiz mumkin edi. Biroq bu bizning kodimizni chalkash va tushunishni qiyinlashtiradi. Dasturchi sifatida bizning vazifamiz operatorning haddan tashqari yuklanishidan to'g'ri va izchil va intuitiv tarzda foydalanishdir.
++ operatorini Postfix operatori sifatida ortiqcha yuklash uchun biz int tipidagi bitta argumentga ega operator++() aʼzo funksiyasini eʼlon qilamiz. // Postfiks operatori sifatida foydalanilganda ortiqcha yuk ++ #include <iostream> nomlar maydoni std yordamida; class Count { xususiy: int qiymati; public: // hisoblashni 5 ga ishga tushirish uchun konstruktor Count() : value(5) {} // ortiqcha yuk ++ postfix void operatori sifatida ishlatiladi ++ (int) { value++; } void display() { cout << "Hisoblash: " << qiymat << endl; } }; int main() { Count count1; // "void operator ++ (int)" funksiyasini chaqiring count1++; count1.display(); count1.display(); qaytish 0; } Chiqish soni: 6 Hisob: 7 Bu yerda count1++; dan foydalanganda void operator ++ (int) chaqiriladi. Bu count1 ob'ektining qiymat atributini 1 ga oshiradi. Eslatma: int argumenti operator postfiks operatori sifatida ishlatilishini bildirish uchungina mo'ljallangan.
= va & operatorlari allaqachon C++ da haddan tashqari yuklangan. Masalan,biz bir xil sinf ob'ektlarini nusxalash uchun to'g'ridan-to'g'ri = operatoridan foydalanishimiz mumkin. Bu erda biz operator funksiyasini yaratishimiz shart emas.
Operatorning ortiqcha yuklanishidan foydalangan holda operatorlarning ustuvorligi va assotsiativligini o'zgartira olmaymiz.
Biz C++ da quyidagi operatorlarni ortiqcha yuklay olmaymiz:
:: (scope resolution). (member selection).* (member selection through pointer to function)?: (ternary operator)sizeof operatortypeid Operatorint , float va boshqalar kabi asosiy maʼlumotlar turlari uchun operatorlarni ortiqcha yuklay olmaymiz.Shuningdek o'qing:
Increment ++ and Decrement -- Operators