80 / 90

C++ Operator Overloading

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.

C++ operatorini haddan tashqari yuklash sintaksisi

Operatorni haddan tashqari yuklash sintaksisi function sintaksisiga o'xshash, operator kalit so'zidan keyin operator belgisi qo'shiladi.

example.cpp
returnType operator symbol (arguments) {
    ... .. ...
}

Bu yerga,

-returnType - funksiyaning qaytish turi

  • operator - a special keyword -symbol - biz ortiqcha yuklamoqchi bo'lgan operator ( + , < , - , ++ va boshqalar)

Ikkilik + Operatorni ortiqcha yuklash

Quyida Complex sinfi uchun + operatorining haddan tashqari yuklanishini ko'rsatadigan dastur mavjud.

example.cpp
// 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

kod
Output Complex number: 2+5i

Bu erda biz birinchi navbatda Complex qaytish turi bilan do'st funksiyasini yaratdik.

example.cpp
friend Complex operator + () {
    ...
}

+ dan keyin operator kalit so'zi + operatorini ortiqcha yuklayotganimizni bildiradi.

Funksiya ikkita argumentni oladi:

example.cpp
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.

example.cpp
Complex temp;

Keyin ikkita ob'ektning haqiqiy qismlarini qo'shamiz va uni vaqtinchalik ob'ektning real atributiga saqlaymiz.

example.cpp
temp.real = obj1.real + obj2.real;

Xuddi shunday, biz ikkita ob'ektning xayoliy qismlarini qo'shamiz va ularni vaqtinchalik ob'ektning img atributiga saqlaymiz.

example.cpp
temp.img = obj1.img + obj2.img;

Nihoyat, funksiyadan temp ob'ektini qaytaramiz.

example.cpp
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.

Prefiks operatori sifatida ++ haddan tashqari yuklash

Quyida Count sinfi uchun ++ operatorining haddan tashqari yuklanishini ko'rsatadigan dastur mavjud.

example.cpp
// 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

kod
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.

C++ operatorlarni qayta yuklash (Operator Overloading)da eslash kerak bo'lgan narsalar

  1. Odatiy bo'lib, = 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.

  1. Operatorning ortiqcha yuklanishidan foydalangan holda operatorlarning ustuvorligi va assotsiativligini o'zgartira olmaymiz.

  2. Biz C++ da quyidagi operatorlarni ortiqcha yuklay olmaymiz:

  • :: (scope resolution)
  • . (member selection)
  • .* (member selection through pointer to function)
  • ?: (ternary operator)
  • sizeof operator
  • typeid Operator
  1. Biz int , float va boshqalar kabi asosiy maʼlumotlar turlari uchun operatorlarni ortiqcha yuklay olmaymiz.

Shuningdek o'qing: